我读到文本替换宏在“verilog”中具有全局范围。SystemVerilog 是如何工作的?我想在 2 个不同的 SystemVerilog 文件中使用相同文本宏的 2 个不同定义 - 可以吗?
2 回答
在 SystemVerilog 中,宏定义仅限于编译单元范围,但这取决于工具配置。从规范:
定义哪些文件构成编译单元的确切机制是特定于工具的。但是,兼容工具应提供允许以下两种情况的使用模型:
a) 给定编译命令行上的所有文件构成一个编译单元(在这种情况下,这些文件中的声明可以按照整个文件集的正常可见性规则访问)。
b) 每个文件都是一个单独的编译单元(在这种情况下,每个编译单元范围内的声明只能在其对应的文件中访问)。
因此,如果您使用多文件编译单元(-mfcu
对于 Modelsim),将会发生冲突,因为宏命名空间将具有全局范围。但是,规范明确允许重新定义,因此在这种情况下您可能不会收到错误(或警告),除非您的工具支持它。
文本宏名称空间在编译单元内是全局的。因为文本宏名称被引入并与前导 ' 字符一起使用,所以它们与任何其他名称空间保持一致。文本宏名称在构成编译单元的输入文件集中以出现的线性顺序定义。相同名称的后续定义覆盖输入文件余额的先前定义。
根据您使用宏的方式,您可能需要考虑使用参数。参数本质上是比预处理器指令范围更有限的常量。它们还可以用于使用生成构造选择性地实例化代码。
您可以在此处免费获取 SV 规范。
如果所需的宏具有类似的结构/格式,那么您可以使用带参数的宏。请参阅 IEEE1800-2012 第 22.5.1 节。
`define myMacro(arg1,arg2) \
prefix_``arg1 = arg2``_postfix
如果所需的宏定义仅在其受尊重的文件中并且是唯一的,那么您可以执行以下操作。所有其他文件都没有`mymacro
可以调用的。`undef
来自 Verilog,IEEE1364-1995 第 16.3.2 节,并已包含在 SystemVerilog 中。您可以`undef
在最新版本中了解更多信息;IEEE1800-2012 第 22.5.2 节。
文件 1.sv:
`define mymacro abcd
/* SystemVerilog code */
`undef mymacro
文件2.sv:
`define mymacro wxyz
/* SystemVerilog code */
`undef mymacro