xref: /XiangShan/src/main/scala/xiangshan/backend/issue/MultiWakeupQueue.scala (revision 0c7ebb58175b51109677230e8cbab09e73166956)
125bcff47SXuan Hupackage xiangshan.backend.issue
225bcff47SXuan Hu
325bcff47SXuan Huimport chisel3._
425bcff47SXuan Huimport chisel3.util._
525bcff47SXuan Huimport utils.PipeWithFlush
6*0c7ebb58Sxiaofeibao-xjtuimport xiangshan.backend.Bundles.ExuInput
7*0c7ebb58Sxiaofeibao-xjtuimport xiangshan.backend.exu.ExeUnitParams
825bcff47SXuan Hu
925bcff47SXuan Huclass MultiWakeupQueueIO[T <: Data, TFlush <: Data](
1025bcff47SXuan Hu  gen       : T,
11*0c7ebb58Sxiaofeibao-xjtu  lastGen   : T,
1225bcff47SXuan Hu  flushGen  : TFlush,
1325bcff47SXuan Hu  latWidth  : Int,
1425bcff47SXuan Hu) extends Bundle {
1525bcff47SXuan Hu  class EnqBundle extends Bundle {
1625bcff47SXuan Hu    val uop = Output(gen)
1725bcff47SXuan Hu    val lat = Output(UInt(latWidth.W))
1825bcff47SXuan Hu  }
1925bcff47SXuan Hu
20493a9370SHaojin Tang  val flush = Input(flushGen)
2125bcff47SXuan Hu  val enq = Flipped(Valid(new EnqBundle))
22493a9370SHaojin Tang  val og0IssueFail = Input(Bool())
23493a9370SHaojin Tang  val og1IssueFail = Input(Bool())
24*0c7ebb58Sxiaofeibao-xjtu  val deq = Output(Valid(lastGen))
2525bcff47SXuan Hu}
2625bcff47SXuan Hu
2725bcff47SXuan Huclass MultiWakeupQueue[T <: Data, TFlush <: Data](
2825bcff47SXuan Hu  val gen       : T,
29*0c7ebb58Sxiaofeibao-xjtu  val lastGen   : T,
3025bcff47SXuan Hu  val flushGen  : TFlush,
3125bcff47SXuan Hu  val latencySet: Set[Int],
32c5b13086SHaojin Tang  flushFunc : (T, TFlush, Int) => Bool,
33*0c7ebb58Sxiaofeibao-xjtu  modificationFunc: (T, T) => T
3425bcff47SXuan Hu) extends Module {
3525bcff47SXuan Hu  require(latencySet.min >= 0)
3625bcff47SXuan Hu
37*0c7ebb58Sxiaofeibao-xjtu  val io = IO(new MultiWakeupQueueIO(gen, lastGen, flushGen, log2Up(latencySet.max + 1) + 1))
3825bcff47SXuan Hu
39*0c7ebb58Sxiaofeibao-xjtu  val pipes = latencySet.map(x => Module(new PipeWithFlush[T, TFlush](gen, lastGen, flushGen, x + 1, flushFunc, modificationFunc))).toSeq
4025bcff47SXuan Hu
41493a9370SHaojin Tang  pipes.zip(latencySet).foreach {
42493a9370SHaojin Tang    case (pipe, lat) =>
4325bcff47SXuan Hu      pipe.io.flush := io.flush
44493a9370SHaojin Tang      pipe.io.enq.valid := io.enq.valid && io.enq.bits.lat === lat.U
4525bcff47SXuan Hu      pipe.io.enq.bits := io.enq.bits.uop
4625bcff47SXuan Hu  }
4725bcff47SXuan Hu
48af4bd265SzhanglyGit  private val pipesValidVec = VecInit(pipes.map(_.io.deq.valid))
4925bcff47SXuan Hu  private val pipesBitsVec = VecInit(pipes.map(_.io.deq.bits))
5025bcff47SXuan Hu
5125bcff47SXuan Hu  io.deq.valid := pipesValidVec.asUInt.orR
5225bcff47SXuan Hu  io.deq.bits := Mux1H(pipesValidVec, pipesBitsVec)
5325bcff47SXuan Hu
548e208fb5SXuan Hu  assert(PopCount(pipesValidVec) <= 1.U, "PopCount(pipesValidVec) should be no more than 1")
5525bcff47SXuan Hu}
56