`定义宏的范围

时间:2016-11-08 10:49:52

标签: verilog system-verilog hdl system-verilog-assertions

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

如果我在子模块中定义宏`define abc,那么在`ifndef abc内编写的代码将在顶层模块/子子模块中编译

2 个答案:

答案 0 :(得分:2)

`define宏和大多数其他编译器指令的范围是编译单元。编译单元是编译器解析的源文本流。宏在编译单元中出现的位置定义,从那一点开始可见。

模块和其他命名空间定义的范围无关紧要,因为在识别任何Verilog或SystemVerilog语法之前会对宏进行预处理。这意味着您永远不能对宏定义进行实例特定控制。

Verilog和SystemVerilog如何定义编译单元之间存在视觉差异。

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

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

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

答案 1 :(得分:1)

除非在编译命令中使用+define+...,否则define宏将根据编译顺序生效。编译完成后,任何后续的代码或文件行将对其进行处理,直到满足相应的undef为止。

在您的情况下,假设编译顺序为:subsub.vsub.vtop.v(根据您的模块名称)。

假设define abc位于sub.v的第一行,此abcsub.v的后续行以及此情况下的剩余文件中有效是top.v,但不是subsub.v

因此,要回答您的问题,ifndef abctop.v内的所有代码都不会被编译。另一方面,ifndef abc中的subsub.v将被编译。

Example here