这个问题是关于系统verilog宏的。
我有一个顶级模块,子模块和一个子子模块。子模块在顶层模块中实例化的子模块中实例化。`define macros的范围
如果我定义子模块中的宏`define abc
,将里面`ifndef abc
编写的代码顶部模块/子子模块
这个问题是关于系统verilog宏的。
我有一个顶级模块,子模块和一个子子模块。子模块在顶层模块中实例化的子模块中实例化。`define macros的范围
如果我定义子模块中的宏`define abc
,将里面`ifndef abc
编写的代码顶部模块/子子模块
在被编译除非你在你的编译命令使用+define+...
,在define
宏将取决于编辑顺序生效。一旦编译完成,它将被任何后续的代码或文件行取代,直到符合相应的undef
。
说你的情况,编译顺序是:subsub.v
,sub.v
,top.v
(根据您的模块名称)。
假设是上的sub.v
第一行,这abc
可有效地sub.v
任何后续线以及剩余的文件在这种情况下是top.v
,但不是subsub.v
。
所以要回答你的问题,ifndef abc
top.v
内的任何代码都不会被编译。另一方面,subsub.v
中的ifndef abc
将被编译。
的`define
宏和大多数其他的编译指令的范围是一个编译单元。编译单元是编译器解析的源文本流。一个宏在它出现在编译单元中的位置被定义,并从该点开始可见。
由模块和其他名称空间定义的作用域是不相关的,因为在任何Verilog或SystemVerilog语法被识别之前预处理宏。这意味着您永远不能对宏定义进行实例特定的控制。
Verilog和SystemVerilog如何定义编译单元有一个区别。
在Verilog中,每个编译单元都是一个编译步骤,或者是一个编译源代码的工具的调用。某些工具只有一个编译步骤,要求您一步完成所有源代码的编译。其他工具(例如Modelsim)允许您在单独的步骤中编译您的代码。 A `define
宏在一个编译步骤中是不可见的任何其他编译步骤,除非您重新定义它。
SystemVerilog添加了将编译器命令行上的每个文件作为独立编译单元处理的功能。这是需要的,因为SystemVerilog允许你在模块之外定义类型定义和函数。将每个文件保存为单独的编译单元可防止命名冲突。 (这个编译单元在C/C++中的行为是一样的)。
由于人们将传统Verilog代码与SystemVerilog混合使用,所以有些工具允许您选择编译单元的Verilog或SystemVerilog行为。