【Verilog-19.3】define和undef的用法

19.3 `define and `undef

提供了文本宏替换功能,可以使用有意义的名称来表示常用的文本片段。例如,在整个描述中重复使用一个常数的情况下,文本宏是有用的,如果常数的值需要改变,因为它只需要更改源描述中的一个位置。
文本宏工具不受编译器指令`resetall的影响。

19.3.1 `define

指令define为文本替换创建了一个宏。这个指令可以在模块定义的内部和外部使用。一个文本宏定义以后,通过使用(`)字符,后面跟着宏的名字,它可以在源代码描述中使用。编译器应该用宏的文本替换字符串`text_macro_name和它后面的实际任何参数。所有的编译指令都应该被认为是预定义的宏名;将编译器指令重定义为宏名是非法的。
文本宏可以用参数定义。这允许为每次使用分别定制宏。
文本宏定义的语法见语法19-2。
【Verilog-19.3】define和undef的用法_第1张图片
宏文本可以是与文本宏名在同一行指定的任意文本。如果需要多行来指定文本,换行符必须在前加反斜杠(\)。第一个不带反斜杠的换行符将结束宏文本。在扩展宏中,前面有反斜杠的换行符将被替换为换行符(但前面没有反斜杠字符)。
当形式化参数被用来定义文本宏时,形式化参数的范围应该扩展到宏文本的末尾。在宏文本中,形式参数可以像标识符一样使用。
如果使用了形式参数,则形式参数名称的列表应括在宏名称后面的括号中。形式参数名应该是simple_identifiers,由逗号和可选的空格分隔。左括号紧跟文本宏名,中间没有空格。
如果文本中包含了单行注释(即用字符//指定的注释),那么该注释将不会成为替换文本的一部分。宏文本可以为空,在这种情况下,文本宏被定义为空,并且在使用宏时不替换任何文本。
使用文本宏的语法见语法19-3。
【Verilog-19.3】define和undef的用法_第2张图片
对于没有参数的宏,文本将替换每次出现的`text_macro_name。但是,具有一个或多个参数的文本宏应该通过将每个正式参数替换为在宏用法中用作实际参数的表达式来扩展。
要使用带有参数定义的宏,文本宏的名称后面应该跟一个包含实际参数的列表,用逗号分隔。文本宏名和左括号之间允许有空白。实际参数的数量应与形式参数的数量相匹配。
一旦定义了文本宏名,它就可以在源描述的任何地方使用;也就是说,没有范围限制。文本宏可以交互地定义和使用。
为宏文本指定的文本不应被拆分为以下词法标记:
—注释
—数字
—字符串
—标识符
—关键词
—操作符
例如:

`define wordsize 8 reg [1:`wordsize] data;
//定义一个带有可变延迟的nand
`define var_nand(dly) nand #dly
`var_nand(2) g121 (q21, n10, n11);
`var_nand(5) g122 (q22, n10, n11);

下面的语法是非法的,因为它被拆分为字符串:

`define first_half "start of string
$display(`first_half end of string");

每一个形式参数被替换位字面意义上的形式参数。因此,当一个表达式被用作实际的参数时,该表达式将被完全替换。如果在宏文本中多次使用形式参数,这可能会导致表达式被求值多次。例如:

`define max(a,b) ((a) > (b) ? (a) : (b))
n = `max(p+q, r+s) ;

被扩展为
n = ((p+q) > (r+s)) ? (p+q) : (r+s) ;
这里,两个表达式中较大的p + q和r + s将被求值两次。
define这个词被称为编译器指令的关键字,它不是普通关键字集合的一部分。因此,Verilog HDL源描述中的普通标识符可以与编译器指令关键字相同(尽管不建议这样做)。应考虑以下问题:
a)文本宏名称可能与编译器指令关键字不同。
b)文本宏名可以重用作为普通标识符使用的名称。例如,signal_name和`signal_name不一样。
c)允许重新定义文本宏;当在源文本中遇到宏名时,编译器读取的特定文本宏的最新定义将生效。
宏文本可以包含其他文本宏的使用。这样的用法应该在原始宏被替换后被替换,而不是在宏被定义时被替换。如果一个宏直接或间接地扩展到包含它自己的另一个用法(递归宏)的文本,那将是一个错误。

19.3.2 `undef

指令`undef将取消先前定义的文本宏的定义。试图取消以前没有使用define编译器指令定义的文本宏可能会导致警告。
编译器指令`undef编译器指令在语法19-4中给出。

未定义的文本宏没有值,就像它从未被定义过一样。

你可能感兴趣的:(Verilog,define,undef)