我试图编写一个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 语句if( temp == 4'b1000) begin
。 如果在always_comb中还有什么,我该怎么办?
您正在生成不是组合电路的锁存器。
为了避免这种情况,您必须确保在每个可能的路径中为每个变量分配一个值。有两种方法可以做到这一点:
-
为每个"如果"都有一个最终的"else"(你有那个,所以这很好(,并为每种情况都有一个默认值(你没有这样做!
-
在开始时为每个变量分配一个默认值。