未赋值的寄存器(Unassigned register)
简介
SpinalHDL将检查所有影响设计的寄存器是否已在某处被赋值。
示例
下面的代码:
class TopLevel extends Component {
  val result = out(UInt(8 bits))
  val a = Reg(UInt(8 bits))
  result := a
}
会报错:
UNASSIGNED REGISTER (toplevel/a :  UInt[8 bits]), defined at
  ***
  Source file location of the toplevel/a definition via the stack trace
  ***
一个可能的修复方法是:
class TopLevel extends Component {
  val result = out(UInt(8 bits))
  val a = Reg(UInt(8 bits))
  a := 42
  result := a
}
只有初始化(init)的寄存器
在某些情况下,由于设计参数化,生成一个没有赋值而只有 init 语句的寄存器可能是有意义的。
class TopLevel extends Component {
  val result = out(UInt(8 bits))
  val a = Reg(UInt(8 bits)) init(42)
  if(something)
    a := somethingElse
  result := a
}
会报错:
UNASSIGNED REGISTER (toplevel/a :  UInt[8 bits]), defined at
  ***
  Source file location of the toplevel/a definition via the stack trace
  ***
要修复这个问题,如果寄存器有一个 init 语句但没有赋值,你可以让SpinalHDL将该未赋值的寄存器转换为组合逻辑:
class TopLevel extends Component {
  val result = out(UInt(8 bits))
  val a = Reg(UInt(8 bits)).init(42).allowUnsetRegToAvoidLatch
  if(something)
    a := somethingElse
  result := a
}