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 17*493a9370SHaojin Tang val flush = Input(flushGen) 1825bcff47SXuan Hu val enq = Flipped(Valid(new EnqBundle)) 19*493a9370SHaojin Tang val og0IssueFail = Input(Bool()) 20*493a9370SHaojin Tang val og1IssueFail = Input(Bool()) 2125bcff47SXuan Hu val deq = Output(Valid(gen)) 2225bcff47SXuan Hu} 2325bcff47SXuan Hu 2425bcff47SXuan Huclass MultiWakeupQueue[T <: Data, TFlush <: Data]( 2525bcff47SXuan Hu val gen : T, 2625bcff47SXuan Hu val flushGen : TFlush, 2725bcff47SXuan Hu val latencySet: Set[Int], 28*493a9370SHaojin Tang flushFunc : (T, TFlush, Int) => Bool 2925bcff47SXuan Hu) extends Module { 3025bcff47SXuan Hu require(latencySet.min >= 0) 3125bcff47SXuan Hu 328e208fb5SXuan Hu val io = IO(new MultiWakeupQueueIO(gen, flushGen, log2Up(latencySet.max) + 1)) 3325bcff47SXuan Hu 3425bcff47SXuan Hu val pipes = latencySet.map(x => Module(new PipeWithFlush[T, TFlush](gen, flushGen, x, flushFunc))).toSeq 3525bcff47SXuan Hu 36*493a9370SHaojin Tang pipes.zip(latencySet).foreach { 37*493a9370SHaojin Tang case (pipe, lat) => 3825bcff47SXuan Hu pipe.io.flush := io.flush 39*493a9370SHaojin Tang pipe.io.enq.valid := io.enq.valid && io.enq.bits.lat === lat.U 4025bcff47SXuan Hu pipe.io.enq.bits := io.enq.bits.uop 4125bcff47SXuan Hu } 4225bcff47SXuan Hu 43*493a9370SHaojin Tang private val pipesValidVec = VecInit(pipes.map(_.io.deq.valid).zip(latencySet).map(_ match { 44*493a9370SHaojin Tang case (valid, 1) => valid && !io.og0IssueFail 45*493a9370SHaojin Tang case (valid, 2) => valid && !io.og1IssueFail 46*493a9370SHaojin Tang case (valid, _) => valid 47*493a9370SHaojin Tang })) 4825bcff47SXuan Hu private val pipesBitsVec = VecInit(pipes.map(_.io.deq.bits)) 4925bcff47SXuan Hu 5025bcff47SXuan Hu io.deq.valid := pipesValidVec.asUInt.orR 5125bcff47SXuan Hu io.deq.bits := Mux1H(pipesValidVec, pipesBitsVec) 5225bcff47SXuan Hu 538e208fb5SXuan Hu assert(PopCount(pipesValidVec) <= 1.U, "PopCount(pipesValidVec) should be no more than 1") 5425bcff47SXuan Hu} 55