Когда я попробовал описанное выше, я получил 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))
Я не уверен, что они будут работать, но они могут