动态地在凿子中创建模块,同时将动态参数传递给这些模块

Creating Modules in chisel dynamically and at the same time passing dynamic parameters to those modules

考虑这个例子

for(x <- 0 until numberOfHWBlocks){
    val hw_block = Module(new HW_BLOCK(x)(p :Parameters)).io
}

每次这都会根据 x 是什么创建一个新模块。我想要的是我不想每次都将 val hw_block 声明为 for 循环内的单独实体,因为此值会覆盖先前的值。我想将这些模块的序列存储在一个 val 中。像这样

for( x <- 0 until numberOfHWBlocks){
    hw_block(x) = Module(new HW_BLOCK(x)(p :Parameters)).io
}

其中hw_block定义为for循环外的Seq

val hw_block = Seq.fill(numberOfHWBlocks){//What do I have to instantiate here??//}

你考虑过制表吗

val hw_block = Seq.tablulate(numberOfHardHWBlocks) { x =>
  Module(new HW_BLOCK(x)(p :Parameters)).io
}

tabulate 类似于文件,但让您能够区分哪个元素是 正在实例化

注意:我认为您创建模块的语法有点错误。我认为它应该是 Module(new HW_BLOCK(...)).io,这会创建模块然后 returns io 包以供参考 HW_Block

tabulate 就像评论中一样,小鸡的回答是最好的答案,但我会提供更多的上下文,因为 tabulate 是一种特殊情况,当你想从从 0.

开始的整数范围

假设我有一个 Seq of Strings,我想构建一个 Seq of Modules,我该怎么做?许多刚接触 Chisel 和 Scala 的人会想到 for 循环和突变。虽然在 Scala 中我们通常更喜欢使用不可变类型和函数式编程,但您仍然可以通过突变来实现这一点:

val myModules = ArrayBuffer[MyModule]()
val myParams = Seq("foo", "bar")
for (param <- myStrings) {
  myModules += Module(new MyModule(param)) // .io if you just want the io ports
}

这更类似于您最初的想法,那么我怎样才能以类似于 Seq.fillSeq.tabulate 的方式使其更具功能性呢?我们可以采用我们希望传递的参数 Seq,并在其上添加 map

val myParams = Seq("foo", "bar")
val myModules = myParams.map(param => Module(new MyModule(param)))

正如我之前所说,Seq.tabulate 是这种更通用的 map 模式的特例,其中您有一个整数范围,因此您的情况也可以表示为:

(0 until numberOfHWBlocks).map(x => Module(new HW_BLOCK(x)(p: Parameters).io))