1

我正在尝试将 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
...

}

返回编译错误:

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

我该如何解决?谢谢!

4

1 回答 1

3

当我尝试上述方法时,我遇到了 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)vs. 0.U),那么它将采用初始化值的宽度(和类型)。

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

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

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

对已编辑帖子的回应

我对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))

我不确定这些是否会起作用,但它们可能会

于 2018-09-28T18:47:49.267 回答