Как инициировать регистр с параметризованным значением - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь развернуть 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 голосов
/ 28 сентября 2018

Когда я попробовал описанное выше, я получил 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 к тому же типу, что и значение init, например.

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

Или, возможно, вы можете привести 0, а такжеустановите ширину:

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

Я не уверен, что они будут работать, но они могут

...