【问题标题】:how to override/extend chisel signal naming如何覆盖/扩展凿子信号命名
【发布时间】:2019-12-19 10:11:42
【问题描述】:

这似乎不是一件容易的事情,甚至是不可能的,但我们使用了一种命名约定,即在 verilog 中为输入/输出使用前缀或后缀信号“i_”或“o_”。

在凿子库中是否有一些方法可以解决或覆盖这个问题?

我看到除了时钟和复位,所有信号都有“io”前缀。 是否可以只使用“i”作为输入,“o”作为输出?

【问题讨论】:

    标签: chisel


    【解决方案1】:

    最简单的方法是使用MultiIOModule。但是,您也可以使用 suggestName 进行操作。两种方法如下所示。

    多IOModule

    这是一个更灵活的Module,让您可以多次调用IO 方法向模块添加端口。 (Module 要求您定义一个 io 成员,并且只允许您调用一次 IO。)

    因为MultiIOModule 将您从val io = ... 的约束中解放出来,您可以将您想要的前缀/后缀命名与您的val 名称一起使用。然后,反射命名将在生成的 Verilog 中正确处理这些内容。

    考虑以下凿码:

    import chisel3._
    import chisel3.stage.{ChiselStage, ChiselGeneratorAnnotation}
    
    class Foo extends MultiIOModule {
    
      val i_bar = IO(Input(Bool()))
      val o_baz = IO(Output(Bool()))
    
      o_baz := ~i_bar
    
    }
    
    (new ChiselStage).execute(Array.empty, Seq(ChiselGeneratorAnnotation(() => new Foo)))
    

    这会产生以下 Verilog:

    module Foo(
      input   clock,
      input   reset,
      input   i_bar,
      output  o_baz
    );
      assign o_baz = ~ i_bar;
    endmodule
    

    建议名称

    作为替代方案,您可以使用suggestName 方法将名称更改为不同于反射命名(从val 的名称中获取名称)将使用的名称。

    使用suggestName,您可以将名称强制为您想要的任何名称。以下 Chisel 产生与上述相同的 Verilog:

    class Foo extends MultiIOModule {
    
      val a = IO(Input(Bool())).suggestName("i_bar")
      val b = IO(Output(Bool())).suggestName("o_baz")
    
      b := ~a
    
    }
    

    【讨论】:

    • 这解决了部分问题。 val 名称实际上是 Bundle 层次结构进一步链式命名的基础。它不是由属性决定的前缀,但可以根据其性质重命名 IO。但我猜基于 IO 属性的命名会破坏“”操作。
    猜你喜欢
    • 2014-06-16
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2015-10-31
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多