减去两个32位输入时出现Icarus Verilog语法错误?

时间:2016-03-10 01:21:13

标签: verilog iverilog

我第一周学习Verilog时遇到了非常令人沮丧的经历。

我正在尝试编译以下代码 - 来自mipsalu.v

module MIPSALU (ALUctl, A, B, ALUOut, Zero);
  input [3:0] ALUctl;
  input [31:0] A,B;
  output reg [31:0] ALUOut;
  output Zero;
  assign Zero = (ALUOut==0); //Zero is true if ALUOut is 0; goes anywhere
  always @(ALUctl, A, B) //reevaluate if these change
    case (ALUctl)
      0: ALUOut <= A & B;
      1: ALUOut <= A | B;
      2: ALUOut <= A + B;
      3: ALUOut <= A ^ B;
      6: ALUOut <= A – B;
      7: ALUOut <= A < B ? 1:0;
      12: ALUOut <= ~(A | B); // result is nor
      default: ALUOut <= 0; //default to 0, should not happen;
    endcase
endmodule

当我尝试使用iverilog -o test mipsalu.v编译时,iverilog告诉我

mipsalu.v:13: syntax error
I give up.

当我删除有问题的行并再次编译时,没有错误 -

module MIPSALU (ALUctl, A, B, ALUOut, Zero);
  input [3:0] ALUctl;
  input [31:0] A,B;
  output reg [31:0] ALUOut;
  output Zero;
  assign Zero = (ALUOut==0); //Zero is true if ALUOut is 0; goes anywhere
  always @(ALUctl, A, B) //reevaluate if these change
    case (ALUctl)
      0: ALUOut <= A & B;
      1: ALUOut <= A | B;
      2: ALUOut <= A + B;
      3: ALUOut <= A ^ B;
      //6: ALUOut <= A – B;
      7: ALUOut <= A < B ? 1:0;
      12: ALUOut <= ~(A | B); // result is nor
      default: ALUOut <= 0; //default to 0, should not happen;
    endcase
endmodule

非常感谢任何见解。谢谢!

编辑:值得一提的是我使用MinGW / MSYS在Windows 8.1上运行Icarus Verilog的第10版

1 个答案:

答案 0 :(得分:4)

不确定您是如何做到的,但您的ng-repeat="item in SearchItems| filter:searchTerm:strict" 是ISO 8859-1下扩展ASCII中的字符。收到ascii-code.com ASCII码编号为150 DEC(HTML代码)。 Verilog期待&#150; ASCII码编号45 DEC(HTML代码-)。

两者看起来几乎相同; - (&#45;)只比 - (&#150;)长几个像素,至少对某些字体而言。

可能是你的文本编辑器正在动态地改变它,认为破折号看起来更容易阅读。

仅供参考:在Verilog中,您通常希望为组合逻辑分配阻塞分配(&#45;),并为顺序逻辑分配非阻塞分配(=)。您对组合逻辑使用非阻塞,应该更改为阻塞。

<=是合法的,但请注意,还有always @(ALUctl, A, B)(或always @*为SystemVerilog),这是一个自动敏感列表。如果您错过了灵敏度列表中的项目,则模拟中的verilog功能行为和合成的功能行为可能会有所不同。

如果要减少某些输入,可能需要尝试ANSI标头样式。已经多次讨论了其他问题(https://stackoverflow.com/search?q=%5Bverilog%5D+ANSI