2017-04-26 112 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语句中指定它们。