2011-05-15 1431 views
0

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

在我最模块我有以下几点:

`define MODELSIM 0 

当我在赛灵思的时候,我将设置MODELSIM为0。当我在我的ModelSim,我将其设置为1

在其他文件等模块,我有以下几点:

if(MODELSIM) 

,使不同的事情将取决于我是否在的ModelSim或赛灵思是发生。

+1

你准备怎么做?如果它是一个常量,那么可以考虑使用'define statement – Marty 2011-05-15 13:50:41

+0

我试图设置一个常量,因为有部分代码在Modelsim中可用,但在Xilinx中不可用。我希望能够使用全局常量,以便可以控制这些部分并根据我是在Modelsim还是Xilinx中来设置常量。 – neuromancer 2011-05-15 20:41:03

+0

这听起来像你想'定义 – 2011-05-15 20:47:18

回答

2

只需以顶级模块的名称作为前缀即可。

module top; 
    integer myglobalvar; 
endmodule 

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

这适用于modelsim,但不适用于Xilinx。 – neuromancer 2011-05-15 12:08:54

+1

然后赛灵思不支持标准的Verilog。如果您询问Xilinx,那么您应该在问题中提到这一点。 – mark4o 2011-05-15 14:16:42

+3

模块外引用通常是不可合成的。 – Marty 2011-05-15 15:22:15

3

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

+0

嗯......不是_constant_与_variable_相反吗? – mark4o 2011-05-15 20:03:30

+0

你说得对。这改变了一切。 – 2011-05-15 20:39:55

+0

我喜欢你的原始答案,并认为它值得拥有,即使这个问题有点不稳定。 – Andy 2011-05-16 18:16:09

4

有几件事要注意。获取简单的一出的第一方式,用Verilog到预处理宏引用必须用反引号为前缀,即:

if (`MODELSIM) 

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

一些文体笔记:

  1. 如果你正试图使仿真和综合之间的区别,它是标准的使用SYNTHESIS宏这一点。许多综合工具将自动定义它。谨慎处理合成条件。由于它有意让您的模拟与您的综合结果有所不同,因此这是一种在脚中拍摄自己的简单方法。

  2. 对于简单的标志,最好使用1/undef而不是1/0的值。如果您稍后编写`ifdef MACRO,将事情定义为零可能会导致问题。