如何在特定条件下向 Chisel 中的 RoCCIO 添加额外的 IO
How to add additional IO under certain condition to RoCCIO in Chisel
我正在尝试使用 ROCC 向 RISC-V 添加自定义指令,我的基础是火箭芯片。
一些加速器需要将额外的 IO 添加到 RoCCIO class。
我试图了解附加 IO 的条件实例化,例如浮点单元和页面 table walker (PTW) 的情况,我是 Chisel & Scala 的新手,所以它对我来说非常神秘。
谁能解释一下这段代码是如何实现条件实例化的:
class RoCCIO(outer: LazyRoCC)(implicit p: Parameters) extends RoCCCoreIO()(p) {
val ptw = Vec(p(RoccNPTWPorts), new TLBPTWIO)
val fpu_req = Decoupled(new FPInput)
val fpu_resp = Decoupled(new FPResult).flip
}
这个问题可能更适合 rocket-chip 存储库,因此那些开发人员会看到它:https://github.com/freechipsproject/rocket-chip/issues
也就是说,有几种方法可以在 Chisel 代码中有条件地实例化事物。
- 继承:当一个 Bundle 扩展另一个 Bundle 时,它可以添加额外的字段,因此包含这些字段取决于哪个 Bundle 实际被实例化
- 死代码消除:Chisel/FIRRTL 具有强大的死代码消除功能,因此如果某些端口未使用,它们将被简单地删除。因此,可以在不使用它们的配置中有条件地删除这些字段。 我相信这里是这种情况(但不确定)。
您的 RoCC 示例正在使用无用代码消除(但是,为了确保万无一失,您必须小心关闭未使用的信号)。
您可以改为使用 Option 在 IO 包声明中执行条件实例化:
val a = if (cond) Some(UInt(width=5.W)) else None
我正在尝试使用 ROCC 向 RISC-V 添加自定义指令,我的基础是火箭芯片。 一些加速器需要将额外的 IO 添加到 RoCCIO class。 我试图了解附加 IO 的条件实例化,例如浮点单元和页面 table walker (PTW) 的情况,我是 Chisel & Scala 的新手,所以它对我来说非常神秘。
谁能解释一下这段代码是如何实现条件实例化的:
class RoCCIO(outer: LazyRoCC)(implicit p: Parameters) extends RoCCCoreIO()(p) {
val ptw = Vec(p(RoccNPTWPorts), new TLBPTWIO)
val fpu_req = Decoupled(new FPInput)
val fpu_resp = Decoupled(new FPResult).flip
}
这个问题可能更适合 rocket-chip 存储库,因此那些开发人员会看到它:https://github.com/freechipsproject/rocket-chip/issues
也就是说,有几种方法可以在 Chisel 代码中有条件地实例化事物。
- 继承:当一个 Bundle 扩展另一个 Bundle 时,它可以添加额外的字段,因此包含这些字段取决于哪个 Bundle 实际被实例化
- 死代码消除:Chisel/FIRRTL 具有强大的死代码消除功能,因此如果某些端口未使用,它们将被简单地删除。因此,可以在不使用它们的配置中有条件地删除这些字段。 我相信这里是这种情况(但不确定)。
您的 RoCC 示例正在使用无用代码消除(但是,为了确保万无一失,您必须小心关闭未使用的信号)。
您可以改为使用 Option 在 IO 包声明中执行条件实例化:
val a = if (cond) Some(UInt(width=5.W)) else None