Verilog 定义宏的范围

Verilog 定义宏的范围,verilog,system-verilog,hdl,system-verilog-assertions,Verilog,System Verilog,Hdl,System Verilog Assertions,此问题与系统verilog宏有关。 我有一个顶部模块,子模块和一个子模块。在顶部模块中实例化的子模块中实例化的子模块 如果我在子模块中定义宏`define abc,那么在`ifndef abc中编写的代码是否会在顶层模块/子模块中编译除非您在编译命令中使用+define+…,否则define宏将根据编译顺序生效。一旦编译完成,它将被任何后续代码行或文件获取,直到满足相应的unde 假设在您的情况下,编译顺序是:subsubsub.v,sub.v,top.v(根据您的模块名称) 假设define

此问题与系统verilog宏有关。
我有一个顶部模块,子模块和一个子模块。在顶部模块中实例化的子模块中实例化的子模块


如果我在子模块中定义宏
`define abc
,那么在
`ifndef abc
中编写的代码是否会在顶层模块/子模块中编译除非您在编译命令中使用
+define+…
,否则
define
宏将根据编译顺序生效。一旦编译完成,它将被任何后续代码行或文件获取,直到满足相应的
unde

假设在您的情况下,编译顺序是:
subsubsub.v
sub.v
top.v
(根据您的模块名称)

假设
define abc
位于
sub.v
的第一行,则该
abc
sub.v
的任何后续行以及剩余文件中有效,在本例中,该文件是
top.v
,但不是
subsub.v

因此,为了回答您的问题,在
top.v
中的
ifndef abc
中的任何代码都不会被编译。另一方面,将编译
subsub.v
中的
ifndefabc


定义宏和大多数其他编译器指令的范围是一个编译单元。编译单元是编译器解析的源文本流。宏在编译单元中出现时被定义,并且从该点开始可见

模块和其他名称空间定义的作用域是不相关的,因为宏是在识别任何Verilog或SystemVerilog语法之前预处理的。这意味着您永远无法对宏定义进行特定于实例的控制

Verilog和SystemVerilog定义编译单元的方式存在明显差异

在Verilog中,每个编译单元都是一个编译步骤,或者对编译源代码的工具的一次调用。有些工具只有一个编译步骤,要求您在一个步骤中编译所有源代码。其他工具(如Modelsim)允许您在单独的步骤中编译代码。一个编译步骤中的
`define
宏在任何其他编译步骤中都不可见,除非重新定义它

SystemVerilog增加了将编译器命令行上的每个文件作为单独编译单元处理的功能。这是必需的,因为SystemVerilog允许您在模块之外定义TypeDef和函数之类的内容。将每个文件保持为单独的编译单元可以防止命名冲突。(此编译单元行为在C/C++中相同)

由于人们将遗留Verilog代码与SystemVerilog混合的方式,一些工具允许您选择编译单元的Verilog或SystemVerilog行为