仿真里看起来“没问题”的组合逻辑,综合后却出现了意料之外的锁存器。常见原因是某些输入条件下,代码没有给输出赋新值,硬件就必须保留上一次的值。
always_comb begin if (en) y = a; end
当en为0时,y没有被赋新值,逻辑需要保持先前状态。
always_comb begin y = '0; if (en) y = a; end
先给默认值,再覆盖满足条件的分支,所有路径都有确定赋值。

代码审查不要只看always块名字
if没有else:检查条件不成立时输出是否仍有默认赋值。
case不完整:检查所有合法状态和default分支,尤其是状态机输出和译码逻辑。
循环或条件赋值:确认每个可能执行路径都覆盖了输出变量。
赋值类型:组合逻辑通常使用阻塞赋值;时序逻辑通常使用非阻塞赋值,并在时钟边沿更新寄存器。
怎么确认是锁存器而不是触发器?
查看综合报告与RTL Viewer/Technology Schematic,检查是否出现latch类原语;再回到代码定位未覆盖的分支。若设计确实需要电平敏感存储,应明确写出设计意图并核对使能时序,而不是简单地把所有锁存器都判为错误。
在组合逻辑里写默认值可以消除意外锁存器,但默认值必须符合功能规格。随意把输出清零虽然能让综合结果“变干净”,却可能改变原本需要的行为。
面试参考答法
锁存器推断通常意味着有某些执行路径没有对组合输出赋值,综合工具为了保持旧值就需要存储行为。我会检查if/case是否覆盖完整、是否有默认赋值,再看综合原理图确认。若确实需要锁存器则明确设计和时序约束;若目标是组合逻辑,就保证所有路径都赋值。
追问:为什么不完整的case在仿真中可能没暴露问题?因为测试激励可能没有覆盖到缺失分支,综合却必须为所有可能输入组合实现硬件行为。

扫码关注






























