【发布时间】:2019-12-19 10:11:42
【问题描述】:
这似乎不是一件容易的事情,甚至是不可能的,但我们使用了一种命名约定,即在 verilog 中为输入/输出使用前缀或后缀信号“i_”或“o_”。
在凿子库中是否有一些方法可以解决或覆盖这个问题?
我看到除了时钟和复位,所有信号都有“io”前缀。 是否可以只使用“i”作为输入,“o”作为输出?
【问题讨论】:
标签: chisel
这似乎不是一件容易的事情,甚至是不可能的,但我们使用了一种命名约定,即在 verilog 中为输入/输出使用前缀或后缀信号“i_”或“o_”。
在凿子库中是否有一些方法可以解决或覆盖这个问题?
我看到除了时钟和复位,所有信号都有“io”前缀。 是否可以只使用“i”作为输入,“o”作为输出?
【问题讨论】:
标签: chisel
最简单的方法是使用MultiIOModule。但是,您也可以使用 suggestName 进行操作。两种方法如下所示。
这是一个更灵活的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
}
【讨论】: