xref: /XiangShan/src/main/scala/xiangshan/backend/issue/MultiWakeupQueue.scala (revision 8e208fb56a764bd2bd302c8a5ca6c86988b47f5a)
125bcff47SXuan Hupackage xiangshan.backend.issue
225bcff47SXuan Hu
325bcff47SXuan Huimport chisel3._
425bcff47SXuan Huimport chisel3.util._
525bcff47SXuan Huimport utils.PipeWithFlush
625bcff47SXuan Hu
725bcff47SXuan Huclass MultiWakeupQueueIO[T <: Data, TFlush <: Data](
825bcff47SXuan Hu  gen       : T,
925bcff47SXuan Hu  flushGen  : TFlush,
1025bcff47SXuan Hu  latWidth  : Int,
1125bcff47SXuan Hu) extends Bundle {
1225bcff47SXuan Hu  class EnqBundle extends Bundle {
1325bcff47SXuan Hu    val uop = Output(gen)
1425bcff47SXuan Hu    val lat = Output(UInt(latWidth.W))
1525bcff47SXuan Hu  }
1625bcff47SXuan Hu
1725bcff47SXuan Hu  val flush = Flipped(flushGen)
1825bcff47SXuan Hu  val enq = Flipped(Valid(new EnqBundle))
1925bcff47SXuan Hu  val deq = Output(Valid(gen))
2025bcff47SXuan Hu}
2125bcff47SXuan Hu
2225bcff47SXuan Huclass MultiWakeupQueue[T <: Data, TFlush <: Data](
2325bcff47SXuan Hu  val gen       : T,
2425bcff47SXuan Hu  val flushGen  : TFlush,
2525bcff47SXuan Hu  val latencySet: Set[Int],
2625bcff47SXuan Hu  flushFunc : (T, TFlush) => Bool,
2725bcff47SXuan Hu) extends Module {
2825bcff47SXuan Hu  require(latencySet.min >= 0)
2925bcff47SXuan Hu
30*8e208fb5SXuan Hu  val io = IO(new MultiWakeupQueueIO(gen, flushGen, log2Up(latencySet.max) + 1))
3125bcff47SXuan Hu
3225bcff47SXuan Hu  val pipes = latencySet.map(x => Module(new PipeWithFlush[T, TFlush](gen, flushGen, x, flushFunc))).toSeq
3325bcff47SXuan Hu
3425bcff47SXuan Hu  pipes.zipWithIndex.foreach {
3525bcff47SXuan Hu    case (pipe, i) =>
3625bcff47SXuan Hu      pipe.io.flush := io.flush
3725bcff47SXuan Hu      pipe.io.enq.valid := io.enq.valid && io.enq.bits.lat === i.U
3825bcff47SXuan Hu      pipe.io.enq.bits := io.enq.bits.uop
3925bcff47SXuan Hu  }
4025bcff47SXuan Hu
4125bcff47SXuan Hu  private val pipesValidVec = VecInit(pipes.map(_.io.deq.valid))
4225bcff47SXuan Hu  private val pipesBitsVec = VecInit(pipes.map(_.io.deq.bits))
4325bcff47SXuan Hu
4425bcff47SXuan Hu  io.deq.valid := pipesValidVec.asUInt.orR
4525bcff47SXuan Hu  io.deq.bits := Mux1H(pipesValidVec, pipesBitsVec)
4625bcff47SXuan Hu
47*8e208fb5SXuan Hu  assert(PopCount(pipesValidVec) <= 1.U, "PopCount(pipesValidVec) should be no more than 1")
4825bcff47SXuan Hu}
49