【发布时间】:2018-02-26 12:51:15
【问题描述】:
我正在尝试使用 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)].
我实在想不通代码有什么问题。
【问题讨论】:
-
您需要将 case 语句包含在
always@*块中。此外,删除assign语句并将result声明为reg。请参阅(此链接)[referencedesigner.com/tutorials/verilog/verilog_18.php] 了解 Verilog 中的案例陈述。 -
这里有不少问题。请查看您的 Verilog 参考资料。专门研究(组合)总是块和案例项目的语法。
-
那么,在case语句中使用wire数据类型违法吗?
-
在 always 块中驱动电线是非法的。您需要将
result更改为reg。或者您可以完全删除 case 语句并使用带有单个分配语句的嵌套三元运算符。 -
你也不应该在 always 块中使用
assign语句。意味着您的案例陈述中没有分配/
标签: verilog