如果在系统Verilog中为其他情况

时间:2019-12-12 23:36:07

标签: verilog system-verilog

我试图编写一个ALU组件。

wire[4:0] OP = Instruction[8:4];
wire[3:0] temp = Instruction[8:5];
always_comb begin
  if( temp == 4'b1000)  begin
    Halt   = 0;
    branch_en = 1;
    lookup_en = 0;
    reg_wr_en = 0;
    ALU_src =   0;
    MEM_WRITE = 0;
    Acc_wrt  =  0;
    Mem_Acc =   0;
    Acc_src =   2'b00;
  end 
  else if(temp == 4'b1111) begin
    Halt   = 0;
    branch_en = 1;
    lookup_en = 0;
    reg_wr_en = 0;
    ALU_src =   0;
    MEM_WRITE = 0;
    Acc_wrt  =  0;
    Mem_Acc =   0;
    Acc_src =   2'b00;
  end
  else begin
    case(OP)
      0:  begin
        Halt   = 0;
        branch_en = 0;
        lookup_en = 0;
        reg_wr_en = 1;
        ALU_src =   0;
        MEM_WRITE = 0;
        Acc_wrt  = 0;
        Mem_Acc =   0;
        Acc_src =   2'b00;       
      end
      1:  begin

        Halt   = 0;
        branch_en = 0;
        lookup_en = 0;
        reg_wr_en = 0;
        ALU_src =   0;
        MEM_WRITE = 0;
        Acc_wrt  =  1;
        Mem_Acc =   0;
        Acc_src =   2'b00;       
      end
      ....
      15:  begin
        // Halt inst
        Halt   = 1;
        branch_en = 0;
        lookup_en = 0;
        reg_wr_en = 0;
        ALU_src =   0;
        MEM_WRITE = 0;
        Acc_wrt  =  0;
        Mem_Acc =   0;
        Acc_src =   2'b01;       
      end
    endcase 
  end
 end

所以基本上我首先要检查指令[8] 我收到错误消息Error (10166): SystemVerilog RTL Coding error at Ctrl.sv(23): always_comb construct does not infer purely combinational logic. Ctrl.sv(23)首先if( temp == 4'b1000) begin是if语句。 如果在always_comb中还有其他方法,怎么办?

1 个答案:

答案 0 :(得分:2)

您正在生成的锁存器不是组合电路。

为避免这种情况,必须确保在每个可能的路径中为每个变量分配一个值。有两种方法可以做到:

  1. 每个'if'都有一个最终的'else'(您有这个意思,这样很好),每个案例都有一个默认值(您还没有这样做!)。

  2. 在开始时为每个变量分配一个默认值。