Verilog错误:XXX不是常数

时间:2017-04-26 11:39:20

标签: verilog

我正在做关于制作ALU的功课,我收到了一个错误。我搜索它但没有得到原因。为什么会发生? 错误消息是S2不是常量。case ({S2,S1,S0})

```

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 个答案:

答案 0 :(得分:0)

您在switch-case语句中使用assign和module声明。编译器将其作为生成语句,即在详细说明设计时,根据选择值,生成的设计将有所不同。

但是,您只能使用带有常量(例如参数)选择的generate语句,因为您无法动态地重新生成硬件。

你有两件事要做:

  • 将您的输出作为regs传递(然后不要在案例中使用assign,而是使用非阻止作业<=
  • 使用单独的结果导线在case语句之外实例化你的加法器和减法器,在相应的情况下,你的输出将把它作为值。

这样做会导致输出连接在由{S2,S1,S0}控制的多路复用器的输出上,并且在switch-case语句中指定了不同的输入。