宏定义在C语言程序中的使用司空见惯,好处是可以提高代码的可读性和可移植性。
而在verilog中,也支持这个语法,在很多开源代码中也都能看到 `define 的身影。
但是它的使用和C语言不完全一样,很多时候需要非常小心和谨慎。
其中最可能让设计者犯错的就是它的位宽问题。
`define:用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:
`define 标识符(宏名)字符串(宏内容)
如:`define signal string,它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把代码中在该命令以后所有的signal都替换成string。这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串的过程称为“宏展开”。define是宏定义命令。
例如:
`define SIZE 8'h4b
在使用的时候,不能对宏定义的标识符进行位操作,如下;
Mosi <= `SIZE[7 - cnt[4:2]];
上述表达是语法所不允许的,
前面说了,宏定义的本质是:用一个指定的标识符(即名字)来代表一个字符串,
即是说,虽然我们看到的是数字 8'h4b,但在文件中是被认为一个字符串的,
故无法进行取出某一位的操作