System verilog Systemverilog:文本替换宏的范围

System verilog Systemverilog:文本替换宏的范围,system-verilog,System Verilog,我读到文本替换宏在“verilog”中具有全局作用域。SystemVerilog是如何工作的?我想在两个不同的SystemVerilog文件中使用同一文本宏的两个不同定义-可以吗?在SystemVerilog中,宏定义仅限于编译单元范围,但具体定义取决于工具配置。根据规范: 定义构成编译的文件的确切机制 单元是特定于工具的。但是,合规工具应提供使用 允许以下两种情况的模型: a) 给定编译命令行上的所有文件构成一个 编译单元(在这种情况下,这些文件中的声明 可在整个过程中按照正常的可见性规则访问

我读到文本替换宏在“verilog”中具有全局作用域。SystemVerilog是如何工作的?我想在两个不同的SystemVerilog文件中使用同一文本宏的两个不同定义-可以吗?

在SystemVerilog中,宏定义仅限于编译单元范围,但具体定义取决于工具配置。根据规范:

定义构成编译的文件的确切机制 单元是特定于工具的。但是,合规工具应提供使用 允许以下两种情况的模型:

a) 给定编译命令行上的所有文件构成一个 编译单元(在这种情况下,这些文件中的声明 可在整个过程中按照正常的可见性规则访问 整个文件集)

b) 每个文件都是一个单独的编译单元(在这种情况下 每个编译单元范围中的声明只能访问 在其相应的文件中)

因此,如果对Modelsim使用多个文件编译单元(
-mfcu
),则会发生冲突,因为宏命名空间将具有全局范围。但是,规范明确允许重新定义,因此在这种情况下,您可能不会得到错误(或警告),除非您的工具支持它

文本宏名称空间在编译单元中是全局的。 因为文本宏名称是引入的,并与前导字符一起使用 字符,它们与任何其他名称空间保持明确。正文 宏名称是按集合中出现的线性顺序定义的 组成编译单元的输入文件的类型。后来的 相同名称的定义将替代以前的定义 输入文件的平衡

取决于您使用宏的方式,您可能需要考虑使用参数。参数本质上是比预处理器指令范围更有限的常量。它们还可以用于使用generate构造选择性地实例化代码


您可以免费获得SV规范。

在SystemVerilog中,宏定义仅限于编译单元范围,但具体定义取决于工具配置。根据规范:

定义构成编译的文件的确切机制 单元是特定于工具的。但是,合规工具应提供使用 允许以下两种情况的模型:

a) 给定编译命令行上的所有文件构成一个 编译单元(在这种情况下,这些文件中的声明 可在整个过程中按照正常的可见性规则访问 整个文件集)

b) 每个文件都是一个单独的编译单元(在这种情况下 每个编译单元范围中的声明只能访问 在其相应的文件中)

因此,如果对Modelsim使用多个文件编译单元(
-mfcu
),则会发生冲突,因为宏命名空间将具有全局范围。但是,规范明确允许重新定义,因此在这种情况下,您可能不会得到错误(或警告),除非您的工具支持它

文本宏名称空间在编译单元中是全局的。 因为文本宏名称是引入的,并与前导字符一起使用 字符,它们与任何其他名称空间保持明确。正文 宏名称是按集合中出现的线性顺序定义的 组成编译单元的输入文件的类型。后来的 相同名称的定义将替代以前的定义 输入文件的平衡

取决于您使用宏的方式,您可能需要考虑使用参数。参数本质上是比预处理器指令范围更有限的常量。它们还可以用于使用generate构造选择性地实例化代码


您可以免费获得SV规范。

如果所需的宏具有模拟结构/格式,则可以使用带参数的宏。见IEEE1800-2012第22.5.1节

`define myMacro(arg1,arg2) \
    prefix_``arg1 = arg2``_postfix 
如果所需的宏定义仅在其受尊重的文件中且唯一,则可以执行以下操作。所有其他文件都不会有可调用的
`mymacro
<代码>`undf来自Verilog,IEEE1364-1995第16.3.2节,并已包含在SystemVerilog中。您可以在最新版本中阅读有关
`unde
的更多信息;IEEE1800-2012第22.5.2节

file1.sv:

`define mymacro abcd
/* SystemVerilog code */
`undef mymacro
file2.sv:

`define mymacro wxyz
/* SystemVerilog code */
`undef mymacro

如果所需宏具有模拟结构/格式,则可以使用带参数的宏。见IEEE1800-2012第22.5.1节

`define myMacro(arg1,arg2) \
    prefix_``arg1 = arg2``_postfix 
如果所需的宏定义仅在其受尊重的文件中且唯一,则可以执行以下操作。所有其他文件都不会有可调用的
`mymacro
<代码>`undf来自Verilog,IEEE1364-1995第16.3.2节,并已包含在SystemVerilog中。您可以在最新版本中阅读有关
`unde
的更多信息;IEEE1800-2012第22.5.2节

file1.sv:

`define mymacro abcd
/* SystemVerilog code */
`undef mymacro
file2.sv:

`define mymacro wxyz
/* SystemVerilog code */
`undef mymacro

谢谢你的详细回复。我认为使用parameter/generate方法的选择性实例化代码需要在语法上完整,以避免编译错误。但是对于文本宏,它可以是一个片段,只有在适当的上下文中使用时才会编译。这就是我需要的能力。谢谢你的详细回复。我认为使用parameter/generate方法的选择性实例化代码需要在语法上完整,以避免编译错误。但是对于文本宏,它可以是一个片段,只有在适当的上下文中使用时才会编译。这就是我需要的能力。