如何比較宏和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
如何比較宏和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
沒有`如果在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
可以使用產生結構的條件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
。
你真的需要編譯時檢查,還是可以使用運行時檢查,比如'$ value $ plusargs'? – toolic