← 问题知识点

推荐答案 测试一下

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的避免方法
← 上一题
登录后反馈错题
下一题 →