如何在凿子中参数化寄存器向量
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
,这是创建具有重置值的寄存器的首选方法。
让我们从简单的案例开始。如果您的 rstVa
l 数组不是 SInt
的 Vec
,而是一个 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”,并且每个寄存器都不同。
我的用例是一个通用滤波器系数组,每个系数组都有一些独特的重置值,当然还有一个覆盖值的选项。 我想到了类似下面的代码(不太确定如何编写迭代,所以这是一种伪代码):
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
,这是创建具有重置值的寄存器的首选方法。
让我们从简单的案例开始。如果您的 rstVa
l 数组不是 SInt
的 Vec
,而是一个 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 不足以包含您传入的常量,则可能会出现问题。您可能应该对此进行一些检查。