2016-11-08 63 views
1

这个问题是关于系统verilog宏的。
我有一个顶级模块,子模块和一个子子模块。子模块在顶层模块中实例化的子模块中实例化。`define macros的范围

如果我定义子模块中的宏`define abc,将里面`ifndef abc编写的代码顶部模块/子子模块

回答

0

在被编译除非你在你的编译命令使用+define+...,在define宏将取决于编辑顺序生效。一旦编译完成,它将被任何后续的代码或文件行取代,直到符合相应的undef

说你的情况,编译顺序是:subsub.v,sub.v,top.v(根据您的模块名称)。

假设​​是上的sub.v第一行,这abc可有效地sub.v任何后续线以及剩余的文件在这种情况下是top.v,但不是subsub.v

所以要回答你的问题,ifndef abctop.v内的任何代码都不会被编译。另一方面,subsub.v中的ifndef abc将被编译。

Example here

2

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

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

Verilog和SystemVerilog如何定义编译单元有一个区别。

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

SystemVerilog添加了将编译器命令行上的每个文件作为独立编译单元处理的功能。这是需要的,因为SystemVerilog允许你在模块之外定义类型定义和函数。将每个文件保存为单独的编译单元可防止命名冲突。 (这个编译单元在C/C++中的行为是一样的)。

由于人们将传统Verilog代码与SystemVerilog混合使用,所以有些工具允许您选择编译单元的Verilog或SystemVerilog行为。