如何在 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)
希望对您有所帮助!
我为我的特定数据声明了一个包:
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)
希望对您有所帮助!