写在前面
正文
看稍微复杂一点的IP Core以及模块等 ,都会遇到大量的编译预处理语句,它和参数定义语句通常都是为了模块复用以及增强代码可读性等等。
`define 与localparam和parameter最大的区别就是它可以跨文件传递参数;parameter只能在模块间传递参数;而localparam只能在其所在的module中起作用,不能参与参数传递。
诸如以`开头的编译预处理语句,
如 `define等(你敢信,这个符号,我用markdown编辑不了,因为他也是markdown的一个语法符号! )
它不是一般的语句,Verilog编译器会对其进行预处理,然后预处理的结果和源程序一起进行通常的编译处理。其作用范围从定义开始到文件结束。
下面谈几个常用的。
宏定义
格式:
`define 宏名 宏内容
如`define signal string
它的作用就是指定标识符signal替代字符串string。
有几点注意:
- 在引用已定义的宏名时,必须在宏名前面加上符号`,表示该名字是一个经过宏定义的名字。
- 宏定义是用一个宏名代替一个字符串,也就是做简单的置换,不做语法检查。预处理时照样带入,不论含义正确与否。只有编译已被宏展开后的源程序时才检查语法。
- 宏定义不是Verilog语句,定义末尾一定不要加上分号,否则连带分号一起带入替换。
- 宏定义后可以进行注释,注释语句不会被认为是宏内容。
例子:
// module name
`define CNT_MODULE_NAME vcnt
// counter type = [BINARY, GRAY, LFSR]
//`define CNT_TYPE_BINARY
`define CNT_TYPE_GRAY
//`define CNT_TYPE_LFSR
// q as output
`define CNT_Q
// for gray type counter optional binary output
`define CN