如何在凿子中参数化寄存器向量

How to Paramatrized vector of registers in chisel

我需要一个示例,说明如何根据位宽和初始值对寄存器向量进行参数化,这些位宽和初始值不是“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))
}

此外,当新建上述内容时(实例化此模块,我如何在参数列表中传递重置值列表?

希望得到一些关于如何正确编写它的帮助。

解释应该更透彻一点,但基本上你需要创建一个Reg of Vec。应该这样做:

val coeffs = RegInit(rstVal)

在这种情况下,因为你已经有了重置值的 Vec,你可以将它传递给 Reg 构造函数。

我假设 rstVal 的大小等于 ncoeff,否则您需要使用 rstVal.take(ncoeff) 之类的东西来减小 rstVal 的大小.另请注意,我使用的是 RegInit,这是创建具有重置值的寄存器的首选方法。

让我们从简单的案例开始。如果您的 rstVal 数组不是 SIntVec,而是一个 scala 集合(SeqArray、... ) 的常规 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 不足以包含您传入的常量,则可能会出现问题。您可能应该对此进行一些检查。