Verilog 设计32位算术逻辑单元(ALU)

Verilog 设计32位算术逻辑单元(ALU),verilog,alu,Verilog,Alu,我为一个ALU写了这个编码器。该ALU通过ctrl信号进行控制,并执行一些操作,如加法、减法和,或。。。当输出为零时,oZero信号应激活 我在标记的行中有一些错误。我犯了什么错 module ALU_32 (iA, iB ,iCin ,ctrl, oCarry,oZero, out); input [31:0] iA,iB; output [31:0] out; input iCin,ctrl; output oCarry,oZero; reg [31:0] out; reg oCar

我为一个ALU写了这个编码器。该ALU通过
ctrl
信号进行控制,并执行一些操作,如加法、减法和,或。。。当输出为零时,
oZero
信号应激活

我在标记的行中有一些错误。我犯了什么错

module ALU_32 (iA, iB ,iCin ,ctrl, oCarry,oZero, out);    
input [31:0] iA,iB;
output [31:0] out;
input iCin,ctrl;
output oCarry,oZero;
reg [31:0] out;
reg oCarry;
reg oZero;
always@ (ctrl)
    begin 
        case(ctrl)
            4'b0: out<=iA&iB;
            4'b0001: out<=iA|iB;
            4'b0010: {oCarry ,out}<=iA+iB;
            4'b0011: out<=iA~|iB;    //error
            4'b0100: 
            begin 
                if(iA==iB)
                    out<=32'b1;
            end  
            4'b0101: out<=iA-iB;  //error
            4'b0110:    //error
            begin 
                if(iA<iB)
                    out<=32'b1;
                else
                    out<=32'b0;
                end
            4'b0111:   out<=iA*iB;     //error
            4'b1000: out<=iA/iB;        //error

        end
       always@(out)
           begin
               if(out==0)
                   oZero<=1;
               end

      endmodule
模块ALU_32(iA、iB、iCin、ctrl、OCARY、oZero、out);
输入[31:0]iA,iB;
输出[31:0]输出;
输入iCin,ctrl;
奥泽罗;
注册[31:0]出;
登记册;
雷格·奥泽罗;
始终@(ctrl)
开始
案例(ctrl)

4'b0011:out中使用的4'b0:out
~
运算符正如邱所指出的,
iA~| iB
应该是
~(iA | iB)
,并且缺少一个
尾框。除此之外:

  • ctrl
    需要4位宽。IE
    input[3:0]ctrl
  • 组合块需要声明灵敏度列表中的所有元素或使用自动灵敏度。使用
    always@(ctrl)
    时,模拟器将不使用see changes in
    iA
    iB
    。而是使用
    始终@*
    进行自动灵敏度。对于组合逻辑,应始终使用自动灵敏度,除非您仅限于1995年版本的IEEE Std 1364(很可能您没有),在这种情况下,您需要
    始终@(ctrl或iA或iB或iCin)
    。2001年,标准中增加了自动灵敏度(
    @*
    @(*)

  • 编译时不应使用非阻塞赋值(
    @toolic:)和
    语法错误。这些是消息:
    语法错误。意外标记:4'b0110[\u BINARY\u BASE]。预期标记:'.'、'''.'、'('、'.'、''.'''.'.'
    语法错误。意外标记:~[O\u RNOR]。预期标记:'['、'.'(*'、'('、'.+'、'.'-'.
    out <= ~(iA | iB);
    
    always @* begin
      case(ctrl)
      4'b0000 :
        begin
          out = iA&iB;
          oCarry = 1'b0;
        end
      // conditions assigning both 'out' and 'oCarry'
      default:
        begin
          out = 32'0;
          oCarry = 1'b0;
        end
      endcase
    end
    
    always @* begin
      // default value
      out = 32'd0;
      oCarry = 1'b0;
      // calculate value, override default
      case(ctrl)
        4'b0000 : out = iA&iB;
        // ...
        4'b0010: {oCarry ,out} = iA+iB;
        // ...
        4'b1000: out = iA/iB;
      endcase
    end
    
    module ALU_32 (    
      input [31:0] iA, iB,
      input        iCin,
      input [3:0]  ctrl,
      output reg  oCarry, oZero,
      output reg [31:0] out );