2011-05-15 71 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,將事情定義爲零可能會導致問題。