125bcff47SXuan Hupackage xiangshan.backend.issue 225bcff47SXuan Hu 325bcff47SXuan Huimport chisel3._ 425bcff47SXuan Huimport chisel3.util._ 525bcff47SXuan Huimport utils.PipeWithFlush 6*ec1fea84SzhanglyGitimport xiangshan.backend.Bundles.{ExuInput, connectSamePort} 70c7ebb58Sxiaofeibao-xjtuimport xiangshan.backend.exu.ExeUnitParams 825bcff47SXuan Hu 9*ec1fea84SzhanglyGitclass MultiWakeupQueueIO[T <: Bundle, TFlush <: Data]( 1025bcff47SXuan Hu gen : T, 110c7ebb58Sxiaofeibao-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)) 220c7ebb58Sxiaofeibao-xjtu val deq = Output(Valid(lastGen)) 2325bcff47SXuan Hu} 2425bcff47SXuan Hu 25*ec1fea84SzhanglyGitclass MultiWakeupQueue[T <: Bundle, TFlush <: Data]( 2625bcff47SXuan Hu val gen : T, 270c7ebb58Sxiaofeibao-xjtu val lastGen : T, 2825bcff47SXuan Hu val flushGen : TFlush, 2925bcff47SXuan Hu val latencySet: Set[Int], 30c5b13086SHaojin Tang flushFunc : (T, TFlush, Int) => Bool, 31*ec1fea84SzhanglyGit modificationFunc: T => T = { x: T => x }, 32*ec1fea84SzhanglyGit lastConnectFunc: (T, T) => T, 3325bcff47SXuan Hu) extends Module { 3425bcff47SXuan Hu require(latencySet.min >= 0) 3525bcff47SXuan Hu 36*ec1fea84SzhanglyGit val io = IO(new MultiWakeupQueueIO(gen, lastGen, flushGen, log2Up(latencySet.max) + 1)) 3725bcff47SXuan Hu 38*ec1fea84SzhanglyGit val pipes = latencySet.map(x => Module(new PipeWithFlush[T, TFlush](gen, flushGen, x, flushFunc, modificationFunc))).toSeq 39*ec1fea84SzhanglyGit 40*ec1fea84SzhanglyGit val pipesOut = Wire(Valid(gen)) 41*ec1fea84SzhanglyGit val lastConnect = Reg(Valid(lastGen)) 4225bcff47SXuan Hu 43493a9370SHaojin Tang pipes.zip(latencySet).foreach { 44493a9370SHaojin Tang case (pipe, lat) => 4525bcff47SXuan Hu pipe.io.flush := io.flush 46493a9370SHaojin Tang pipe.io.enq.valid := io.enq.valid && io.enq.bits.lat === lat.U 4725bcff47SXuan Hu pipe.io.enq.bits := io.enq.bits.uop 4825bcff47SXuan Hu } 4925bcff47SXuan Hu 50*ec1fea84SzhanglyGit private val pipesValidVec = VecInit(pipes.map(_.io.deq).zip(latencySet).map(_ match { 51*ec1fea84SzhanglyGit case (deq, i) => deq.valid && !flushFunc(deq.bits, io.flush, i) 52*ec1fea84SzhanglyGit })) 53*ec1fea84SzhanglyGit private val pipesBitsVec = VecInit(pipes.map(_.io.deq.bits)).map(modificationFunc) 5425bcff47SXuan Hu 55*ec1fea84SzhanglyGit pipesOut.valid := pipesValidVec.asUInt.orR 56*ec1fea84SzhanglyGit pipesOut.bits := Mux1H(pipesValidVec, pipesBitsVec) 57*ec1fea84SzhanglyGit 58*ec1fea84SzhanglyGit lastConnect.valid := pipesOut.valid 59*ec1fea84SzhanglyGit lastConnect.bits := lastConnectFunc(pipesOut.bits, lastConnect.bits) 60*ec1fea84SzhanglyGit 61*ec1fea84SzhanglyGit io.deq.valid := lastConnect.valid 62*ec1fea84SzhanglyGit io.deq.bits := lastConnect.bits 6325bcff47SXuan Hu 648e208fb5SXuan Hu assert(PopCount(pipesValidVec) <= 1.U, "PopCount(pipesValidVec) should be no more than 1") 6525bcff47SXuan Hu} 66