*******私信博主请加V:FPGA_GO*******
///
1,FPGA_Verilog基础篇:Verilog发展进程-CSDN博客
2,FPGA_Verilog基础篇:理解Verilog的四值逻辑-CSDN博客
3,FPGA_Verilog基础篇:Verilog中数值的表示-CSDN博客
4,FPGA_Verilog基础篇:信号声明类型-CSDN博客
5,FPGA_Verilog基础篇:模块的端口声明-CSDN博客
6,FPGA_Verilog基础篇:verilog语言的操作符-CSDN博客
7,FPGA_Verilog基础篇:verilog基本逻辑运算-CSDN博客
8,FPGA_Verilog基础篇:verilog关系操作的逻辑运算实现-CSDN博客
9,FPGA_Verilog基础篇:veriolg算术运算-CSDN博客
10,FPGA_Verilog基础篇:verilog移位操作-CSDN博客
11,FPGA_Verilog基础篇:关系操作符简介-CSDN博客
12,FPGA_Verilog基础篇:拼接运算符简介-CSDN博客
13,FPGA_Verilog基础篇:verilog数值的位宽扩展规则-CSDN博客
14,FPGA_Verilog基础篇:verilog移位与拼接实现-CSDN博客
15,FPGA_Verilog基础篇:verilog双向inout接口表示_fpga inout端口-CSDN博客
16,FPGA_Verilog基础篇:verilog之锁存器和触发器-CSDN博客
17,FPGA_Verilog基础篇:verilog之for循环-CSDN博客
18,FPGA_Verilog基础篇:verilog之函数用法-CSDN博客
19,FPGA_Verilog基础篇:verilog之任务用法-CSDN博客
20,FPGA_Verilog基础篇:verilog之任务与函数用法比较-CSDN博客
21,FPGA_Verilog基础篇:verilog之宏define介绍-CSDN博客
22,FPGA_Verilog基础篇:verilog之条件编译指令介绍-CSDN博客
23,FPGA_Verilog基础篇:verilog之参数parameter介绍-CSDN博客
24,FPGA_Verilog基础篇:verilog之本地参数localparam-CSDN博客
25,FPGA_Verilog基础篇:verilog之generate生成块-CSDN博客
26,FPGA_Verilog基础篇:verilog之常数规则-CSDN博客
27,FPGA_Verilog基础篇:verilog中整数运算的位宽和符号规则-CSDN博客
28,FPGA_Verilog基础篇:verilog中的字符串表示-CSDN博客
29,FPGA_Verilog基础篇:verilog中带整数的算术表达式分析-CSDN博客
30(结束篇),FPGA_Verilog基础篇:verilog中的数值运算规则总结-CSDN博客
///
宏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取消这个宏定义。由于宏定义对后续读入的文件保持有效,所以通常要求按一定的顺序编译文件。
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起学习、一起进步吧~