概述
注:学习、交流就在博主的个人weixin公众号 “FPGA动力联盟” 留言或直接+博主weixin “fpga_start” 私信~
宏define提供用一个相对简单的文字来表示一大段真正有意义的文字作用。换句话说,就是综合软件见到定义的宏,就用这个宏代表的文字替代这个宏的位置,这就是一个文字替代的工作。之后,综合软件再按照替代之后的代码来综合出电路。
简单而言,宏定义就是起到一个速记员的作用。它不会使代码优化,但会使得代码的规模变小。
宏定义的格式是:
'define macro_name(formal_argu_list) macro_text
其中:
“'define”是宏定义的标志,告诉综合软件这是一个宏定义。请注意有开头符号“'”。
“macro_name”是代码设计人员给这个宏定义起的名字,只要符合verilog的起名规则即可。
“macro_text”是宏定义被综合软件重新替代的内容。
“formal_argu_list”是宏定义可能的输入参数,里面可以有多个输入。在综合软件处理宏时,这些变量可以取代“macro_text”里对应的内容。当不需要参数时,可以省略这一项。
定义宏语句的最后是没有分号“;”的,这点我们要特别注意。如果不小心加了分号,那么这个分号会被综合软件视为“macro_text”的一部分参与替代工作。
宏定义在代码里被调用的格式是:
'macro_name(formal_argu_list)
注意前面也有符号“'”。
例子1:利用宏定义变量的位宽
'define BIT_WIDTH 8
……
reg['BIT_WIDTH-1:0] bit_variable;//reg [7:0] bit_variable
例子2:利用宏定义仿真时延
'define DELAY(delay_time) #(delay_time)
……
assign 'DELAY(10) a=b; //#(10) a= b
下面总结一下define用法的细节:
1,宏名建议用大写字母表示,以与变量名区分;
2,'define定义既可以在模块定义内部,也可以出现在模块定义外部。其定义的有效范围为定义命令之后到本文件结束。通常,'define命令写在模块定义的外面,作为程序的一部分,在此代码内有效;
3,在引用已定义的宏名时,必须在宏名前面加上符号“'”,表示该名字是一个经过宏定义的名字;
4,使用宏名替代一个字符串,可以减少代码中重复书写某些字符串的工作量。当代码需要改变某一个变量时,可以只改变'define命令行,一改全改,提高代码的可移植和可读性;
5,宏定义只是用宏名替代一个字符串,也就是简单的置换,不做语法检查,不管含义是否正确,综合器照样代入。只有在编译已被宏替代后的源代码时才报错;
6,宏定义不是verilog语句,不必在行末加分号;
7,进行宏定义时,可以引用已定义的宏名;
8,宏名和宏内容必须在同一行中进行声明。如果宏内容中包括注释行,注释行不会被置换;
9,只对那些确实需要全局定义的而且不会被其它设计更改的标识符才使用宏定义;
10,尽量不要对那些只在模块内使用的常量使用宏定义,应该用localparam定义;
11,如有可能,就把所有的宏定义放到一个宏定义文件(例如global_define.h),而且在编译时要先用 ’include ” global_define.h”读这个文件,这样保证了在需要这些宏定义的时候,它们就已经存在;
12,可以使用c语言中宏定义的技巧(打开stdio.h看看)来编写verilog宏定义文件,使得宏定义只被定义一次,不会出现重复定义的情况,即使这个文件被多个文件’include,例如:
'ifndef _abcnco
'define _abcnco 8
……
'endif
另外还有非常重要一点:组成宏内容的字符串不能被以下语句记号隔离:注释行、数字、字符串、确认符、关键字、双目和三目运算符。比如下面这个例子3:
例子3:宏定义被错误隔离
'define WRONG_NUM 8
……
assign a = 'WRONG_NUM4;
//错误!综合器不会认为是84,会认为WRONG_NUM4是一个宏变量!
最后再强调一点:宏定义的作用范围由宏定义开始,对后续读入的文件始终保持有效,直到另一个宏定义改变这个宏定义的值,或者使用’undef取消这个宏定义。由于宏定义对后续读入的文件保持有效,所以通常要求按一定的顺序编译文件。
参考文献:
1,verilog传奇——从电路出发的HDL代码设计
2,verilog编程艺术
最后
以上就是细腻帆布鞋为你收集整理的21,verilog之宏define介绍的全部内容,希望文章能够帮你解决21,verilog之宏define介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复