我想创建一个可以被所有模块看到的全局常量。我尝试了在顶层模块中声明变量的不同方法。但是其他模块无法识别它。
在我的顶级模块中,我有以下内容:
`define MODELSIM 0
当我在Xilinx时,我会将MODELSIM设置为0.当我在Modelsim中时,我会将其设置为1.
在其他文件的其他模块中,我将有以下内容:
if(MODELSIM)
因此,根据我是在Modelsim还是Xilinx中,会发生不同的事情。
答案 0 :(得分:4)
有几点需要注意。首先要使用简单的方法,在verilog中对预处理器宏的引用必须以反引号为前缀,即:
if (`MODELSIM)
verilog标准指定tick-defined具有全局范围,这意味着如果在编译的第一个文件中定义MODELSIM
,则该定义将应用于所有后续文件。但是,我相信Modelsim在单独的编译单元中编译每个文件,因此最安全的做法是使用宏定义创建mydesign.vh
标头,并在每个verilog文件中创建`include
标头。 `define
在源文本级别工作。 `define
与特定模块之间没有关联,也无法按范围访问`define
。
一些风格笔记:
如果您尝试区分模拟和合成,那么使用SYNTHESIS
宏是标准的。许多综合工具会自动定义它。谨慎对待以综合为条件的事情。由于故意使您的模拟与您的综合结果不同,因此这是一种轻松拍摄自己的方法。
对于简单标志,最好使用1 / undef而不是1/0的值。如果您稍后写`ifdef MACRO
。
答案 1 :(得分:3)
对于可合成代码,没有全局变量这样的东西。您必须通过您的设计路由任何此类信号。
答案 2 :(得分:2)
只需在其前面加上顶级模块的名称。
module top;
integer myglobalvar;
endmodule
module any;
initial $display(top.myglobalvar);
endmodule