我声明了我的特定数据包:
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), ?? ) ??
答案 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)
我希望这会有所帮助!