2

RegInit有没有办法通过探测产生的类型的成员来获取 a 的重置值?我可以看到 RegInit 将返回类型(例如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使用重置描述都可以匹配硬件而不必保留另一个变量?

一种解决方法/解决方案是3.U在我的示例val中根据任何参数进行更改并简单地传递它,但不确定是否还有其他可以使用的东西。

4

2 回答 2

0

我最终想出了一些可能对其他人有用的东西。我还想做的一件事是不必显式声明一个Reg. 我希望通过连接来推断这一点。例如,我有一个 SW 寄存器驱动Bundle. 我可以做一个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所以我不必在两个地方手动跟上它,减少错误。

于 2021-03-10T19:18:37.980 回答