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