2016-11-28 94 views
0

如何比較宏和Verilog中的常量?.下面的代碼給出了錯誤。like #if in c,is there`if in verilog

module top; 
    `define A 10 

    `if (`A==10) 
    initial $display("10"); 
    `else 
    initial $display("11"); 
    `endif 

endmodule 
+0

你真的需要編譯時檢查,還是可以使用運行時檢查,比如'$ value $ plusargs'? – toolic

回答

3

沒有`如果在verilog中,所以你不能按照你的建議去做。

雖然你確實有ifdef和ifndef,但它不會給你比較值的機會。一個繁瑣的解決方法是讓一組預處理比較,結果,比如像:

`ifdef A_EQUALS_10 
    initial $display("10"); 
`else 
    initial $display("11"); 
`endif 

在你詢問特定情況下,應更換`如果使用純如,即不預處理器的版本。你需要把它放在一個單獨的初始塊中,像這樣:

initial 
    begin 
    if (`A==10) 
     $display("10"); 
    else 
     $display("11"); 
    end 

在很多情況下,你應該考慮如果定義語句而應通過參數或localparam聲明,這是一個更清潔的方式來代替參數化您的設計。

你也可以閱讀關於這個話題在這裏:

http://www.veripool.org/papers/Preproc_Good_Evil_SNUGBos10_paper.pdf

0

可以使用產生結構的條件if聲明。首先在Verilog IEEE 1364-2001中引入(參見§ 12.1.3 生成實例)。您還可以在SystemVerilog的IEEE1800-2012瞭解IT行業(免費從IEEE下載)在27 §生成結構

module top; 
    `define A 10 

    generate 
    if (`A==10) begin 
    initial $display("10"); 
    end 
    else begin 
    initial $display("11"); 
    end 
    endgenerate 

endmodule 

的生成結構的目的是有條件實例模塊的實例。您可以將程序塊(initial,always,final等)放在生成結構中,但大多數情況下,最好將條件放入程序塊中。

initial begin 
    if (`A==10) 
    $display("10"); 
    else 
    $display("11"); 
end 

注意,編譯器指令(例如`define`ifdef和其他`)被編譯並通過將文件被編譯的順序首先評估和忽略產生的構建體。因此,您不能有條件地在生成結構中聲明`define