推荐答案
测试一下
题目
5.2 产生锁存器latch的代码
参考答案与知识点
参考答案
锁存器(latch)是一种电平敏感的存储单元,与边沿触发的触发器不同。在数字设计中,latch通常是非预期的,会导致时序分析复杂化和功耗问题。产生latch的典型场景是在组合逻辑代码中,当条件分支不完整时,综合工具推断出latch来保持未指定情况下的输出值。常见错误包括:在always块中使用if语句但缺少else分支,或在case语句中缺少default分支,且always块的敏感列表不完整(如缺少电平敏感信号)。例如以下Verilog代码:
always @(a or b) begin
if (a) q = b;
end
当a=0时,q保持前值,综合出latch。正确做法是添加else分支:
always @(a or b) begin
if (a) q = b;
else q = 0; // 或赋其他确定值
end
类似地,case语句缺少default也会产生latch。此外,在组合逻辑中,敏感列表应包含所有输入信号,若只列出部分信号,也会导致latch。例如:
always @(a) begin
if (a) q = b;
end
这里b不在敏感列表中,综合工具会认为b变化时q不变,从而推断latch。因此,编写组合逻辑时,应确保条件完整(if-else对应,case-full/parallel),敏感列表使用always @(*)或always_comb(SystemVerilog)自动推导。值得注意的是,有时设计者有意使用latch(如用于低功耗或高速路径),但应明确定义并标注。在笔试面试中,常见考点是识别并修正产生latch的代码。
涉及知识点
- latch与触发器区别
- 组合逻辑条件不完整
- if-else与case-default
- 敏感列表完整性
- Verilog always @(*)用法
- 综合推断latch的避免方法