如何在特定条件下向 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 代码中有条件地实例化事物。

  1. 继承:当一个 Bundle 扩展另一个 Bundle 时,它​​可以添加额外的字段,因此包含这些字段取决于哪个 Bundle 实际被实例化
  2. 死代码消除:Chisel/FIRRTL 具有强大的死代码消除功能,因此如果某些端口未使用,它们将被简单地删除。因此,可以在不使用它们的配置中有条件地删除这些字段。 我相信这里是这种情况(但不确定)。

您的 RoCC 示例正在使用无用代码消除(但是,为了确保万无一失,您必须小心关闭未使用的信号)。

您可以改为使用 Option 在 IO 包声明中执行条件实例化:

val a = if (cond) Some(UInt(width=5.W)) else None