Chisel3 类型与 FixedPoint 数组不匹配

Chisel3 type mismatch with Array of FixedPoint

在 Scala 中,我们可以这样声明一个包含双精度、长整型和布尔型数组的 ArrayBuffer:

val A = new ArrayBuffer[Array[(Long, Array[Double], Array[Double], Double, Boolean)]]

我想用凿子做同样的事情。
在凿子中,我知道一种将长度为 n 的向量声明为输入的方法如下:

val X  = Input(Vec(n,FixedPoint(16.W, 8.BP)))

其中 n 是 Int,这有效。
现在我也尝试初始化一个包含 n 个 FixedPoint 的数组,并执行了以下操作:

   val C = Array(Array.ofDim(FixedPoint(16.W, 8.BP)))(n,0)

灵感来自

但这没有用。 我收到错误

    type mismatch;
[error]  found   : chisel3.core.FixedPoint
[error]  required: Int
[error]    val tabHash1 = Array(Array.ofDim(FixedPoint(16.W, 8.BP)))(n,0)

拜托,有人能给出在 chisel 中声明 FixedPoint 上面的 A 和 FixedPoint 数字数组的正确方法吗? 谢谢!供您关注和回复。

Chisel 将遵循 Scala 集合声明的普通规则。 我不确定您要在此处创建什么,但参数不太正确 Array.ofDim 用于创建多维数组,因此如果您尝试创建 FixedPoint 的二维数组,您需要。

val C = Array.ofDim[FixedPoint](m, n)

其中 n 和 m 是二维尺寸。您已将 Array.ofDim 包装在另一个数组中,所以也许您实际上想要一个 3 维数组 定点,即

    val C = Array.ofDim[FixedPoint](k, m, n)

这两种技术都会给出具有 FixePoint 的所有槽的数组,但它们不会被填充,所以您真正想要的可能是

val C = Array.fill(k, m, n)(FixedPoint(16.W, 8.BP)

然后您可以根据需要将这些固定点连接在一起。

C(0, 0,0) := C(1, 1, 1) + C(2, 2, 2)

可能是一个例子。

如果您需要使用硬件索引访问 FixedPoint 元素,您将需要 Vec 而不是 Array。初始化 Vec 的最简单方法是使用元素序列。可以使用

创建 FixedPoint 的二维 Vec
val c = Vec(Seq.fill(n)(Vec(Seq.fill(m)(FixedPoint(16.W, 8.BP)))))

我建议查看 Scala Land vs Chisel Land 了解在 Scala 中使用 Chisel 的一些背景知识。