使用 FIRRTL Annotations 连接多位线和引脚

Use FIRRTL Annotations to connect multi-bit wires and pins

我正在写下一些 firrtl 转换,我正在使用注释来连接引脚和电线,例如:

 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 位端口。 有什么方法可以使用注解建立这种联系,或者我应该专注于寻找另一种更可行的方法。

WiringTransform 将连接多位组件, include a test of this

但是,引脚类型是 source 的函数,而不是 sink 的函数。你能确认你的信号源也是多位信号吗?

对于上面引用的测试,以下 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>)。