这个问题与系统verilog宏有关 我有一个顶级模块,子模块和一个子子模块。在顶层模块中实例化的子模块中实例化的子子模块。
如果我在子模块中定义宏`define abc
,那么在`ifndef abc
内编写的代码将在顶层模块/子子模块中编译
答案 0 :(得分:2)
`define
宏和大多数其他编译器指令的范围是编译单元。编译单元是编译器解析的源文本流。宏在编译单元中出现的位置定义,从那一点开始可见。
模块和其他命名空间定义的范围无关紧要,因为在识别任何Verilog或SystemVerilog语法之前会对宏进行预处理。这意味着您永远不能对宏定义进行实例特定控制。
Verilog和SystemVerilog如何定义编译单元之间存在视觉差异。
在Verilog中,每个编译单元都是编译步骤,或者是编译源代码的工具的一次调用。有些工具只有一个编译步骤,要求您一步编译所有源代码。其他工具(例如Modelsim)允许您在单独的步骤中编译代码。除非您重新定义,否则在一个编译步骤中的`define
宏不会显示任何其他编译步骤。
SystemVerilog添加了将编译器命令行上的每个文件视为单独编译单元的功能。这是必需的,因为SystemVerilog允许您定义类型之外的类型和模块之外的函数。将每个文件保持为单独的编译单元可防止命名冲突。 (这个编译单元的行为在C / C ++中是相同的。)
由于人们将遗留的Verilog代码与SystemVerilog混合在一起,因此某些工具允许您选择编译单元的Verilog或SystemVerilog行为。
答案 1 :(得分:1)
除非在编译命令中使用+define+...
,否则define
宏将根据编译顺序生效。编译完成后,任何后续的代码或文件行将对其进行处理,直到满足相应的undef
为止。
在您的情况下,假设编译顺序为:subsub.v
,sub.v
,top.v
(根据您的模块名称)。
假设define abc
位于sub.v
的第一行,此abc
在sub.v
的后续行以及此情况下的剩余文件中有效是top.v
,但不是subsub.v
。
因此,要回答您的问题,ifndef abc
中top.v
内的所有代码都不会被编译。另一方面,ifndef abc
中的subsub.v
将被编译。