Chisel 如何部分初始化寄存器向量(例如,底层bundle类型的某些字段)

Chisel 如何部分初始化寄存器向量(例如,底层bundle类型的某些字段),chisel,Chisel,假设我有这样一个寄存器向量(ValidIO在UInt周围创建一个包,并添加一个“有效”字段): 以简洁的方式仅初始化Vec所有元素中的有效字段的最佳方法是什么?现在我知道如何将寄存器拆分为两个向量: val vDataReg = Reg(Vec(16, UInt(32.W))) val vValidReg = RegInit(VecInit(Seq.fill(16) {false.B})) 但这并不是重复使用我原来的ValidIO类型(一般来说可能更复杂)。您可以试试 val vreg = R

假设我有这样一个寄存器向量(ValidIO在UInt周围创建一个包,并添加一个“有效”字段):

以简洁的方式仅初始化Vec所有元素中的有效字段的最佳方法是什么?现在我知道如何将寄存器拆分为两个向量:

val vDataReg = Reg(Vec(16, UInt(32.W)))
val vValidReg = RegInit(VecInit(Seq.fill(16) {false.B}))
但这并不是重复使用我原来的ValidIO类型(一般来说可能更复杂)。

您可以试试

val vreg = Reg(Vec(16, ValidIO(UInt(32.W))))
vreg.foreach(_.valid := false.B)
我不知道是否有一种方法可以在一行/语句中完成

编辑:重置时初始化

val vreg = RegInit(Vec(Seq.fill(16) {
  val w = Wire(ValidIO(UInt(32.W)))
  w.valid := false.B
  w.bits := DontCare
  w
}))

有点冗长,但包含在单个块中

我需要类似于when(reset.toBool){vreg.foreach(u.valid:=false.B)}的东西,对吗?那么这个代码取决于复位极性,这不是很好。或者你的意思是,当我需要时,我会将它们重新分配给true.B,这是有意义的。对于“编辑:重置时初始化”之后的代码段,我相信它会在重置时将vreg所有元素的“.bits”字段也初始化为0。至少这是我在我的凿子版本(e2c5c128f6509805f71aeca790809b3e9a8fe84d)中生成的firrtl中看到的。这是预期的吗?你在最新版本中看到了吗?我进一步编辑了它以标记位
DontCare
。在3 master中,由于不是每个字段都被初始化,代码会出错。在您的版本中,默认情况下已初始化所有导线,因此我的代码现在应等同于在您的版本中没有
DontCare
。在bits字段中看到0的原因是,如果一条导线没有连接,FIRRTL将把它连接到0。这种行为类似于合成工具所做的。有关此行为的讨论,请参见。
val vreg = RegInit(Vec(Seq.fill(16) {
  val w = Wire(ValidIO(UInt(32.W)))
  w.valid := false.B
  w.bits := DontCare
  w
}))