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

How to initialize a Reg of Bundle in 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() 在 Register 声明中初始化它。可能吗?

  val valueReg = RegInit(new RValue(cSize), ?? ) ??

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

Chick 关于使用 Bundle Literals 的回答是一种很酷的新方法,而且很好,因为您可以在单个表达式中为 Bundle 赋予任意值。

如果您只想在重置类型时将寄存器清零,您总是可以从文字零转换为 Bundle:

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

如果你愿意,你可以对任何文字做类似的事情,但我不会推荐它,除非你清零或将所有内容设置为 1s。

为了将每个字段设置为其他值,我认为 Chick 的方法更好,但您在旧代码中看到的正常样式类似于:

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

在 Scala 中,您可以将 { } 放在任何需要表达式的地方,块中的最后一个表达式将是 return 值。因此,我们可以创建一个包含我们想要将寄存器重置为的值的 Wire,然后将该 Bundle 作为初始化值传递。这相当于写:

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

希望对您有所帮助!