检索 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
,因此我不必在两个地方手动跟上它,减少错误。
有没有办法通过探测生成的类型的成员来获取 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
,因此我不必在两个地方手动跟上它,减少错误。