检索 RegInit 的重置值

Retrieve the reset value of RegInit

有没有办法通过探测生成的类型的成员来获取 RegInit 的重置值?我可以看到 RegInit 将 return 类型(例如 UInt)。例如,我将有一个寄存器,我想通过 regmap

对其进行控制
val myRWReg = RegInit(3.U(10.W))

// ...

node.regmap(
  0x0 -> Seq(RegField(10.W, myRWReg,
               RegFieldDesc("myRWReg", "A RW Register.", reset = myRWReg.init)))
)

.init 不是一个可访问的成员,但显示在这里是为了暗示它是我正在寻找的。

有没有办法做到这一点,以便在使用 RegFieldDesc 时,重置描述可以匹配硬件而无需保留另一个变量?

A workaround/solution 是在我的示例中使 3.U 成为一个 val ,它根据任何参数进行更改并简单地传递它,但不确定是否还有其他内容可以用。

您可能还对DescribedReg感兴趣: https://github.com/chipsalliance/rocket-chip/blob/30e38e83a1a427bba5441afad83bde947fa75542/src/main/scala/regmapper/DescribedReg.scala#L7

它同时构建寄存器及其描述。 示例用法: https://github.com/chipsalliance/rocket-chip/blob/30e38e83a1a427bba5441afad83bde947fa75542/src/main/scala/tile/BusErrorUnit.scala#L58

我最终想出了一些可能对其他人有用的东西。我还想做的一件事是不必显式声明 Reg。我希望通过连接推断出这一点。例如,我有一个 SW 寄存器在 Bundle 上驱动一个 8 位“端口”。我可以制作一个 Reg,但如果它根据参数发生变化,我需要跟上尺寸。

object WavRWReg{
  
  def apply[T <: Data](connection : T, reset: T, name: String, desc: String = ""): RegField = {
    //val reg = RegInit(reset)
    val reg = RegInit(connection.cloneType, reset)
    
    reg.suggestName("swi_" + name)
    
    connection := reg
    
    //litValue returns the Bigint value
    val rf = RegField(reg.getWidth, reg.asUInt, RegFieldDesc(name, desc, access=RegFieldAccessType.RW , reset=Some(reset.litValue)))
    rf
  }
}

因此,这会创建 Reginit 到指定的重置值,并且宽度是从连接类型推断出来的。重置值也会发送到 RegFieldDesc,因此我不必在两个地方手动跟上它,减少错误。