Как указать пакет Blackbox, который сопоставляется с `input [127:0]`, но действует как Vec(2, UInt(64)) в исходном коде Chisel?
Я хочу взаимодействовать с полной кросс-панелью AXI, порты которой выглядят примерно так:
input [(NM * AXI_DATA_WIDTH) - 1:0] S_AXI_XYZ0,
...
output [(NS * AXI_SOMETHING_WIDTH - 1:0] M_AXI_XYZ0
...
где NM обозначает количество мастеров, а NS обозначает количество ведомых устройств. Как вы понимаете, каждый из портов кроссбара будет лишь частично подключен к каждому ведомому/ведущему.
Теперь в идеале я хотел бы определить набор долот, например
class AxiXbar(val AXI_DATA_WIDTH: Int, val NS: Int, ...) extends Bundle {
val S_AXI_XYZ0 = Vec(NS, UInt(AXI_DATA_WIDTH))
...
}
но как только я использую это, чтобы дать Blackbox свой интерфейс
class MyXbar extends Blackbox {
val io = IO(new AxiXbar)
}
Зубило попытается верилогизировать
MyXbar
к чему-то вроде
MyXbar inst #(...) (
...
.S_AXI_XYZ0_0(foo_wire_0)
.S_AXI_XYZ0_1(foo_wire_0)
...
)
Это нормально, когда Chisel генерирует полный дизайн, но при взаимодействии с модулем Blackbox мне нужно, чтобы Chisel сгладил Chisel Vec только в один
S_AXI_XYZ0
вместо порта. Как я могу этого добиться?
Я знаю, что Chisel3 поддерживает DataView как метод изменения «формы» пакета интерфейса, но в их поваренной книге DataView они заявляют, что просмотр подслов (split/concat) еще не поддерживается.
Я пытался использовать макросы литья Chisel
asType(...)
или же
asUInt
. Без успеха, хотя, поскольку я не полностью понимаю, что они делают под капотом. Поэтому их сложно правильно применять.