我需要一个关于如何根据位宽和初始值参数化寄存器向量的示例,这些值不是“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))
}
另外,当新建上述内容时(实例化此模块,如何在参数列表中传递重置值列表?
希望得到一些关于如何正确书写的帮助。
解释可能应该更彻底一点,但基本上你需要创建一个Vec的Reg。类似的事情应该这样做:
val coeffs = RegInit(rstVal)
在这种情况下,由于您已经有了重置值的 Vec,因此您可以将其传递给 Reg 构造函数。
我假设
rstVal
的大小等于 ncoeff
,否则您需要使用 rstVal
之类的东西来减小 rstVal.take(ncoeff)
的大小。另请注意,我使用的是 RegInit
,这是创建具有重置值的寄存器的首选方法。
让我们从简单的案例开始。如果你的
Vec
l 数组不是 SInt
的 rstVa
而是常规 SInt 的 scala 集合(Seq
,Array
,...),那么这会容易得多。如果可能的话,最好保存实际硬件的生成,直到您直接需要它们为止。如果 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)
如果您传入的位宽不足以包含您传入的常量,则可能会出现问题。您可能应该对此进行一些检查。