如何做模块向量?

时间:2015-11-10 01:50:14

标签: chisel

我想实例化一维元素数组,元素扩展Module。我该怎么做?如果我说出我最好的猜测,那就是:

val elements = Vec( 64, new element )

我收到以下错误消息:

[error] /Users/mykland/work/chisel/array.scala:20: overloaded method value apply with alternatives:
[error]   [T <: Chisel.Data](n: Int, gen: => T)Chisel.Vec[T] <and>
[error]   [T <: Chisel.Data](elt0: T, elts: T*)Chisel.Vec[T] <and>
[error]   [T <: Chisel.Data](gen: => T, n: Int)Chisel.Vec[T]
[error]  cannot be applied to (Int, ascenium.element)
[error]     val elements    = Vec( 64, new element )
[error]                       ^

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:9)

编辑:我正在添加我认为生成模块矢量的更好方法:

val my_args = Seq(1,2,3,4)
val exe_units = for (i <- 0 until num_units) yield
{
   val exe_unit = Module(new AluExeUnit(args = my_args(i)))
   // any wiring or other logic can go here
   exe_unit
}

请注意,此方法允许您以不同方式单独定制每个单元,并返回Chisel模块的Seq()。它也会产生更好看的硬件。

但是如果你真的需要能够动态索引到你的模块数组中,你可以像这样提取IO的Vec():

val exe_units_io = Vec(exe_units.map(_.io))

(这是旧的建议,我认为不太好)。

您可以按如下方式创建Vec of Modules:

val vec_of_elements = Vec.fill(n) {Module(new MyElement(my_args)).io }

但是请注意,Vec实际上只能是Wires或者寄存器,所以我们真的只是创建了一个IO线的Vec,恰好创建了我们关注的模块。