Я пытаюсь написать преобразование Scala для firrtl, и в какой-то момент у меня есть несколько проводов, которые должны быть подключены к входному порту. Поскольку число проводов может быть слишком большим, я не хочу соединять каждый провод с портом, но объединить все провода вместе и использовать один порт с большей шириной.
Я использую функцию seqCat:
val seq_cat = seqCat(wires.map(x=>WRef(x.name,port.tpe,WireKind,BIGENDER)))
, затем я подключаю выход cat, который является выражением, составленным из нескольких кошек:
val connect_pin = Connect(NoInfo, seq_cat, WRef(port.name, port.tpe, PortKind, BIGENDER))
ПосколькуВыражение connect_pin довольно сложное:
Connect(,DoPrim(cat,List(WRef(_GEN_0,UIntType(IntWidth(3)),WireKind,BIGENDER), DoPrim(cat,ArrayBuffer(WRef(_GEN_1,UIntType(IntWidth(3)),WireKind,BIGENDER), WRef(_GEN_2,UIntType(IntWidth(3)),WireKind,BIGENDER)),List(),UIntType(UnknownWidth))),List(),UIntType(UnknownWidth)),WRef(faultPin,UIntType(IntWidth(3)),PortKind,BIGENDER))
Я пытаюсь разбить его на более простые узлы, используя функцию Splitter , предоставленную в Chisel Bootcamp, и вывод splitter - это то, что ожидалось:
Block(ArrayBuffer(DefNode(,_GEN_6,DoPrim(cat,ArrayBuffer(WRef(_GEN_1,UIntType(IntWidth(3)),WireKind,BIGENDER), WRef(_GEN_2,UIntType(IntWidth(3)),WireKind,BIGENDER)),List(),UIntType(UnknownWidth))), DefNode(,_GEN_7,DoPrim(cat,List(WRef(_GEN_0,UIntType(IntWidth(3)),WireKind,BIGENDER), WRef(_GEN_6,UIntType(UnknownWidth),ExpKind,UNKNOWNGENDER)),List(),UIntType(UnknownWidth))), Connect(,WRef(_GEN_7,UIntType(UnknownWidth),ExpKind,UNKNOWNGENDER),WRef(faultPin,UIntType(IntWidth(3)),PortKind,BIGENDER))))
Когда я запускаю преобразование, я получаю ошибку во время выполнения:
======== Starting Transform CheckGenders$ ========
[error] (run-main-0) firrtl.passes.CheckGenders$WrongGender: @[:Top_adder_muxed.fir@22.2]: [module Top_adder] Expression _GEN_7 is used as a FEMALE but can only be used as a MALE.
[error] firrtl.passes.CheckGenders$WrongGender: @[:Top_adder_muxed.fir@22.2]: [module Top_adder] Expression _GEN_7 is used as a FEMALE but can only be used as a MALE.
[error] at firrtl.passes.CheckGenders$.firrtl$passes$CheckGenders$$check_gender$1(Checks.scala:511)
[error] at firrtl.passes.CheckGenders$.firrtl$passes$CheckGenders$$check_genders_s$1(Checks.scala:542)
[error] at firrtl.passes.CheckGenders$$anonfun$firrtl$passes$CheckGenders$$check_genders_s$1$4.apply(Checks.scala:558)
[error] at firrtl.passes.CheckGenders$$anonfun$firrtl$passes$CheckGenders$$check_genders_s$1$4.apply(Checks.scala:558) ``` ```
Я не понимаю, почему происходит эта ошибка, это просто провод, который должен быть связан с входомпорт. Тот факт, что этот провод является выходом кошки, он не делает его МУЖЧИНОЙ, потому что просто соединяет несколько проводов, оператор кошки не синтезирует драйвер для управления проводами.
Если выесть подсказка, я застрял на несколько дней с этой ошибкой.