2013-04-20 447 views
2

的范围,我读了文本替换宏在“Verilog的”全球范围。 SystemVerilog如何工作?我想在2个不同的SystemVerilog文件中使用2个不同的相同文本宏的定义 - 可以吗?的SystemVerilog:文本替换宏

回答

3

在SystemVerilog中,宏定义仅限于编译单元范围,但是那是什么取决于工具的配置。从规范:

定义哪些文件构成编译的确切机制 单位是工具特定的。然而,标准的工具应提供使用 模式,使双方的下列情况:

一)给定的编译命令行上的所有文件进行单 编译单元(在这种情况下,这些文件 中的声明,都可以访问以下正常的可见性规则贯穿整个文件集)。 b)每个文件是一个单独的编译单元(在这种情况下,每个编译单元范围内的 声明在其相应文件中只能访问 )。

因此,如果您使用多个文件编译单元(-mfcu为的ModelSim),就会出现冲突,因为宏命名空间将具有全局作用域。然而,规范明确允许重新定义,所以在这种情况下您可能不会收到错误(或警告),除非您的工具支持它。

的文本宏的名称空间是编译单元内全球。 因为文本宏的名字被引入,并与一家领先的“ 字符使用,但仍明确与任何其他名称空间。文本 宏名在外观上的线性顺序定义输入文件构成编译单元的集合 。随后的 相同名称的定义会覆盖输入文件的以前定义的 余额。

根据您如何使用宏,您可能需要考虑使用参数。参数本质上是常量,比预处理器指令的范围更受限制。它们也可以用来选择性地使用生成结构实例化代码。

你可以得到SV规范here是免费的。

+1

感谢您的详细响应。我认为使用参数/生成方法的选择性实例代码需要在语法上完成以避免编译错误。但是对于文本宏,它可以是仅在正确的上下文中使用才能编译的片段。这是我需要的能力。 – user2292757 2013-04-21 03:19:59

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