动态地在凿子中创建模块,同时将动态参数传递给这些模块
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.fill
和 Seq.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))
考虑这个例子
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.fill
和 Seq.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))