15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 45db4956bSzhanglyGitimport chisel3._ 55db4956bSzhanglyGitimport chisel3.util._ 65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper 7a6938b17Ssinsanctionimport utils._ 85db4956bSzhanglyGitimport xiangshan._ 95db4956bSzhanglyGitimport xiangshan.backend.Bundles._ 105db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData 115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource 125db4956bSzhanglyGitimport xiangshan.backend.fu.FuType 135db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes 145db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr 15aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr} 16aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._ 175db4956bSzhanglyGit 185db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 190721d1aaSXuan Hu override def desiredName: String = params.getEntryName 200721d1aaSXuan Hu 2127811ea4SXuan Hu require(params.numEnq <= 2, "number of enq should be no more than 2") 2227811ea4SXuan Hu 235db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 245db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 2528607074Ssinsanction private val SimpEntryNum = params.numSimp 2628607074Ssinsanction private val CompEntryNum = params.numComp 275db4956bSzhanglyGit val io = IO(new EntriesIO) 285db4956bSzhanglyGit 29c838dea1SXuan Hu // only memAddrIQ use it 30c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 31d3372210SzhanglyGit if (params.isLdAddrIQ && !params.isStAddrIQ) //LDU 32e07131b2Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromLoad.get.finalIssueResp ++ io.fromLoad.get.memAddrIssueResp) 33d3372210SzhanglyGit else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) //HYU 34e07131b2Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromLoad.get.finalIssueResp ++ io.fromLoad.get.memAddrIssueResp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 35e07131b2Ssinsanction else if (params.isMemAddrIQ) //STU, VLDU, VSTU 366462eb1cSzhanglyGit MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.slowResp) 37c838dea1SXuan Hu else MixedVecInit(Seq()) 38c838dea1SXuan Hu } 39c838dea1SXuan Hu 40c38df446SzhanglyGit val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = { 41c38df446SzhanglyGit if (params.inVfSchd) 42c38df446SzhanglyGit VecInit(io.og0Resp, io.og1Resp, io.og2Resp.get, 0.U.asTypeOf(io.og0Resp)) 43c38df446SzhanglyGit else 44c38df446SzhanglyGit VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 45c38df446SzhanglyGit } 465db4956bSzhanglyGit 475db4956bSzhanglyGit //Module 48df26db8aSsinsanction val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(isComp = true)(p, params))) 4928607074Ssinsanction val othersEntriesSimp = Seq.fill(SimpEntryNum)(Module(OthersEntry(isComp = false)(p, params))) 5028607074Ssinsanction val othersEntriesComp = Seq.fill(CompEntryNum)(Module(OthersEntry(isComp = true)(p, params))) 5128607074Ssinsanction val othersEntries = othersEntriesSimp ++ othersEntriesComp 5228607074Ssinsanction val othersTransPolicy = OptionWrapper(params.isAllComp || params.isAllSimp, Module(new EnqPolicy)) 5328607074Ssinsanction val simpTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 5428607074Ssinsanction val compTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 555db4956bSzhanglyGit 565db4956bSzhanglyGit //Wire 57aa2bcc31SzhanglyGit //entries status 585db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 59aa2bcc31SzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 605db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 615db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 625db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 635db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 645db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 6599944b79Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 66aa2bcc31SzhanglyGit //src status 67aa2bcc31SzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 68eea4a3caSzhanglyGit val loadDependencyVec = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W)))) 69eea4a3caSzhanglyGit val srcLoadDependencyVec= Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 70aa2bcc31SzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 71aa2bcc31SzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 72aa2bcc31SzhanglyGit //deq sel 73aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 74aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 755db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 765db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 77aa2bcc31SzhanglyGit //trans sel 7828607074Ssinsanction val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool())) 7928607074Ssinsanction val othersEntryEnqVec = Wire(Vec(OthersEntryNum, Valid(new EntryBundle))) 8028607074Ssinsanction val enqEntryTransVec = Wire(Vec(EnqEntryNum, Valid(new EntryBundle))) 8128607074Ssinsanction val simpEntryTransVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle)))) 8228607074Ssinsanction val compEnqVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))) 8328607074Ssinsanction 8428607074Ssinsanction val enqCanTrans2Simp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 8528607074Ssinsanction val enqCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 8628607074Ssinsanction val simpCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool()))) 8728607074Ssinsanction val simpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W))))) 8828607074Ssinsanction val compTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W))))) 8928607074Ssinsanction val finalSimpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W)))) 9028607074Ssinsanction val finalCompTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W)))) 9128607074Ssinsanction 9228607074Ssinsanction val enqCanTrans2Others = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool())) 9328607074Ssinsanction val othersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))) 9428607074Ssinsanction val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W)))) 9528607074Ssinsanction 9628607074Ssinsanction val simpEntryEnqReadyVec = othersEntryEnqReadyVec.take(SimpEntryNum) 9728607074Ssinsanction val compEntryEnqReadyVec = othersEntryEnqReadyVec.takeRight(CompEntryNum) 9828607074Ssinsanction val simpEntryEnqVec = othersEntryEnqVec.take(SimpEntryNum) 9928607074Ssinsanction val compEntryEnqVec = othersEntryEnqVec.takeRight(CompEntryNum) 100aa2bcc31SzhanglyGit //debug 101a6938b17Ssinsanction val entryInValidVec = Wire(Vec(params.numEntries, Bool())) 102a6938b17Ssinsanction val entryOutDeqValidVec = Wire(Vec(params.numEntries, Bool())) 103a6938b17Ssinsanction val entryOutTransValidVec = Wire(Vec(params.numEntries, Bool())) 104*e3ef3537Ssinsanction val perfLdCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 105*e3ef3537Ssinsanction val perfOg0CancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 106*e3ef3537Ssinsanction val perfWakeupByWBVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))) 107*e3ef3537Ssinsanction val perfWakeupByIQVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))))) 108a4d38a63SzhanglyGit //cancel bypass 109eea4a3caSzhanglyGit val cancelBypassVec = Wire(Vec(params.numEntries, Bool())) 1105db4956bSzhanglyGit 1115db4956bSzhanglyGit 1125db4956bSzhanglyGit //enqEntries 1135db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 114aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 11528607074Ssinsanction enqEntry.io.commonIn.transSel := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid 11628607074Ssinsanction else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid) 117aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 11841dbbdfdSsinceforYy enqEntry.io.enqDelayWakeUpFromWB := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid) 11941dbbdfdSsinceforYy enqEntry.io.enqDelayWakeUpFromIQ := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid) 120aa2bcc31SzhanglyGit enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel.asUInt) 121aa2b5219Ssinsanction enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel) 12228607074Ssinsanction enqEntryTransVec(entryIdx) := enqEntry.io.commonOut.transEntry 1235db4956bSzhanglyGit } 1245db4956bSzhanglyGit //othersEntries 1255db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 12628607074Ssinsanction othersEntry.io.commonIn.enq := othersEntryEnqVec(entryIdx) 12728607074Ssinsanction othersEntry.io.commonIn.transSel := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) 12828607074Ssinsanction io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _) 12928607074Ssinsanction else false.B) 130aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 13128607074Ssinsanction othersEntryEnqReadyVec(entryIdx) := othersEntry.io.commonOut.enqReady 13228607074Ssinsanction if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) { 13328607074Ssinsanction simpEntryTransVec.get(entryIdx) := othersEntry.io.commonOut.transEntry 13428607074Ssinsanction } 1355db4956bSzhanglyGit } 1365db4956bSzhanglyGit 1375db4956bSzhanglyGit 1385db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 139aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1405db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1415db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1425db4956bSzhanglyGit } 1435db4956bSzhanglyGit 1445db4956bSzhanglyGit 14528607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 1465db4956bSzhanglyGit //transPolicy 14728607074Ssinsanction othersTransPolicy.get.io.canEnq := othersEntryEnqReadyVec.asUInt 148b43488b9Ssinsanction 149b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to others entries. 15028607074Ssinsanction enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(othersEntryEnqReadyVec) 151b43488b9Ssinsanction // othersTransSelVec(i) is the target others entry for enq entry [i]. 152b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 153b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 154b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 15528607074Ssinsanction othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 15628607074Ssinsanction othersTransSelVec.get(0).bits := othersTransPolicy.get.io.enqSelOHVec(0).bits 1578321ef33Ssinsanction if (params.numEnq == 2) { 15828607074Ssinsanction othersTransSelVec.get(1).valid := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) 15928607074Ssinsanction othersTransSelVec.get(1).bits := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).bits, othersTransPolicy.get.io.enqSelOHVec(1).bits) 1608321ef33Ssinsanction } 1618321ef33Ssinsanction 16228607074Ssinsanction finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 16328607074Ssinsanction finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits 1645db4956bSzhanglyGit } 1655db4956bSzhanglyGit 16628607074Ssinsanction //othersEntryEnq 16728607074Ssinsanction othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) => 16828607074Ssinsanction val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx)) 16928607074Ssinsanction if (othersEnqOH.size == 1) 17028607074Ssinsanction othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 17128607074Ssinsanction else 17228607074Ssinsanction othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec) 1735db4956bSzhanglyGit } 17428607074Ssinsanction } 17528607074Ssinsanction else { 17628607074Ssinsanction //transPolicy 17728607074Ssinsanction simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt 17828607074Ssinsanction compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt 17928607074Ssinsanction 180b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to comp/simp entries. 181b43488b9Ssinsanction // when all of simp entries are empty and comp entries are enough, transfer to comp entries. 182b43488b9Ssinsanction // otherwise, transfer to simp entries. 18328607074Ssinsanction enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _) 18428607074Ssinsanction enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec) 18528607074Ssinsanction simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) => 18628607074Ssinsanction canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U 18728607074Ssinsanction } 18828607074Ssinsanction 189b43488b9Ssinsanction // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i]. 190b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 191b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 192b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 19328607074Ssinsanction simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 19428607074Ssinsanction simpTransSelVec.get(0).bits := simpTransPolicy.get.io.enqSelOHVec(0).bits 19528607074Ssinsanction compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 19628607074Ssinsanction compTransSelVec.get(0).bits := compTransPolicy.get.io.enqSelOHVec(0).bits 19728607074Ssinsanction if (params.numEnq == 2) { 19828607074Ssinsanction simpTransSelVec.get(1).valid := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) 19928607074Ssinsanction simpTransSelVec.get(1).bits := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).bits, simpTransPolicy.get.io.enqSelOHVec(1).bits) 20028607074Ssinsanction compTransSelVec.get(1).valid := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) 20128607074Ssinsanction compTransSelVec.get(1).bits := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).bits, compTransPolicy.get.io.enqSelOHVec(1).bits) 20228607074Ssinsanction } 20328607074Ssinsanction 20428607074Ssinsanction finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 20528607074Ssinsanction finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits 20628607074Ssinsanction } 20728607074Ssinsanction finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach { 20828607074Ssinsanction case (((finalOH, selOH), origSelOH), enqIdx) => 20928607074Ssinsanction finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits) 21028607074Ssinsanction } 21128607074Ssinsanction 21228607074Ssinsanction //othersEntryEnq 21328607074Ssinsanction simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) => 21428607074Ssinsanction val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx)) 21528607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 21628607074Ssinsanction if (simpEnqOH.size == 1) 21728607074Ssinsanction simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 21828607074Ssinsanction else 21928607074Ssinsanction simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec) 22028607074Ssinsanction } 22128607074Ssinsanction 22228607074Ssinsanction compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) => 22328607074Ssinsanction compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get)) 22428607074Ssinsanction } 22528607074Ssinsanction compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) => 22628607074Ssinsanction val compEnqOH = finalCompTransSelVec.get.map(_(compIdx)) 22728607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 22828607074Ssinsanction if (compEnqOH.size == 1) 22928607074Ssinsanction compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head)) 23028607074Ssinsanction else 23128607074Ssinsanction compEntryEnq := Mux1H(compEnqOH, compEnqVec.get) 23228607074Ssinsanction } 23328607074Ssinsanction 23428607074Ssinsanction assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n") 23528607074Ssinsanction assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n") 23628607074Ssinsanction } 23728607074Ssinsanction 2388d081717Sszw_kaixin if(backendParams.debugEn) { 23928607074Ssinsanction dontTouch(othersEntryEnqVec) 2408d081717Sszw_kaixin } 2415db4956bSzhanglyGit 2425db4956bSzhanglyGit //issueRespVec 243887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 244887f9c3dSzhanglinjuan // vector memory IQ 245887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 246887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 247aa2bcc31SzhanglyGit x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx 248887f9c3dSzhanglinjuan )) 249887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 250887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 251887f9c3dSzhanglinjuan } 252887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 253887f9c3dSzhanglinjuan // scalar memory IQ 2545db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 255c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 2565db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 257c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 2585db4956bSzhanglyGit } 2595db4956bSzhanglyGit } 2605db4956bSzhanglyGit else { 2615db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 2625db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 2635db4956bSzhanglyGit issueResp := Resp 2645db4956bSzhanglyGit } 2655db4956bSzhanglyGit } 2665db4956bSzhanglyGit 26740283787Ssinsanction //deq 26828607074Ssinsanction val enqEntryOldest = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 26928607074Ssinsanction val simpEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 27028607074Ssinsanction val compEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 27128607074Ssinsanction val othersEntryOldest = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 27228607074Ssinsanction val enqEntryOldestCancel = Wire(Vec(params.numDeq, Bool())) 27328607074Ssinsanction val simpEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 27428607074Ssinsanction val compEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 27528607074Ssinsanction val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool()))) 27628607074Ssinsanction 27728607074Ssinsanction io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) => 27828607074Ssinsanction enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum)) 279eea4a3caSzhanglyGit enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum)) 28040283787Ssinsanction } 28128607074Ssinsanction 28228607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 28328607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 28428607074Ssinsanction othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum)) 285eea4a3caSzhanglyGit othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum)) 286af4bd265SzhanglyGit } 28740283787Ssinsanction } 28828607074Ssinsanction else { 28928607074Ssinsanction io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 29028607074Ssinsanction simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum)) 291eea4a3caSzhanglyGit simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum)) 29228607074Ssinsanction } 29328607074Ssinsanction io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 29428607074Ssinsanction compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum)) 295eea4a3caSzhanglyGit compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum)) 29628607074Ssinsanction } 297af4bd265SzhanglyGit } 298cf4a131aSsinsanction 299cf4a131aSsinsanction if (params.deqFuSame) { 300cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 301cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 302a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 303cf4a131aSsinsanction 304aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 305aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 30628607074Ssinsanction 30728607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 30828607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 30928607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 310eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 311eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 312cf4a131aSsinsanction 31328607074Ssinsanction io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1)) 314aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 31528607074Ssinsanction io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)) 316a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 31728607074Ssinsanction } 31828607074Ssinsanction else { 31928607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 32028607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries) 321eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 322eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 32328607074Ssinsanction 32428607074Ssinsanction io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid, 32528607074Ssinsanction compEntryOldest.get(0), 32628607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1))) 32728607074Ssinsanction io.deqEntry(1) := subDeqPolicyEntryVec(0) 32828607074Ssinsanction io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid, 32928607074Ssinsanction compEntryOldestCancel.get(0), 33028607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))) 33128607074Ssinsanction io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 33228607074Ssinsanction } 333cf4a131aSsinsanction 334cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 335aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 33640283787Ssinsanction } 337cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 338aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 339f7f73727Ssinsanction } 340f7f73727Ssinsanction } 341f7f73727Ssinsanction else { 34228607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 34328607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) => 34428607074Ssinsanction io.deqEntry(i) := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i)) 34528607074Ssinsanction io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i)) 34628607074Ssinsanction } 34728607074Ssinsanction } 34828607074Ssinsanction else { 34928607074Ssinsanction io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) => 35028607074Ssinsanction io.deqEntry(i) := Mux(compSel.valid, 35128607074Ssinsanction compEntryOldest.get(i), 35228607074Ssinsanction Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i))) 35328607074Ssinsanction io.cancelDeqVec(i) := Mux(compSel.valid, 35428607074Ssinsanction compEntryOldestCancel.get(i), 35528607074Ssinsanction Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i))) 35628607074Ssinsanction } 357af4bd265SzhanglyGit } 358af4bd265SzhanglyGit } 359af4bd265SzhanglyGit 360af4bd265SzhanglyGit if (params.hasIQWakeUp) { 361eea4a3caSzhanglyGit cancelBypassVec.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).zip(srcLoadDependencyVec).foreach{ case (((cancelBypass: Bool, l1ExuOH: Vec[Vec[Bool]]), srcTimer: Vec[UInt]), srcLoadDependency: Vec[Vec[UInt]]) => 362a4d38a63SzhanglyGit val cancelByOg0 = l1ExuOH.zip(srcTimer).map { 363af4bd265SzhanglyGit case(exuOH, srcTimer) => 364af4bd265SzhanglyGit (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 365af4bd265SzhanglyGit }.reduce(_ | _) 366a4d38a63SzhanglyGit val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _) 367e5feb625Sxiaofeibao-xjtu cancelBypass := cancelByLd 36840283787Ssinsanction } 369eea4a3caSzhanglyGit } else { 370eea4a3caSzhanglyGit cancelBypassVec.zip(srcLoadDependencyVec).foreach { case (cancelBypass, srcLoadDependency) => 371eea4a3caSzhanglyGit val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _) 372eea4a3caSzhanglyGit cancelBypass := cancelByLd 373eea4a3caSzhanglyGit } 37440283787Ssinsanction } 37540283787Ssinsanction 3765db4956bSzhanglyGit io.valid := validVec.asUInt 3775db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3785db4956bSzhanglyGit io.fuType := fuTypeVec 3795db4956bSzhanglyGit io.dataSources := dataSourceVec 380aa2bcc31SzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get.map(x => VecInit(x.map(_.asUInt)))) 3815db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 382eea4a3caSzhanglyGit io.loadDependency := loadDependencyVec 383aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 384aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 3858d081717Sszw_kaixin } 38628607074Ssinsanction io.simpEntryEnqSelVec.foreach(_ := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid))) 38728607074Ssinsanction io.compEntryEnqSelVec.foreach(_ := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid))) 38828607074Ssinsanction io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid))) 389aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 390aa2bcc31SzhanglyGit io.uopIdx.foreach(_ := uopIdxVec.get) 391aa2bcc31SzhanglyGit 392aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 393aa2bcc31SzhanglyGit in.flush := io.flush 394aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 395aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 396aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 397aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 398aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 399aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 400aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 401aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 402aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 403aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 404aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 405aa2bcc31SzhanglyGit } 406aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 407aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 408aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 409aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 410aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 411aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 412aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 413aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 414aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 415eea4a3caSzhanglyGit srcLoadDependencyVec(entryIdx) := out.srcLoadDependency 416eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 417aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 418aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 419aa2bcc31SzhanglyGit srcTimerVec.get(entryIdx) := out.srcTimer.get 420aa2bcc31SzhanglyGit } 421aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 422aa2bcc31SzhanglyGit uopIdxVec.get(entryIdx) := out.uopIdx.get 423aa2bcc31SzhanglyGit } 424a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 425a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 426a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 427*e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 428*e3ef3537Ssinsanction if (params.hasIQWakeUp) { 429*e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 430*e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 431*e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 432*e3ef3537Ssinsanction } 433aa2bcc31SzhanglyGit } 434a6938b17Ssinsanction 435a6938b17Ssinsanction // entries perf counter 436a6938b17Ssinsanction // enq 437a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 438a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 439a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 440a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 441a6938b17Ssinsanction } 442a6938b17Ssinsanction // simple 443a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 444a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 445a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 446a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 447a6938b17Ssinsanction } 448a6938b17Ssinsanction // complex 449a6938b17Ssinsanction for (i <- 0 until params.numComp) { 450a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 451a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 452a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 453a6938b17Ssinsanction } 454a6938b17Ssinsanction // total 455a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 456a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 457a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 458*e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 459*e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 460d280e426Slewislzh if (params.hasIQWakeUp) { 461*e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 462*e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 463*e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 464*e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 465*e3ef3537Ssinsanction } 466*e3ef3537Ssinsanction } 467d280e426Slewislzh } 468a6938b17Ssinsanction 469a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 470a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 471a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 472*e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 473*e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 474d280e426Slewislzh if (params.hasIQWakeUp) { 475*e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 476*e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 477*e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 478*e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 479*e3ef3537Ssinsanction } 480*e3ef3537Ssinsanction } 481*e3ef3537Ssinsanction } 482*e3ef3537Ssinsanction 483*e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 484*e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 485*e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 486*e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 487*e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 488*e3ef3537Ssinsanction if (params.hasIQWakeUp) { 489*e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 490*e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 491*e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 492*e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx)(iqIdx) && fu(t.id) })) 493*e3ef3537Ssinsanction } 494*e3ef3537Ssinsanction } 495*e3ef3537Ssinsanction } 496*e3ef3537Ssinsanction } 497d280e426Slewislzh } 498aa2bcc31SzhanglyGit} 499aa2bcc31SzhanglyGit 500aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 501aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 502aa2bcc31SzhanglyGit //enq 503aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 504aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 505aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 506c38df446SzhanglyGit val og2Resp = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 507aa2bcc31SzhanglyGit //deq sel 508aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 509aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 510aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 51128607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 51228607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 51328607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 514aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 515aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 516aa2bcc31SzhanglyGit // wakeup 517aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 518aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 519aa2bcc31SzhanglyGit val og0Cancel = Input(ExuOH(backendParams.numExu)) 520aa2bcc31SzhanglyGit val og1Cancel = Input(ExuOH(backendParams.numExu)) 521aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 522aa2bcc31SzhanglyGit //entries status 523aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 524aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 525aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 526aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 527eea4a3caSzhanglyGit val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W))) 528aa2bcc31SzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuOH())))) 529aa2bcc31SzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(UInt(3.W))))) 530aa2bcc31SzhanglyGit //deq status 531aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 532aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 533aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 534e07131b2Ssinsanction 535e07131b2Ssinsanction // load/hybird only 536e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 537e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 538e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 539e07131b2Ssinsanction }) 540aa2bcc31SzhanglyGit // mem only 541e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 542aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 543d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 544e07131b2Ssinsanction }) 54599944b79Ssinsanction // vec mem only 546aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 547aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 548aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 549aa2bcc31SzhanglyGit }) 550aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 551aa2bcc31SzhanglyGit val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 552aa2bcc31SzhanglyGit 55328607074Ssinsanction // trans 55428607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 55528607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 55628607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 55728607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 558aa2bcc31SzhanglyGit 559aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5605db4956bSzhanglyGit} 561