`定义宏的范围

vis*_*ala 3 verilog hdl system-verilog system-verilog-assertions

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

`define abc 如果我在子模块中定义宏,里面编写的代码是否`ifndef abc会在顶级模块/子子模块中编译

dav*_*_59 5

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

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

Verilog 和 SystemVerilog 定义编译单元的方式存在明显差异。

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

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

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