【问题标题】:Simple (yet wrong) Verilog code简单(但错误)的 Verilog 代码
【发布时间】: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


【解决方案1】:

1) 将case 放在组合始终块中(即always @ (*),如果您使用的是verilog 2001 语法)。

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

3) 在条件后面加上:,如5'b0000:

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

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

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 2014-08-16
    • 2011-09-21
    • 1970-01-01
    • 2013-11-30
    • 2014-04-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多