如何使用参数化值初始化寄存器

How to init a register with a parametrized value

我正在尝试在具有参数化数据类型的模块中部署 RegInit。通常,对于 Chisel 中的一个简单端口,我会执行以下操作:

val myReg = RegInit (0.U(32.W))

在我的代码中,我有以下内容:

import dsptools._
import dsptools.numbers._

class Acc[A <: Data:Ring, B <: Data:Ring] (inType:A, outType:B, 

mulPipeLen:Int = 1, addPipeLen:Int = 1) extends Module {
...
  def zero = dsptools.numbers.Ring[B].zero

  val mres  = Reg(outType.cloneType) // this works, no initialization
  val ares  = RegInit(zero(outType.cloneType.getWidth.W)) // this fails trying to zero init in the parametrized Ring
...

}

其中return编译错误:

[error] Acc.scala:43:27: B does not take parameters
[error]   val mres  = RegInit(zero(outType.cloneType.cloneType.getWidth.W)) 

我该如何解决这个问题?谢谢!

当我尝试上述操作时,出现了 3 个错误:

[error] /Users/jack/work/chisel3-raw/src/main/scala/RegInit.scala:10:13: inferred type arguments [Object] do not conform to method apply's type parameter bounds [T <: chisel3.core.Data]
[error]   val reg = RegInit(0.U, (32.W))
[error]             ^
[error] /Users/jack/work/chisel3-raw/src/main/scala/RegInit.scala:10:23: type mismatch;
[error]  found   : chisel3.core.UInt
[error]  required: T
[error]   val reg = RegInit(0.U, (32.W))
[error]                       ^
[error] /Users/jack/work/chisel3-raw/src/main/scala/RegInit.scala:10:30: type mismatch;
[error]  found   : chisel3.internal.firrtl.Width
[error]  required: T
[error]   val reg = RegInit(0.U, (32.W))
[error]                              ^

RegInit 有两种风格,记录在此处:https://chisel.eecs.berkeley.edu/api/latest/chisel3/core/RegInit$.html

总之,如果只有1个参数,就是初始化值。如果初始化值具有定义的宽度(0.U(32.W)0.U),那么它将采用初始化值的宽度(和类型)。

val reg = RegInit(0.U(32.W))

否则,你可以给2个参数,第一个定义类型,第二个定义初始化值

val reg2 = RegInit(UInt(32.W), 0.U)

对编辑的回复 post

我对 dsptools 了解不多,但我认为 Ring 与零的概念没有太大关系。您可以将 ares 的类型设置为与 outType 相同,然后尝试将 0 转换为与初始值相同的类型,例如

val ares = RegInit(outType.cloneType, 0.U.asTypeOf(outType.cloneType))

或者您可以投射 0 并设置宽度:

val ares = RegInit(0.U(outType.getWidth.W).asTypeOf(outType.cloneType))

我不确定这些是否有效,但它们可能