назначение векторного диапазона долота hdl

Я новичок в Chisel HDL. У меня вопрос относительно назначения Vec. Предположим, у меня есть Vec с n элементами, и каждый из них имеет w-битный SInt,

Как я могу назначить диапазон элементов, допустим, у меня есть два Vec: a = Vec(10, SInt(width=8)), у меня есть b = Vec(3, SInt(width=8)), как я могу назначить b := a(2:4)?

Я знаю, что могу сделать это в цикле for, есть ли более элегантный способ сделать это? Я не нашел ни одного примера кода или материалов по нему.


person Sufeng Niu    schedule 15.09.2016    source источник


Ответы (2)


Кажется, вы ищете функцию среза в Vec. Просматривая класс Vec, я не смог найти такую ​​функцию.

Итак, краткий ответ: нет, элегантного способа сделать это «из коробки» не существует.

Второй самый элегантный способ — поместить такую ​​функцию в библиотеку util вашего проекта и попытаться в конечном итоге получить эту функцию вверх по течению.

Реализация этого в Chisel3 может выглядеть примерно так:

class FooTester extends BasicTester {
  def slice[T <: Data](someVec: Vec[T], startIndex: Int, endIndex: Int) : Vec[T] = {
    Vec( for (i <- startIndex to endIndex) yield someVec(i) )
  }

  // An initialized Vec
  val a = Vec(
    Range(0, 10)
      .map(SInt(_, width=8))
  )

  // A declared Vec
  val b = Wire(Vec(3, SInt(width=8)))

  b := slice(a, 2, 4)

  assert(b(1) === SInt(3, width=8))

  when(Counter(10).inc()) {stop()}
}
person Sebastian Bøe    schedule 13.11.2016

for (i ‹- от 3 до 8) { my_vec(i) := something_at_index(i) }

person Sebastian Bøe    schedule 15.09.2016
comment
да, я знаю, что это способ записи цикла for, но есть ли более элегантный способ сделать это? - person Sufeng Niu; 15.09.2016