如何在凿子中使寄存器的寄生矢量化

时间:2018-05-10 02:02:02

标签: 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))
}

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

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

2 个答案:

答案 0 :(得分:2)

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

val coeffs = RegInit(rstVal)

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

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

答案 1 :(得分:2)

让我们从简单的案例开始吧。如果代替var myName = document.querySelector("my-name"); myName.componentOnReady().then(() => { myName.setName('Bob', 'Smith'); }); Vec SInt我的rstVa l数组而不是scala集合(SeqArray,...,这会更容易)常规的SInt。如果可能,最好在您直接需要之前保存实际硬件的生成。如果rstVal包含Int' s。你的代码将成为

 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不足以包含传入的常量,则可能会出现问题。您可能应该对此进行一些检查。