2014-10-19 376 views
-2

我正在嘗試爲2的恭維加法器寫入「逆變器」函數。我的老師希望我使用if/else語句來實現它。該模塊應該採取8位數字和翻轉位(所以零到一/零)。我寫這個模塊:嘗試使用if/else塊時在verilog(vcs)中獲取奇怪的錯誤

module inverter(b, bnot); 
    input [7:0] b; 
    output [7:0]bnot; 

    if (b[0] == 0) begin 
    assign bnot[0] = 1; 
    end else begin 
    assign bnot[0] = 0; 
    end 

    //repeat for bits 1-7 

當我嘗試編譯並使用此命令我得到了以下錯誤編譯:

vcs +v2k inverter.v 
    Error-[V2005S] Verilog 2005 IEEE 1364-2005 syntax used. 
    inverter.v, 16 
    Please compile with -sverilog or -v2005 to support this construct: generate 
    blocks without generate/endgenerate keywords. 

所以我加入了-v2005參數,然後我得到這個錯誤:

vcs +v2k -v2005 inverter.v 
Elaboration time unknown or bad value encountered for generate if-statement 
condition expression. 
Please make sure it is elaboration time constant. 

有人向我解釋我做錯了什麼?所有這些都很新穎,而且非常困惑:)。謝謝!

回答

5

assign像這樣的陳述聲明驅動分配導線的組合硬件。既然你已經把if/else放在它周圍,它看起來像你正在按需要生成硬件,你不能這樣做。生成語句遠離基於常量參數的變量實例的參數化代碼,這就是爲什麼在這種情況下,您會得到相當混亂的錯誤。

兩個解決方案:

使用三元運算選擇值。

assign bnot[0] = b[0] ? 1'b0 : 1'b1; 

這與assign bnot[0] = ~b[0]相同。

或使用組合總是阻止,輸出必須聲明爲reg。在上面的例子中

module inverter(
    input  [7:0] b, 
    output reg [7:0] bnot 
); 
always @* begin 
    if (b[0] == 0) begin 
    bnot[0] = 1; 
    end else begin 
    bnot[0] = 0; 
    end 
end 

注輸出被聲明爲REG沒有電線,我們總結代碼始終@ *和我們不使用指定關鍵字。

Verliog reg vs wire是一個模擬器優化,你只需要使用正確的,進一步的答案詳細說明這是Verilog Input Output types,SystemVerilog datatypes

相關問題