Используйте аннотации FIRRTL для подключения многобитных проводов и контактов - PullRequest
4 голосов
/ 07 октября 2019

Я записываю некоторые первые преобразования и использую аннотации для соединения выводов и проводов, например:

 val named = ComponentName(inputWire.name, ModuleName(mod.name, CircuitName(top)))
 val anno = Traversable(SinkAnnotation(named, pinName))

inputWire :

 val inputWire = DefWire(NoInfo,localNS.newTemp, con.expr.tpe)

И pinName - это строка:

val pinName = namespace.newName(faultPinPrefix)

, где тип inputWire равен UIntType (IntWidth (2)) илиможет быть больше 2 в некоторых других случаях.

После этого преобразования я запускаю firrtl.passes.wiring.WiringTransform для выдачи соединений. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что вывод verilog выглядит следующим образом:

input       faultPin_0
//...
//Some code
//..
 assign _GEN_1 = {{1'd0}, faultPin_0};

Это не то поведение, которого я ожидаю. Он создает входной порт только в 1 бит и объединяет его, создает 2-битный сигнал. Возможно, проблема в том, что я не указываю тип порта, я позволяю компилятору выбрать его, и он автоматически создает 1-битный порт. Есть ли способ сделать это соединение с помощью аннотаций, или я должен сосредоточиться на поиске другого подхода, который является более осуществимым.

1 Ответ

3 голосов
/ 07 октября 2019

WiringTransform будет подключать многобитовые компоненты, а включает и включает проверку этого .

Однако тип вывода является функцией источника , а не функцией сток . Можете ли вы проверить, что ваш источник также является многобитовым сигналом?

Для теста, упомянутого выше, указана следующая FIRRTL:

circuit Top :
  module Top :
    input clk: Clock
    inst x of X
    x.clk <= clk
    reg r: UInt<5>, clk
  module X :
    input clk: Clock
    wire s: UInt<5>

И следующие аннотации:

  • SourceAnnotation(ComponentName("r", ModuleName("Top", CircuitName("Top"))), "pin")
  • SinkAnnotation(ComponentName("s", ModuleName("X", CircuitName("Top"))), "pin")

Производит следующую схему при работе через WiringTransform:

circuit Top :
  module Top :
    input clk: Clock
    wire r_0 : UInt<5>
    inst x of X
    x.clk <= clk
    reg r: UInt<5>, clk
    x.pin <= r_0
    r_0 <= r
  module X :
    input clk: Clock
    input pin: UInt<5>
    wire s: UInt<5>
    s <= pin

Это кажется правильным. Однако, если я сделаю источник 1-битным сигналом (reg r: UInt<1>, clk), то вывод также будет 1-битным (input pin : UInt<1>).

...