如何消除1位ALU Verilog代码中生成的不必要latch锁存器
Verilog ALU锁存器问题修复方案
你的代码存在两个触发组合逻辑锁存器的原因:
- 4位位宽的OPCode共有16种取值,当前case仅覆盖了4种,剩余12种取值下两个输出信号都没有明确赋值
- 已覆盖的与运算(4'b0000)、或运算(4'b0001)分支中,仅对Result做了赋值,Cout没有赋值,同样会导致Cout生成锁存器
你可以通过补全所有分支的输出赋值、新增default分支覆盖未定义OPCode场景解决问题,修改后的代码如下:
module ALU( input wire [3:0] OPCode, input wire Operand1, input wire Operand2, input wire cin, output reg Result, output reg Cout ); always@(*) begin case(OPCode) 4'b0000: begin Result = Operand1 & Operand2; Cout = 1'b0; end 4'b0001: begin Result = Operand1 | Operand2; Cout = 1'b0; end 4'b0010: begin Result = cin ^ (Operand1 ^ (Operand2 ^ cin)); Cout = ((Operand2 ^ cin) & Operand1) | ((Operand1 ^ (Operand2 ^ cin)) & cin); end 4'b0110: begin Result = cin ^ (Operand1 ^ (Operand2 ^ cin)); Cout = ((Operand2 ^ cin) & Operand1) | ((Operand1 ^ (Operand2 ^ cin)) & cin); end // 覆盖所有未定义的OPCode场景 default: begin Result = 1'b0; Cout = 1'b0; end endcase end endmodule
你也可以选择在always块开头先给两个输出赋默认初始值,就不需要在每个分支重复写冗余的默认赋值逻辑。如果你的设计能保证输入OPCode只会出现你定义的4种取值,综合工具会自动优化掉default分支的逻辑,不会产生额外的资源开销。
内容的提问来源于stack exchange,提问作者Abde
相关产品推荐
相关产品推荐

