首页 > 解决方案 > 如何在 Chisel 中初始化 Bundle 的 Reg?

问题描述

我为我的特定数据声明了一个 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), ?? ) ??

标签: chisel

解决方案


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

如果您只想在复位类型时将寄存器清零,您总是可以从字面零转换为 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)

我希望这有帮助!


推荐阅读