【问题标题】:How to initialize a Reg of Bundle in Chisel?如何在 Chisel 中初始化 Bundle 的 Reg?
【发布时间】:2019-11-26 11:13:55
【问题描述】:

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


    【解决方案1】:

    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 中,您可以将 { } 放在任何需要表达式的地方,并且 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)
    

    我希望这会有所帮助!

    【讨论】:

    • 感谢 jkoening 和 @chick,这正是我想知道的。
    • 根据 scala 编译器警告,零输出解决方案似乎已被弃用:[deprecated] Data.scala:488 (1 calls): litArg is deprecated: "litArg is deprecated, use litOption or litTo*Option"
    • 这是我们自己的弃用,看起来 Chisel 中的代码本身正在调用一个弃用的函数,哎呀!你可以放心地忽略它。
    • 感谢您提请我注意。我已经修复了 (github.com/freechipsproject/chisel3/pull/1256),它应该在 3.2.2 中修复
    【解决方案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)))
    

    【讨论】:

    • 谢谢。我认为它是实验性的,是否有路线图可以在官方“稳定”版本中发布?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多