Verilog 如何使用编译器指令(`ifdef)和不同的`define';s

Verilog 如何使用编译器指令(`ifdef)和不同的`define';s,verilog,system-verilog,Verilog,System Verilog,我有两个文件,文件a和文件b。文件a具有基于是否定义“b”的编译指令 a.sv中的代码如下所示: 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和文件b。文件a具有基于是否定义“b”的编译指令

a.sv中的代码如下所示:

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()
`define b 1
`include a.sv

module b_module()

    a_module a_module();

endmodule: b_module()
b.sv中的代码如下所示:

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()
`define b 1
`include a.sv

module b_module()

    a_module a_module();

endmodule: b_module()
尽管在导入文件a之前定义了“b”,但运行这两个文件将输出“这是在文件a中编译的”


为什么会这样?如何构造代码,使a.sv两次都能独立编译?

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

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

因此,在verilog中,如果要包含具有不同宏定义的同一文件,则需要使用'define和'unde指令,例如

`define b
`include "a.sv"
...
`undef b
`include "a.sv"

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

你的意思是在
b\u模块
中实例化
a\u模块
?@dave\u 59,是的,谢谢。我已经更新了示例。您的意思是您正在编译包含a.sv的b.sv。您应该只将b.sv放在命令行上,而a.sv只编译一次。我如何构造verilog,使我的代码在我将其包含在文件a中时以一种方式编译,而在我将其包含在文件b中时以另一种方式编译?我知道这在C语言中是可能的,我想在这里做同样的事情。如果这是不可能的,是否有其他类似功能的设计模式?