警惕不完整 if 语句生成锁存器
采用if语句描述组合逻辑时,对于不完备的if语句,即缺少else分支的if语句要格外关注,因为综合工具会将其视为锁存器。
1、锁存器生成原理
组合逻辑电路不应该具有记忆功能,而当if语句没有覆盖所有可能的输入条件时,综合工具会认为在未覆盖的条件下需要保持信号的原有值,这就需要生成锁存器(Latch)来实现 “保持” 功能。
锁存器是电平敏感的存储元件,会带来时序不稳定、功耗增加以及难以进行时序分析等问题。
2、错误示例
// 不完备的if语句,会生成锁存器
always @(*) begin
if (en)
q = data;
// 缺少else分支,当en为0时,q会保持原有值,综合为锁存器
end
3、正确示例
补全else分支,明确处理所有未覆盖的条件。
方法1:
// 补全else分支,避免锁存器
always @(*) begin
if (en)
q = data;
else
q = 1'b0;
end
方法2:
在always块开头为信号赋初值,确保所有路径都有明确的赋值:
// 赋初值避免锁存器
always @(*) begin
q = 1'b0; // 初值
if (en)
q = data;
end