gpt4 book ai didi

verilog - `定义宏的范围

转载 作者:行者123 更新时间:2023-12-05 01:19:21 29 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

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

关于verilog - `定义宏的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40484990/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com