2017-04-26 92 views
0

我正在做我的作業,關於製作一個ALU,我得到一個錯誤。我搜索它,但沒有得到原因。爲什麼會發生? 錯誤消息是S2不是一個常量。 case ({S2,S1,S0})Verilog錯誤:XXX不是一個常數

```

module ALU(
    input S0, 
    input S1, 
    input S2, 
    input IN1, 
    input IN2, 
    input IN3, 
    output OUT1, 
    output OUT2 
    ); 


case ({S2,S1,S0})//{S2,S1,S0} 
3'b000: 
begin 
    assign OUT1=IN1&IN2;//and a1(OUT1,IN1,IN2); 
    assign OUT2 = 1'b0; 
end 
3'b001: 
begin 
    assign OUT1=IN1|IN2;//or o1(OUT1,IN1,IN2); 
    assign OUT2=1'b0; 
end 
3'b010: 
begin 
    assign OUT1=!IN1; 
    assign OUT2=1'b0; 
end 
3'b011: 
begin 
    assign OUT1=!IN2; 
    assign OUT2=1'b0; 
end 
3'b100: 
begin 
    assign OUT1=IN1^IN2; 
    assign OUT2=1'b0; 
end 
3'b101:FullAdder1 fa(.IN1(IN1),.IN2(IN2),.IN3(IN3),.OUT1(OUT1),.OUT2(OUT2)); 
3'b110:FullSubtracter1 fs(.IN1(IN1),.IN2(IN2),.IN3(IN3),.OUT1(OUT1),.OUT2(OUT2)); 
3'b111: 
begin 
    assign OUT1=1'b0; 
    assign OUT2=1'b0; 
end 
default: 
begin 
    assign OUT1=1'b0; 
    assign OUT2=1'b0; 
end 
endcase 
endmodule 

``` 
+1

我無法重現您的錯誤,也許是因爲您沒有提供可運行的代碼。但是,你不應該在像這樣的情況下實例化模塊。 – toolic

+0

也許你應該在檔案中加入''timescale 1ns/1ps' – Weiby

回答

0

您使用您的switch-case語句分配和模塊聲明。編譯器將其作爲生成語句,即在詳細說明設計時(取決於選擇值),生成的設計將有所不同。

但是,您只能使用常量(例如參數)選擇的生成語句,因爲您無法在運行中重新生成硬件。

你有兩兩件事要做:

  • 通過你的輸出作爲暫存器(這時不要使用assign的情況下,但非阻塞分配<=
  • 實例化你的加法和減法的情況下語句外帶有單獨的結果線,在相應的情況下,您的輸出將被視爲值。

這樣做會導致您的輸出連接由{S2,S1,S0}控制多路複用器的輸出,並與不同的輸入,你在的switch-case語句中指定它們。