Как расширить пакет chisel3 до определенной ширины, значения this.getWidth?

Я переинтерпретирую некоторую структуру пакета chisel3 в другой пакет. сказать,

val a = Wire(new BundleA)
val b = Wire(new BundleB)
b := a.asTypeOf(b)

Ширина двух пакетов разная, мне нужно расширить BundleB до ширины BundleA, чтобы BundleB выровнялся с BundleA, начиная с MSB.

Я пытался

class BundleB extends Bundle{
 val sub    = UInt(subfield.W)
 val dummy  = UInt((fullwidth - this.getWidth).W)
}

Но ширина B по-прежнему составляет всего subfield, а не fullwidth.

Итак, как создать связку определенной ширины с фиктивными данными и текущей шириной?


person Hoohoo    schedule 23.04.2020    source источник


Ответы (1)


На самом деле это ошибка, заключающаяся в том, что Chisel здесь не ошибается, но this.getWidth заставляет Chisel разрешать BundleB слишком рано, захватывая sub как поле, но игнорируя dummy.

Не существует встроенного способа получить «текущую ширину бега» Bundle, который вы строите, вам нужно будет сделать это самостоятельно, например:

class BundleB(val subfieldWidth: Int, val fullWidth: Int) extends Bundle {
  val sub   = UInt(subfieldWidth.W)
  private val currentWidth = subfieldWidth // + ... if you have other fields
  val dummy = UInt((fullWidth - subfieldWidth).W)
}
person Jack Koenig    schedule 23.04.2020
comment
Я так и использую. Но это больно, если в бандле много полей. Если есть способ настроить сигналы MSB, этого тоже должно быть достаточно. - person Hoohoo; 24.04.2020
comment
Если я правильно понимаю и осталось только одно поле неизвестным, тогда вы можете оставить его как неизвестную ширину UInt(), и тогда оно будет установлено путем вывода ширины, когда вы начнете его с a. - person Jack Koenig; 24.04.2020