首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用编译器指令(``ifdef)和不同的` `define's编译文件?

如何使用编译器指令(``ifdef)和不同的` `define's编译文件?
EN

Stack Overflow用户
提问于 2020-11-17 21:54:53
回答 1查看 919关注 0票数 0

我有两个文件,文件a和文件b。文件a有基于是否定义了'b‘的编译指令。

a.sv中的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module a_module()
    initial begin
`ifdef b
            $display("This is compiled in file b");
`else
            $display("This is compiled in file a");
`endif
    end
endmodule: a_module()

b.sv中的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`define b 1
`include a.sv

module b_module()

    a_module a_module();

endmodule: b_module()

尽管在导入文件a之前定义了'b‘,但运行这两个文件都会输出"This is compiled in file a“。

为什么会这样呢?我如何组织我的代码,使a.sv在两次编译时都能独立编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 03:20:18

Verilog在编译过程中与'c‘不同。在“c”中,每个源文件都是一个编译单元,并且是自包含的。所有宏定义都包含在其中。

在verilog中,宏的所有声明(以及系统verilog全局作用域中的所有声明)都是粘性的。这意味着一个源文件中的宏定义也可以在带有声明的源文件之后的其他源文件中看到。

因此,在verilog中,如果你想用不同的宏定义包含相同的文件,您需要使用'define和'undef指令,例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`define b
`include "a.sv"
...
`undef b
`include "a.sv"

但是,需要注意的是。在实际项目中,这种类型的包含是许多错误、不正确编译和调试问题的根源。我建议您避免使用它。

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

https://stackoverflow.com/questions/64883916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文