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

时间:2018-09-28 17:56:30

标签: scala chisel

我正在尝试在具有参数化数据类型的模块中部署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)) 

该如何解决?谢谢!

1 个答案:

答案 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))

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