这似乎不是一件容易的事,甚至是不可能的,但是我们正在使用一种命名约定,即在verilog中为输入/输出信号加上“ i_”或“ o_”前缀或后缀。
在凿子库中是否有某种方法可以使之混乱或覆盖?
我看到,除了时钟和复位外,所有信号都带有“ io”前缀。 可以仅将“ i”用作输入,将“ o”用作输出吗?
答案 0 :(得分:5)
最简单的方法是使用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
可以将名称强制为任意名称。以下凿子产生与上面相同的Verilog:
class Foo extends MultiIOModule {
val a = IO(Input(Bool())).suggestName("i_bar")
val b = IO(Output(Bool())).suggestName("o_baz")
b := ~a
}