这个问题是关于系统verilog宏的。
我有一个顶层模块,子模块和一个子模块。子模块中实例化的子模块在顶层模块中实例化的子模块。
如果我在子模块中定义宏`define abc,在`ifndef abc中编写的代码是否会在顶层模块/子模块中编译
发布于 2016-11-08 23:44:37
`define宏和大多数其他编译器指令的作用域是一个编译单元。编译单元是编译器解析的源文本流。宏在它出现在编译单元中的那一点被定义,并且从那一点开始是可见的。
模块和其他名称空间定义的作用域是无关紧要的,因为宏是在识别任何Verilog或SystemVerilog语法之前进行预处理的。这意味着您永远不能对宏定义进行特定于实例的控制。
Verilog和SystemVerilog定义编译单元的方式有明显的不同。
在Verilog中,每个编译单元都是一个编译步骤,或者是对编译源代码的工具的一个调用。有些工具只有一个编译步骤,要求您在一个步骤中编译所有源代码。其他工具(例如Modelsim)允许您在单独的步骤中编译代码。在一个编译步骤中的`define宏在任何其他编译步骤中都不可见,除非您重新定义它。
SystemVerilog增加了将编译器命令行上的每个文件作为单独的编译单元的能力。之所以需要这样做,是因为SystemVerilog允许您在模块外部定义类型定义和函数等内容。将每个文件保留为单独的编译单元可防止命名冲突。(此编译单元行为在C/C++中是相同的)。
由于人们将遗留的Verilog代码与SystemVerilog混合在一起的方式,一些工具允许您选择编译单元的Verilog或SystemVerilog行为。
发布于 2016-11-08 21:37:08
除非在编译命令中使用+define+...,否则define宏将根据编译顺序生效。一旦编译完成,它将被任何后续的代码行或文件所采用,直到满足相应的undef。
假设在你的例子中,编译顺序是:subsub.v,sub.v,top.v (根据你的模块名称)。
假设define abc位于sub.v的第一行,则此abc对sub.v的任何后续行以及剩余的文件(在本例中为top.v )都有效,但对subsub.v无效。
所以回答你的问题,top.v中的ifndef abc中的任何代码都不会被编译。另一方面,subsub.v中的ifndef abc将被编译。
https://stackoverflow.com/questions/40484990
复制相似问题