Как параматизировать вектор регистров в долото - PullRequest
0 голосов
/ 10 мая 2018

Мне нужен пример того, как параметризировать Вектор регистров в терминах битовой ширины и начальных значений, которые не равны '0' и различны для каждого регистра.

Мой вариант использования - это общий банк коэффициентов фильтра с некоторыми уникальными значениями сброса для каждого и, конечно же, возможностью переопределения значений. Я подумал о чем-то вроде приведенного ниже кода (не совсем уверен, как написать итерацию, так что это своего рода псевдо):

class Coeffbank(bitWidth : UInt ,ncoeff : UInt, rstVal : Vec(SInt)) extends Module {
    // how do iterate through the reset vector ?? //
    val coeffs   = Vec.fill(ncoeff) {Reg(init = SInt(rstVal(i),width = bitwidth))
}

Кроме того, при обновлении описанного выше (создание экземпляра этого модуля, как передать список значений сброса в список аргументов?

Надеюсь получить некоторую помощь о том, как правильно написать.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Давайте начнем с простого случая.Это было бы намного проще, если бы вместо Vec из SInt s ваш массив rstVa l представлял собой коллекцию scala (Seq, Array, ...) обычного SInt.По возможности, лучше всего сохранять фактическое оборудование, пока оно вам не понадобится.Если rstVal содержит Int.Ваш код станет

 val newRstVals = VecInit(Seq.tabulate(ncoeff) { index => rstVals(index).S(bitWidth.W) })
 val reg = RegInit(newRstVals)

Если вам действительно нужно передать Vec, то правильный подход - создать отдельный экземпляр типа и использовать вызов с двумя аргументами для RegInit

val vecType = Vec(ncoeff, SInt(bitWidth.W))
val newRstVals1 = VecInit(Seq.tabulate(ncoeff) { index => newRstVals(index) })
val reg = RegInit(vecType, newRstVals1)

Могут возникнуть проблемы, если передаваемое вами значение bitWidth недостаточно велико для того, чтобы содержать переданные вами константы. Возможно, вам следует проверить это.

0 голосов
/ 10 мая 2018

Объяснение, вероятно, должно быть более подробным, но в основном вам нужно создать Reg of Vec . Что-то вроде должно это сделать:

val coeffs = RegInit(rstVal)

В этом случае, поскольку у вас уже есть Vec значений сброса, вы можете просто передать его конструктору Reg.

Я предполагаю, что размер rstVal равен ncoeff, в противном случае вам нужно уменьшить размер rstVal на что-то вроде rstVal.take(ncoeff). Также обратите внимание, что я использую RegInit, который является предпочтительным способом создания регистра со значением сброса.

...