简单(但错误)的Verilog代码

时间:2018-02-26 12:51:15

标签: verilog

我正在尝试使用Verilog语言实现ALU;作为第一种方法,我想模​​拟它的这个非常简单的版本:

module alu(opcode, in1, in2, result);
 input[4:0] opcode;
 input[11:0] in1, in2;
 output[11:0] result;

 case(opcode)
   5'b00000 assign result=in1+in2;
   5'b00010 assign result=in1;
   5'b00011 assign result=in1+1;
   5'b01000 assign result=in1<<1;
   5'b01001 assign result=in1>>>1;
   5'b10001 assign result=in1 && in2;
   5'b10010 assign result=in1 || in2;
 endcase

endmodule

无论简单性如何,我都会收到此编译错误:

 case(opcode)
           |
 *E,NOTPAR: Illegal operand for constant expression [4(IEEE)].

我真的无法弄清楚代码有什么问题。

1 个答案:

答案 0 :(得分:6)

1)如果您使用的是verilog 2001语法,请将case放在组合总是阻止(例如always @ (*))。

2)删除assign关键字,将result声明为output reg

3)在条件之后加:,例如5'b0000:

4)注意算术运算中可能出现的溢出

5)逻辑andor将为您提供1位结果,但您将其分配给12位输出。也许你想要上述操作的按位版本(谷歌差异)?