①编译预处理是Verilog编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理。编译预处理是可以综合的。
②在Verilog语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其他的不同的编译程序指令。
③常用的编译预处理语句有:`define、`undef ; `ifdef、`elsif 、`else、`endif ; `include ; `timescale。 (1)`define,`undef
格式:`define 宏的名称 宏的正文
①宏定义的名称可以是大写,也可以是小写,但是主要不要和变量名重复,此外宏定义的使用要注意带上`。
②和所有的编译器伪指令一样,宏定义在超过单个文件边界时仍然有效(对工程中的其他源文件),除非被后面的`define或者`undef伪指令覆盖,否则`define不受范围的限制。
③当用变量定义宏时,变量可以在宏正文中使用,并且在使用宏时可以用实际的变量表达式代替。
④通过用反斜杠\转移中间的换行符,宏定义可以跨越几行,新的行是宏正文的一部分。
⑤宏定义的行末不需要添加分号或者逗号表示结束。
⑥宏正文不能分离的语言记号包括注释、数字、字符串、保留的关键字、运算符。
⑦编译器伪指令不允许作为宏的名字,此外红的正文可以是一个表达式,并不仅英语变量名的替换。
⑧`define和parameter的区别: 区别点 | `define | parameter | 作用域 | ①`define从编译器读到这条指令开始到编译结束都有效(除非遇到上面的提到的情况),可以应用于整个工程。 ②`define可以写在代码的任何位置。 | ①parameter作用于声明的当前文件,如果要让它作用与整个项目,可以将这些声明单独列在一个文件中,然后用`include进行包含。 ②parameter必须放在应用之前,也就是你要用到某个parameter参数了,你必须先parameter它。 | 传递功能 | `define不能实现参数传递,但是不局限与定义变量,还可以定义 | Parameter可以用作模块例化时的参数传递,实现参数化调用,但是仅局限于定义变量,而不能定义表达式。 |
(2)条件编译命令`if语句
①条件编译指令包括`ifdef 、`else 、`endif,其中`ifdef 、`endif必不可少,`else可选,且条件编译语句可以放在程序的任何地方调用。
②举例: `ifdef AAAA
Parameter X1 = 1;
`elsif BBBB
Parameter X2 = 1;
`elsif CCCC
Parameter X3 = 1;
`else
Parameter X4 = 1;
`endif 意思是:如果用`define 定义的ABCD,那么就会执行第一个模块(Parameter X1 = 1);否则执行第二个模块( Parameter X2 = 1)。 (3)文件包含`include语句
①当某个模块需要调用某一个文件时,但是这个文件不在当前目录下,那么就需要使用`include语句进行包含,这样调用才不会出现错误。如 `include “../../xxxx.v”。
②一个`include指令只能指定一个被包含的文件。如果要完成N个文件的包含,需要N个`include指令。
③可以将多个`include指令写在同一行,在`include命令行只能出现空格和注释 。 ④如果文件A同时包含了文件B和C,那么文件C可以直接利用B的内容,而不需要在对B文件进行包括,同理,B也可以直接利用C的内容。 (4)时间尺度`timescale语句
①`timescale用于定义延时的单位和延时的精度,如`timescale 1ns/100ps那么时间单位就是1ns,精度就是100ps。
②时间单位,表示了仿真时测量的单位,比如延时1,1ns;精度则表示仿真器只识别的范围,比如精度是100ps,那么如果你1.3ns,编译器是识别,但是如果写1.32,那么由于精度达不到那么细,所以0.02被四舍五入掉。
③`timescale影响着全部模块,知道遇到另外的`timescale。
|