条件批量连接 <>

Conditional Bulk Connection <>

我想对双向总线进行有条件的批量连接,概念如下。

val io = IO(new Bundle {
  val master = Decoupled(UInt(8.W))
  val slave0 = Flipped(Decoupled(UInt(8.W)))
  val slave1 = Flipped(Decoupled(UInt(8.W)))
  val select = Input(Bool())
})

when (select) {
  io.slave0 <> io.master
  io.slave1 <> some_null_decoupled
}.otherwise {
  io.slave1 <> io.master
  io.slave0 <> some_null_decoupled
}

这比必须单独描述 io.master.readyio.slave0.bitsio.slave0.valid、...等信号的逻辑更清晰。

是否有类似的语法可以使用?当我在我的代码中尝试这样做时,我收到了很多 firrtl.passes.CheckInitialization$RefNotInitializedException 消息。

我怀疑问题出在 some_null_decoupled 的描述上。除了缺少 some_null_decoupled 这一事实之外,这看起来很正常。以下对我来说很好用(使用 Chisel 3.1.6):

import chisel3._
import chisel3.util._

class ConditionalBulkConnect extends Module {
  val io = IO(new Bundle {
    val master = Decoupled(UInt(8.W))
    val slave0 = Flipped(Decoupled(UInt(8.W)))
    val slave1 = Flipped(Decoupled(UInt(8.W)))
    val select = Input(Bool())
  })

  val some_null_decoupled = Wire(Decoupled(UInt(8.W)))
  some_null_decoupled.ready := false.B

  when (io.select) {
    io.slave0 <> io.master
    io.slave1 <> some_null_decoupled
  }.otherwise {
    io.slave1 <> io.master
    io.slave0 <> some_null_decoupled
  }
}

object ConditionalBulkConnectTop extends App {
  chisel3.Driver.execute(args, () => new ConditionalBulkConnect)
}

这有什么帮助吗?否则您能否提供更多信息,例如 some_null_decoupled 的实现和 Chisel 的版本?