首页 > 解决方案 > 如何覆盖/扩展凿子信号命名

问题描述

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

是否有一些方法可以在凿子库中弄乱或覆盖它?

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

标签: chisel

解决方案


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

多IO模块

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

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

考虑以下 Chisel 代码:

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

}

推荐阅读