我试图编写一个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中还有其他方法,怎么办?
答案 0 :(得分:2)
您正在生成的锁存器不是组合电路。
为避免这种情况,必须确保在每个可能的路径中为每个变量分配一个值。有两种方法可以做到:
每个'if'都有一个最终的'else'(您有这个意思,这样很好),每个案例都有一个默认值(您还没有这样做!)。
在开始时为每个变量分配一个默认值。