我读到文本替换宏在'verilog'中具有全局范围。 SystemVerilog如何工作?我想在2个不同的SystemVerilog文件中使用相同文本宏的2个不同定义 - 可以吗?
答案 0 :(得分:3)
在SystemVerilog中,宏定义仅限于编译单元范围,但这取决于工具配置。从规范:
定义哪些文件构成编译的确切机制 单位是特定于工具的。但是,合规工具应提供使用 允许以下两种情况的模型:
a)给定编译命令行上的所有文件都是单个文件 编译单元(在这种情况下,这些文件中的声明 可以按照正常的可见性规则访问 整套文件)。
b)每个文件都是一个单独的编译单元(在这种情况下是 每个编译单元范围中的声明只能访问 在其相应的文件中)。
因此,如果您对Modelsim使用多文件编译单元(-mfcu
),则会发生冲突,因为宏命名空间将具有全局范围。但是,规范明确允许重新定义,因此在这种情况下您可能不会收到错误(或警告),除非您的工具支持它。
文本宏名称空间在编译单元中是全局的。 因为文本宏名称被引入并与前导'一起使用' 字符,它们与任何其他名称空间保持明确无关。文本 宏名称以集合中的外观线性顺序定义 组成编译单元的输入文件。随后 同名的定义会覆盖以前的定义 输入文件的平衡。
根据您使用宏的方式,您可能需要考虑使用参数。参数本质上是常量,它们的范围比预处理器指令更有限。它们还可以用于使用生成构造选择性地实例化代码。
您可以免费获得SV规范here。
答案 1 :(得分:1)
如果所需的宏具有相似的结构/格式,则可以使用带参数的宏。参见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节。
file1.sv:
`define mymacro abcd
/* SystemVerilog code */
`undef mymacro
file2.sv:
`define mymacro wxyz
/* SystemVerilog code */
`undef mymacro