如何在Chisel中初始化Reg of Bundle?

法比恩

我声明了我的特定数据的捆绑包:

class RValue (val cSize: Int = 16) extends Bundle {
  val rvalue = Output(UInt(cSize.W))
  val er     = Output(UInt((cSize/2).W))
  val part   = Output(Bool()) /* set if value is partial */
}

我想将其用作模块中的寄存器:

  val valueReg = Reg(new RValue(cSize))
//...
  valueReg.rvalue := 0.U
  valueReg.er := 0.U

那很好。但我想使用RegInit()在寄存器声明中对其进行初始化。可能吗 ?

  val valueReg = RegInit(new RValue(cSize), ?? ) ??
杰克·科尼格

Chick使用Bundle Literals的答案是很酷的新方法,它很不错,因为您可以在单个表达式中给Bundle任意值。

如果您只想在重置类型时将寄存器清零,则始终可以将原义零转换为捆绑:

val valueReg = RegInit(0.U.asTypeOf(new RValue(cSize))

您可以根据需要对任何文字执行类似的操作,但是除非您将所有内容清零或将所有内容设置为1,否则我不建议您这样做。

为了将每个字段设置为其他值,我认为Chick的方法更好,但是您在较旧代码中看到的普通样式如下:

val valueReg = RegInit({
  val bundle = Wire(new RValue(cSize))
  bundle.rvalue := 1.U
  bundle.er := 2.U
  bundle.part := 3.U
  bundle
})

在Scala中,您可以将{ }表达式放在任何地方,并且Block中的最后一个表达式将是返回值。因此,我们可以使用要将寄存器重置为的值创建一个Wire,然后将该Bundle作为初始化值传递。相当于写:

val valueRegInit = Wire(new RValue(cSize))
valueRegInit.rvalue := 1.U
valueRegInit.er := 2.U
valueRegInit.part := 3.U
val valueReg = RegInit(valueRegInit)

我希望这有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章