Создание модулей в chisel динамически и в то же время передача динамических c параметров этим модулям - PullRequest
2 голосов
/ 04 августа 2020

Рассмотрим этот пример

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

Каждый раз создается новый модуль в соответствии с любым значением x. Я хочу, чтобы я не объявлял каждый раз val hw_block как отдельный объект внутри for l oop, поскольку это значение переопределяет предыдущее значение. Я хочу, чтобы последовательность этих модулей хранилась в одном файле val. Что-то вроде этого

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

, где hw_block определяется как Seq вне for l oop

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

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Считали ли вы, что табуляция

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

tabulate похожа на файл, но дает вам возможность различать guish, какой элемент создается

Примечание: я думаю ваш синтаксис для создания модуля немного неправильный. Я думаю, это должно быть Module(new HW_BLOCK(...)).io, это создает модуль, а затем возвращает пакет io для справки в HW_Block

1 голос
/ 05 августа 2020

tabulate, как в комментарии, и ответ Chick - лучший ответ, но я предоставлю немного больше контекста, потому что tabulate - это своего рода особый случай, когда вы хотите построить из диапазона целых чисел, начиная с 0.

Допустим, у меня есть Seq из Strings, из которого я хотел построить Seq модулей, как бы мне это сделать? Многие, кто плохо знаком с Chisel и Scala, подумают о for l oop и мутации. В то время как в Scala мы обычно предпочитаем использовать неизменяемые типы и функциональное программирование, вы все равно можете выполнить sh это с помощью мутации:

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 параметров, которые мы передаем sh, и 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))
...