如何将零打包到凿子中

how to pack zeros in to bundles in chisel

我有一个关于将零打包成包的问题。例如考虑下一个代码:

    class CmplxNum(val bitwidth: Int) extends Bundle {
       val real = SInt(INPUT,bitwidth.W)
       val imag = SInt(INPUT,bitwidth.W)
    }  

    class MyClass extends Module {
       val io = IO(new Bundle {
          val in = new CmplxNum(16)
          val load = Bool(INPUT)
          val clr  = Bool(INPUT)
          ...
       })
       ...
       val sample = RegEnable(io.in,0.S,io.load) // <-- how do i set the reset value     
       When(io.clr) {
          sample <> sample.fromBits(0.S) // <-- I tried this it compiles, but dont know if it is correct  
       }

    }

如何在 RegEnable 和 clr 情况下将零打包到这个 Bundle 中? 对于 RegEnable,我得到了类型不匹配的详细说明错误,这很有意义

这是一种方法。它依赖于相对较新的 BundleLiterals (new CmplxNum(16)).Lit(_.real -> 0.S, _.imag -> 0.S)。我还稍微重构了您的代码以使用当前的 chisel3 习惯用法。如果没有特定需要,我不建议将您的 Input/Output 放在 Bundle 中。此外,更现代的方法是将 IO 字段包装在 Input() 或 Output()

import chisel3._
import chisel3.util.RegEnable
import chisel3.experimental.BundleLiterals._


class CmplxNum(val bitwidth: Int) extends Bundle {
  val real = SInt(bitwidth.W)
  val imag = SInt(bitwidth.W)
}

class MyClass extends Module {
  val io = IO(new Bundle {
    val in = Input(new CmplxNum(16))
    val load = Input(Bool())
    val clr  = Input(Bool())
      ...
  })

    ...
  val sample = RegEnable(
    io.in,
    init = (new CmplxNum(16)).Lit(_.real -> 0.S, _.imag -> 0.S),
    enable = io.load
  )
  when(io.clr) {
    sample <> sample.fromBits(0.S) // <-- I tried this it compiles, but dont know if it is correct
  }

}