FPGA工程师看到综合报告中出现Latch,但设计者只写了一个组合always块,没有显式写存储单元。最常见原因并不是工具出错,而是代码要求信号在某些条件下保持上一次的值。

机制定位遗漏else与不完整case的共同点
组合逻辑应由当前输入唯一决定当前输出。若 if 的某条路径、case 的某个分支没有给信号赋值,综合器为了保留该信号旧值,可能推断电平敏感锁存器。它与边沿触发D触发器不同,在使能有效期间输出可随输入变化。
代码评审如何修正而不改坏原有功能
检查组合过程中的每个输出,是否在所有执行路径上被赋值;优先在过程开头给出有意义的默认值。
对于状态机,确保 next_state 与输出在所有状态分支都有定义,不用随意加入x作为运行时“默认硬件值”。
SystemVerilog 中可使用
always_comb帮助表达组合意图,并结合lint与综合报告检查意外锁存器。若确实需要存储行为,应明确选择寄存器或受控锁存器结构,而不是依赖遗漏赋值隐式生成。
参考回答解释为什么综合器这样做
“我会先查看组合always块中的if/else和case覆盖是否完整。只要有某条路径要求输出保持旧值,综合器就可能推断Latch。通常通过默认赋值、完整分支覆盖和lint检查来消除非预期存储行为,再跑仿真与综合对照。”
追问Latch就一定是错误的吗?
不是。锁存器本身是合法的时序单元,但在常见FPGA同步设计中,非预期Latch容易增加时序分析和验证复杂度。关键是设计意图是否明确、约束和时序是否正确。

扫码关注






























