锁存器检测(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))