如何在特定条件下将其他IO添加到Chisel中的RoCCIO

时间:2018-04-04 02:56:18

标签: riscv chisel

我正在尝试使用ROCC向RISC-V添加自定义指令,而我的基础是火箭芯片。 某些加速器需要将额外的IO添加到RoCCIO类中。 我试图理解附加IO的条件实例化,就像浮点单元& page table walker(PTW),我是Chisel& amp;斯卡拉对我来说非常神秘。

有人可以解释这段代码如何实现条件实例化:

    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
}

2 个答案:

答案 0 :(得分:1)

这个问题可能更适合火箭芯片库,因此开发人员会看到它:https://github.com/freechipsproject/rocket-chip/issues

话虽如此,有几种方法可以在Chisel代码中有条件地实例化。

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

答案 1 :(得分:1)

你的RoCC的例子是使用死码消除(但是,你必须小心地将你不能使用的信号联系起来)。

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

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