Systemverilog:文本替换宏的范围

时间:2013-04-20 14:16:59

标签: system-verilog

我读到文本替换宏在'verilog'中具有全局范围。 SystemVerilog如何工作?我想在2个不同的SystemVerilog文件中使用相同文本宏的2个不同定义 - 可以吗?

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