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

时间:2019-11-26 11:13:55

标签: chisel

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

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), ?? ) ??

2 个答案:

答案 0 :(得分:2)

BundleLiterals是执行此操作的新方法。首先

import chisel3.experimental.BundleLiterals._

然后

val valueReg = RegInit((new RValue(cSize)).Lit(_.rvalue -> 1.U, _.er -> 2.U, _.part -> true.B)

使用OutputBinding在Bundle中声明字段可能会出现一些问题。我可能会忽略它,并在必要时仅包装输出,例如

val rValueOut = IO(Output(new RValue(csize)))

答案 1 :(得分:2)

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)

我希望这会有所帮助!