Как создать массив / ve c модулей Chisel - PullRequest
2 голосов
/ 09 июля 2020

Я создал модуль CHISEL Class (extends) под названием SaturatingCounter (код ниже, если он актуален).

Мне нужен массив / Seq этих счетчиков в другом модуле.

EDIT : Я нашел этот ответ . Но когда я пытаюсь

 val vec_of_elements = Vec.fill(10) {Module(SaturatingCounter(4)).io}

, я получаю сообщение об ошибке

Error:(72, 29) value fill is not a member of object chisel3.Vec
  val vec_of_elements = Vec.fill(10) {Module(SaturatingCounter(4)).io}

Остальная часть исходного вопроса

Итак, я попытался создать Ve c, как показано ниже. Это не работает, потому что мой класс не относится к типу данных. Я мог бы заставить его наследовать данные, но поскольку я все еще новичок, это похоже на большой скачок.

var foo = Vec(10,SaturatingCounter(4))

Сообщение об ошибке:

Error:(46, 23) inferred type arguments [something.SaturatingCounter] do not conform to method apply's type parameter bounds [T <: chisel3.Data]
  var foo = Vec(10,SaturatingCounter(4))

Error:(46, 47) type mismatch;
 found   : something.SaturatingCounter
 required: T
  var foo = Vec(10,SaturatingCounter(4))

Правильно решение для создания массива / последовательности SaturatingCounter s?

SaturatingCounter :

class SaturatingCounter (bits: Int) extends Module {
  require(bits >= 2)
  val io = IO(new Bundle {
    val valOut: SInt = Output(SInt(bits.W))
    val inc: SInt = Input(SInt(bits.W))
  })

  val count = RegInit(SInt(bits.W), 0.S)

  val minVal: SInt = ((1 << (bits-1)).asUInt())(bits-1,0).asSInt()
  val maxVal: SInt = (((1 << bits) - 1) >> 1).asSInt(bits.W)

  var sum : SInt = count + io.inc

  var operandsSignSame : Bool = io.inc(bits-1) === count(bits-1)
  var sumSignDifferent: Bool = sum(bits-1) =/= count(bits-1)

  when(operandsSignSame && sumSignDifferent) {
    when(count(bits-1)) {
      count := minVal
    }.otherwise {
      count := maxVal
    }
  }.otherwise {
    count := sum
  }
  io.valOut := count
}

object SaturatingCounter {
  def apply(bits: Int): SaturatingCounter = new SaturatingCounter(bits)
}

1 Ответ

1 голос
/ 09 июля 2020

Попробуйте использовать это, чтобы создать модули и получить доступ к их io.

  val vec_of_elements = Vec(10, Module(SaturatingCounter(4)).io)

Это работает у меня.

Обратите внимание на .io, добавив это вы получаете несколько модулей типа Data, и у вас есть доступ ко всем io модулям, которые вы создали здесь.

Как правило, вам нужен Ve c, если вы хотите использовать Аппаратное индексирование элементов, или ваши элементы являются частью ввода-вывода. Если вам это не нужно, вы можете просто использовать коллекцию Scala, такую ​​как Seq, Array или аналогичные.

...