如何覆盖/扩展凿子信号命名

时间:2019-12-19 10:11:42

标签: chisel

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

在凿子库中是否有某种方法可以使之混乱或覆盖?

我看到,除了时钟和复位外,所有信号都带有“ io”前缀。 可以仅将“ i”用作输入,将“ o”用作输出吗?

1 个答案:

答案 0 :(得分:5)

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

MultiIOModule

这是一种更加灵活的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

或者,您可以使用suggestName方法将名称更改为与反射命名(从val的名称中获取名称)不同。

使用suggestName可以将名称强制为任意名称。以下凿子产生与上面相同的Verilog:

class Foo extends MultiIOModule {

  val a = IO(Input(Bool())).suggestName("i_bar")
  val b = IO(Output(Bool())).suggestName("o_baz")

  b := ~a

}