锁存器检测(Latch detected)

简介

SpinalHDL 将检查在综合期间没有组合信号会引入锁存器。换句话说,这是检查没有组合信号被部分赋值。

示例

下面的代码:

class TopLevel extends Component {
  val cond = in(Bool())
  val a = UInt(8 bits)

  when(cond) {
    a := 42
  }
}

会报错:

LATCH DETECTED from the combinatorial signal (toplevel/a :  UInt[8 bits]), defined at
  ***
  Source file location of the toplevel/io_a definition via the stack trace
  ***

一个可能的修复方法是:

class TopLevel extends Component {
  val cond = in(Bool())
  val a = UInt(8 bits)

  a := 0
  when(cond) {
    a := 42
  }
}

因多路复用器产生的错误

检测到锁存器的另一个原因通常是不详尽、缺少默认值的 mux/muxList 语句:

val u1 = UInt(1 bit)
u1.mux(
  0 -> False,
  // case for 1 is missing
)

可以通过添加缺失的条件(或默认条件)来修复:

val u1 = UInt(1 bit)
u1.mux(
  0 -> False,
  default -> True
)

例如对于通用位宽代码,使用 muxListDc 通常是更好的解决方案,因为对于不需要默认值的情况,这不会生成错误:

val u1 = UInt(1 bit)
// automatically adds default if needed
u1.muxListDc(Seq(0 -> True))