首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >定义宏的作用域

定义宏的作用域
EN

Stack Overflow用户
提问于 2016-11-08 18:49:52
回答 2查看 7.2K关注 0票数 2

这个问题是关于系统verilog宏的。

我有一个顶层模块,子模块和一个子模块。子模块中实例化的子模块在顶层模块中实例化的子模块。

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-08 23:44:37

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

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

Verilog和SystemVerilog定义编译单元的方式有明显的不同。

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2016-11-08 21:37:08

除非在编译命令中使用+define+...,否则define宏将根据编译顺序生效。一旦编译完成,它将被任何后续的代码行或文件所采用,直到满足相应的undef

假设在你的例子中,编译顺序是:subsub.vsub.vtop.v (根据你的模块名称)。

假设define abc位于sub.v的第一行,则此abcsub.v的任何后续行以及剩余的文件(在本例中为top.v )都有效,但对subsub.v无效。

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

Example here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40484990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档