如何使用参数化值初始化寄存器
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))
我不确定这些是否有效,但它们可能
我正在尝试在具有参数化数据类型的模块中部署 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))
我不确定这些是否有效,但它们可能