这些端口名称问题在 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
,您将获得所需的行为。
假设有一个 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
,您将获得所需的行为。