Условное массовое соединение <> - PullRequest
0 голосов
/ 09 января 2019

Я хотел бы сделать условное массовое соединение двунаправленных шин, концептуально, как показано ниже.

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.ready, io.slave0.bits, io.slave0.valid, ... и т. Д.

Есть ли подобный синтаксис, который будет работать? Когда я пытаюсь сделать это в своем коде, я получаю много firrtl.passes.CheckInitialization$RefNotInitializedException сообщений.

1 Ответ

0 голосов
/ 09 января 2019

Я подозреваю, что проблема связана с описанием some_null_decoupled. Это выглядит в здравом уме, кроме того факта, что some_null_decoupled отсутствует. Следующее работает хорошо для меня (с помощью долота 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?

...