Verilog中的全局常量

时间:2011-05-15 11:10:45

标签: verilog

我想创建一个可以被所有模块看到的全局常量。我尝试了在顶层模块中声明变量的不同方法。但是其他模块无法识别它。

在我的顶级模块中,我有以下内容:

`define MODELSIM 0

当我在Xilinx时,我会将MODELSIM设置为0.当我在Modelsim中时,我会将其设置为1.

在其他文件的其他模块中,我将有以下内容:

  if(MODELSIM)

因此,根据我是在Modelsim还是Xilinx中,会发生不同的事情。

3 个答案:

答案 0 :(得分:4)

有几点需要注意。首先要使用简单的方法,在verilog中对预处理器宏的引用必须以反引号为前缀,即:

if (`MODELSIM)

verilog标准指定tick-defined具有全局范围,这意味着如果在编译的第一个文件中定义MODELSIM,则该定义将应用于所有后续文件。但是,我相信Modelsim在单独的编译单元中编译每个文件,因此最安全的做法是使用宏定义创建mydesign.vh标头,并在每个verilog文件中创建`include标头。 `define在源文本级别工作。 `define与特定模块之间没有关联,也无法按范围访问`define

一些风格笔记:

  1. 如果您尝试区分模拟和合成,那么使用SYNTHESIS宏是标准的。许多综合工具会自动定义它。谨慎对待以综合为条件的事情。由于故意使您的模拟与您的综合结果不同,因此这是一种轻松拍摄自己的方法。

  2. 对于简单标志,最好使用1 / undef而不是1/0的值。如果您稍后写`ifdef MACRO

  3. ,将事物定义为零可能会导致问题

答案 1 :(得分:3)

对于可合成代码,没有全局变量这样的东西。您必须通过您的设计路由任何此类信号。

答案 2 :(得分:2)

只需在其前面加上顶级模块的名称。

module top;
  integer myglobalvar;
endmodule

module any;
  initial $display(top.myglobalvar);
endmodule