这些端口名称问题在 BlackBox 中定义

port name issue of those are defined in the BlackBox

假设有一个 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 模块不匹配。 对于Module实例化,hook u_A端口的方式是

u_A.io.a

对于BlackBox实例化,hook u_A端口的方式是

u_A.io.io_a

请问有没有更方便的方法?

BlackBox 和 Module io emission 之间的不匹配是一个遗留问题 API 为了更好地与 Verilog IP 集成,Chisel 设计人员几乎无法控制 Verilog。我们正在考虑一种更明确和结构化的方式来处理此类 "invisible" 丢弃其前缀的捆绑包,因为在其他情况下它们会很有用。

不过,要回答您的问题,还有一种更方便的方法。我们正在试验我们称之为 "multi IO modules" 的方法,您可以在模块内多次使用 IO(...) 来创建端口。您在这里实际上不需要该功能,但它为我们提供了 chisel3.experimental.ExtModule——BlackBox 的替代方案。 ExtModule 不会静默删除前缀,因此如果您切换到扩展它而不是 BlackBox,您将获得所需的行为。