我正在尝试在具有参数化数据类型的模块中部署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))
该如何解决?谢谢!
答案 0 :(得分: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)
与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))
我不确定它们是否会起作用,但是它们可能会