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

问题描述 投票:0回答:2

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

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

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

chisel
2个回答
2
投票

解释可能应该更彻底一点,但基本上你需要创建一个Vec的Reg。类似的事情应该这样做:

val coeffs = RegInit(rstVal)

在这种情况下,由于您已经有了重置值的 Vec,因此您可以将其传递给 Reg 构造函数。

我假设

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


2
投票

让我们从简单的案例开始。如果你的

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)

如果您传入的位宽不足以包含您传入的常量,则可能会出现问题。您可能应该对此进行一些检查。

© www.soinside.com 2019 - 2024. All rights reserved.