Несоответствие типа Chisel3 и массиву фиксированных точек

В Scala мы могли бы объявить ArrayBuffer массива Doubles, Long и Boolean одним из способов:

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 фиксированных точек и сделал следующее:

   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)

Пожалуйста, может ли кто-нибудь дать правильный способ объявления A выше для FixedPoint и массива чисел FixedPoint в chisel? Спасибо! за внимание и отзывы.


person Foutse    schedule 28.08.2017    source источник


Ответы (1)


Chisel будет следовать обычным правилам объявления коллекций Scala. Я не уверен, что вы здесь пытаетесь создать, но параметры не совсем правильные. Array.ofDim предназначен для создания многомерных массивов, поэтому, если вы пытаетесь создать двумерный массив FixedPoint, который вам нужен.

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

Где n и m - размеры в двух измерениях. Вы обернули Array.ofDim в другой массив, поэтому, возможно, вам действительно нужен трехмерный массив FixedPoint, который будет

    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 вместо массива. Самый простой способ инициализировать Vec - использовать последовательность элементов. Двумерный вектор вектора фиксированной точки может быть создан с помощью

val c = Vec(Seq.fill(n)(Vec(Seq.fill(m)(FixedPoint(16.W, 8.BP)))))

Я бы посоветовал взглянуть на Scala Land vs Chisel Land для получения дополнительной информации об использовании Chisel в Scala.

person Chick Markley    schedule 28.08.2017