简单(但错误)的Verilog代码

简单(但错误)的Verilog代码,verilog,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 re

我正在尝试使用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
我真的不知道代码有什么问题。

1)将
大小写
放在组合框always块中(即
always@(*)
如果您使用的是verilog 2001语法)

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

3) 在条件后放置
,如
5'b0000:

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

5) 逻辑
将为您提供1位结果,但您将其分配给12位输出。也许您需要上述操作的按位版本(google TheDifference)?

1)将
大小写
放在组合始终块中(即如果您使用的是verilog 2001语法,则
始终(*)

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

3) 在条件后放置
,如
5'b0000:

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


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

您需要在
始终@*
块中结束case语句。此外,删除
assign
语句并将
result
声明为
reg
。请参阅(此链接)[了解Verilog中的案例说明。这里有很多问题。请查看您的Verilog参考。具体查看(组合)always blocks和case项的语法。那么,在case语句中使用wire数据类型是否非法?在always块中驱动导线是非法的。您需要将
结果
更改为
reg
。或者您可以完全删除case语句,并使用嵌套的三元运算符和单个assign语句。您不应该这样做在always块中也使用
assign
语句。这意味着在case语句中没有赋值/您需要将case语句包装在
always@*
块中。此外,删除
assign
语句并将
result
声明为
reg
。请参阅(此链接)[了解Verilog中的案例陈述。这里有很多问题。请查看您的Verilog参考资料。具体查看(组合)always blocks和case项的语法。那么,在case语句中使用wire数据类型是否非法?在always块中驱动导线是非法的。您需要将
结果
更改为
reg
。或者您可以完全删除case语句,并使用嵌套的三元运算符和单个assign语句。您不应该这样做在always块中也使用
assign
语句。这意味着在case语句中没有赋值/
 case(opcode)
           |
 *E,NOTPAR: Illegal operand for constant expression [4(IEEE)].