【问题标题】:Creating Modules in chisel dynamically and at the same time passing dynamic parameters to those modules在凿子中动态创建模块,同时将动态参数传递给这些模块
【发布时间】:2020-08-04 00:50:57
【问题描述】:

考虑这个例子

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??//}

【问题讨论】:

  • Seq.tabulate(numberOfHWBlocks)(x =&gt; Module(new HW_BLOCK(x)(p :Parameters).io))

标签: scala chisel


【解决方案1】:

你考虑过制表

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

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

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

【讨论】:

    【解决方案2】:

    tabulate 和评论中一样,Chick 的回答是最好的答案,但我会提供更多的上下文,因为tabulate 是一种特殊情况,当你想从一系列整数中构建时0.

    假设我有一个StringsSeq,我想从中构造一个Seq 的模块,我该怎么做?许多不熟悉 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 的方式使其更具功能性?我们可以把我们希望传递的参数的Seqmap 放在上面:

    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))
    

    【讨论】:

    • 在创建输入和输出引脚时有没有办法做到这一点?假设我有一个 val ip = Input(Vec(numberOfHWBlocks, new someNewBundle(p : Parameters)(x))) 其中 x 可以是一些动态发送的参数?
    • 这是可能的,但更复杂。您不能使用Vec,因为Vec 要求它的所有元素都具有相同的类型,但是您可以使用Record 来做到这一点。公平的警告,它是一个更高级的 API,我建议打开另一个关于它的 StackOverflow 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2015-10-20
    • 2017-12-13
    • 2018-03-16
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多