假设有一个B
模块,其中A
是一个实例。
class B extends Module {
…
val u_A = Module(new A)
// the way to hook u_A’s port is the issue
}
A
模块的说明:
class A extends Module {
val io = IO(new Bundle{
val a = Output(Bool())
})
io.a := true.B
}
A
BlackBox的声明:
class A extends BlackBox {
val io = IO(new Bundle{
val io_a = Output(Bool()) // HAVE to define port name with io_* prefix otherwise ...
})
}
您必须在BlackBox中定义前缀为io_的端口名称,否则B
RTL中生成的端口列表将与A
模块不匹配。
对于模块实例化,挂钩u_A端口的方式是
u_A.io.a
对于BlackBox实例化,挂钩u_A端口的方式是
u_A.io.io_a
你能否告诉我是否有更方便的方式?
答案 0 :(得分:1)
BlackBox和Module io发射之间的不匹配是一个传统的API,可以更好地与Verilog IP集成,而Chisel设计师几乎无法控制Verilog。我们正在考虑一种更明确和结构化的方式来处理这种“隐形”捆绑包,这些捆绑包会丢弃它们的前缀,因为在其他情况下它们会有用。
要回答你的问题,有一个更方便的方法。我们正在试验所谓的“多IO模块”,您可以在模块内多次使用IO(...)
来创建端口。您实际上并不需要此功能,但它为chisel3.experimental.ExtModule
提供了BlackBox
的替代功能。 ExtModule
不会以静默方式删除前缀,因此如果您切换为扩展前缀而不是BlackBox
,则会获得所需的行为。