15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 45db4956bSzhanglyGitimport chisel3._ 55db4956bSzhanglyGitimport chisel3.util._ 65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper 7a6938b17Ssinsanctionimport utils._ 84fa640e4Ssinsanctionimport utility._ 95db4956bSzhanglyGitimport xiangshan._ 105db4956bSzhanglyGitimport xiangshan.backend.Bundles._ 115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData 125db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource 135db4956bSzhanglyGitimport xiangshan.backend.fu.FuType 145db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes 155db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr 16aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr} 17aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._ 185db4956bSzhanglyGit 195db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 200721d1aaSXuan Hu override def desiredName: String = params.getEntryName 210721d1aaSXuan Hu 2227811ea4SXuan Hu require(params.numEnq <= 2, "number of enq should be no more than 2") 2327811ea4SXuan Hu 245db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 255db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 2628607074Ssinsanction private val SimpEntryNum = params.numSimp 2728607074Ssinsanction private val CompEntryNum = params.numComp 285db4956bSzhanglyGit val io = IO(new EntriesIO) 295db4956bSzhanglyGit 30c838dea1SXuan Hu // only memAddrIQ use it 317e471bf8SXuan Hu val memEtyResps: Seq[ValidIO[EntryDeqRespBundle]] = { 327e471bf8SXuan Hu val resps = 33d3372210SzhanglyGit if (params.isLdAddrIQ && !params.isStAddrIQ) //LDU 34dd40a82bSsinsanction Seq(io.fromLoad.get.finalIssueResp, io.fromLoad.get.memAddrIssueResp) 35d3372210SzhanglyGit else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) //HYU 36dd40a82bSsinsanction Seq(io.fromLoad.get.finalIssueResp, io.fromLoad.get.memAddrIssueResp, io.fromMem.get.fastResp, io.fromMem.get.slowResp) 377e471bf8SXuan Hu else if (params.isStAddrIQ) //STU 38dd40a82bSsinsanction Seq(io.fromMem.get.slowResp) 398f3cbbcfSXuan Hu else if (params.isVecLduIQ && params.isVecStuIQ) // Vector store IQ need no vecLdIn.resp, but for now vector store share the vector load IQ 40dd40a82bSsinsanction Seq(io.vecLdIn.get.resp, io.fromMem.get.slowResp) 418f3cbbcfSXuan Hu else if (params.isVecLduIQ) 42dd40a82bSsinsanction Seq(io.vecLdIn.get.resp) 437e471bf8SXuan Hu else if (params.isVecStuIQ) 44dd40a82bSsinsanction Seq(io.fromMem.get.slowResp) 457e471bf8SXuan Hu else Seq() 467e471bf8SXuan Hu if (params.isMemAddrIQ) { 477e471bf8SXuan Hu println(s"[${this.desiredName}] resp: {" + 487e471bf8SXuan Hu s"og0Resp: ${resps.contains(io.og0Resp)}, " + 497e471bf8SXuan Hu s"og1Resp: ${resps.contains(io.og1Resp)}, " + 507e471bf8SXuan Hu s"finalResp: ${io.fromLoad.nonEmpty && resps.contains(io.fromLoad.get.finalIssueResp)}, " + 517e471bf8SXuan Hu s"loadBorderResp: ${io.fromLoad.nonEmpty && resps.contains(io.fromLoad.get.memAddrIssueResp)}, " + 527e471bf8SXuan Hu s"memFastResp: ${io.fromMem.nonEmpty && resps.contains(io.fromMem.get.fastResp)}, " + 537e471bf8SXuan Hu s"memSlowResp: ${io.fromMem.nonEmpty && resps.contains(io.fromMem.get.slowResp)}, " + 547e471bf8SXuan Hu s"vecLoadBorderResp: ${io.vecLdIn.nonEmpty && resps.contains(io.vecLdIn.get.resp)}, " + 557e471bf8SXuan Hu s"}" 567e471bf8SXuan Hu ) 577e471bf8SXuan Hu } 587e471bf8SXuan Hu resps.flatten 59c838dea1SXuan Hu } 60c838dea1SXuan Hu 61*ae0295f4STang Haojin val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = Wire(Vec(4, chiselTypeOf(io.og0Resp))) 62*ae0295f4STang Haojin 63c38df446SzhanglyGit if (params.inVfSchd) 64*ae0295f4STang Haojin resps := Seq(io.og0Resp, io.og1Resp, io.og2Resp.get, WireDefault(0.U.asTypeOf(io.og0Resp))) 65c38df446SzhanglyGit else 66*ae0295f4STang Haojin resps := Seq(io.og0Resp, io.og1Resp, WireDefault(0.U.asTypeOf(io.og0Resp)), WireDefault(0.U.asTypeOf(io.og0Resp))) 675db4956bSzhanglyGit 687e471bf8SXuan Hu 697e471bf8SXuan Hu 705db4956bSzhanglyGit //Module 71df26db8aSsinsanction val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(isComp = true)(p, params))) 7228607074Ssinsanction val othersEntriesSimp = Seq.fill(SimpEntryNum)(Module(OthersEntry(isComp = false)(p, params))) 7328607074Ssinsanction val othersEntriesComp = Seq.fill(CompEntryNum)(Module(OthersEntry(isComp = true)(p, params))) 7428607074Ssinsanction val othersEntries = othersEntriesSimp ++ othersEntriesComp 7528607074Ssinsanction val othersTransPolicy = OptionWrapper(params.isAllComp || params.isAllSimp, Module(new EnqPolicy)) 7628607074Ssinsanction val simpTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 7728607074Ssinsanction val compTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 785db4956bSzhanglyGit 795db4956bSzhanglyGit //Wire 80aa2bcc31SzhanglyGit //entries status 815db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 82aa2bcc31SzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 835db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 845db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 855db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 865db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 875db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 8828ac1c16Sxiaofeibao-xjtu val sqIdxVec = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new SqPtr()))) 8928ac1c16Sxiaofeibao-xjtu val lqIdxVec = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new LqPtr()))) 90aa2bcc31SzhanglyGit //src status 91aa2bcc31SzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 92ec49b127Ssinsanction val loadDependencyVec = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))) 93aa2bcc31SzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 94aa2bcc31SzhanglyGit //deq sel 95aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 96aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 975db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 985db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 99aa2bcc31SzhanglyGit //trans sel 10028607074Ssinsanction val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool())) 10128607074Ssinsanction val othersEntryEnqVec = Wire(Vec(OthersEntryNum, Valid(new EntryBundle))) 10228607074Ssinsanction val enqEntryTransVec = Wire(Vec(EnqEntryNum, Valid(new EntryBundle))) 10328607074Ssinsanction val simpEntryTransVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle)))) 10428607074Ssinsanction val compEnqVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))) 10528607074Ssinsanction 10628607074Ssinsanction val enqCanTrans2Simp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 10728607074Ssinsanction val enqCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 10828607074Ssinsanction val simpCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool()))) 10928607074Ssinsanction val simpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W))))) 11028607074Ssinsanction val compTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W))))) 11128607074Ssinsanction val finalSimpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W)))) 11228607074Ssinsanction val finalCompTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W)))) 11328607074Ssinsanction 11428607074Ssinsanction val enqCanTrans2Others = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool())) 11528607074Ssinsanction val othersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))) 11628607074Ssinsanction val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W)))) 11728607074Ssinsanction 11828607074Ssinsanction val simpEntryEnqReadyVec = othersEntryEnqReadyVec.take(SimpEntryNum) 11928607074Ssinsanction val compEntryEnqReadyVec = othersEntryEnqReadyVec.takeRight(CompEntryNum) 12028607074Ssinsanction val simpEntryEnqVec = othersEntryEnqVec.take(SimpEntryNum) 12128607074Ssinsanction val compEntryEnqVec = othersEntryEnqVec.takeRight(CompEntryNum) 122aa2bcc31SzhanglyGit //debug 123a6938b17Ssinsanction val entryInValidVec = Wire(Vec(params.numEntries, Bool())) 124a6938b17Ssinsanction val entryOutDeqValidVec = Wire(Vec(params.numEntries, Bool())) 125a6938b17Ssinsanction val entryOutTransValidVec = Wire(Vec(params.numEntries, Bool())) 126e3ef3537Ssinsanction val perfLdCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 127e3ef3537Ssinsanction val perfOg0CancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 128e3ef3537Ssinsanction val perfWakeupByWBVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))) 129e3ef3537Ssinsanction val perfWakeupByIQVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))))) 130a4d38a63SzhanglyGit //cancel bypass 131eea4a3caSzhanglyGit val cancelBypassVec = Wire(Vec(params.numEntries, Bool())) 1325db4956bSzhanglyGit 1335db4956bSzhanglyGit 1345db4956bSzhanglyGit //enqEntries 1355db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 136aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 13728607074Ssinsanction enqEntry.io.commonIn.transSel := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid 13828607074Ssinsanction else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid) 139aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 1404fa640e4Ssinsanction enqEntry.io.enqDelayIn1.wakeUpFromWB := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid) 1414fa640e4Ssinsanction enqEntry.io.enqDelayIn1.wakeUpFromIQ := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid) 14291f31488Sxiaofeibao-xjtu enqEntry.io.enqDelayIn1.srcLoadDependency := RegEnable(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), io.enq(entryIdx).valid) 1434fa640e4Ssinsanction enqEntry.io.enqDelayIn1.og0Cancel := RegNext(io.og0Cancel.asUInt) 1444fa640e4Ssinsanction enqEntry.io.enqDelayIn1.ldCancel := RegNext(io.ldCancel) 1454fa640e4Ssinsanction // note: these signals with 2 cycle delay should not be enabled by io.enq.valid 1464fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromWB := DelayN(io.wakeUpFromWB, 2) 1474fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromIQ := DelayN(io.wakeUpFromIQ, 2) 14891f31488Sxiaofeibao-xjtu enqEntry.io.enqDelayIn2.srcLoadDependency := DelayN(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), 2) 1494fa640e4Ssinsanction enqEntry.io.enqDelayIn2.og0Cancel := DelayN(io.og0Cancel.asUInt, 2) 1504fa640e4Ssinsanction enqEntry.io.enqDelayIn2.ldCancel := DelayN(io.ldCancel, 2) 15128607074Ssinsanction enqEntryTransVec(entryIdx) := enqEntry.io.commonOut.transEntry 1525db4956bSzhanglyGit } 1535db4956bSzhanglyGit //othersEntries 1545db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 15528607074Ssinsanction othersEntry.io.commonIn.enq := othersEntryEnqVec(entryIdx) 15628607074Ssinsanction othersEntry.io.commonIn.transSel := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) 15728607074Ssinsanction io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _) 15828607074Ssinsanction else false.B) 159aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 16028607074Ssinsanction othersEntryEnqReadyVec(entryIdx) := othersEntry.io.commonOut.enqReady 16128607074Ssinsanction if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) { 16228607074Ssinsanction simpEntryTransVec.get(entryIdx) := othersEntry.io.commonOut.transEntry 16328607074Ssinsanction } 1645db4956bSzhanglyGit } 1655db4956bSzhanglyGit 1665db4956bSzhanglyGit 1675db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 168aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1695db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1705db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1715db4956bSzhanglyGit } 1725db4956bSzhanglyGit 1735db4956bSzhanglyGit 17428607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 1755db4956bSzhanglyGit //transPolicy 176b9631a81Sxiaofeibao-xjtu othersTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(OthersEntryNum).map(!_)).asUInt 177b43488b9Ssinsanction 178b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to others entries. 179b9631a81Sxiaofeibao-xjtu enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(OthersEntryNum).map(!_)) 180b43488b9Ssinsanction // othersTransSelVec(i) is the target others entry for enq entry [i]. 181b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 182b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 183b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 18428607074Ssinsanction othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 18528607074Ssinsanction othersTransSelVec.get(0).bits := othersTransPolicy.get.io.enqSelOHVec(0).bits 1868321ef33Ssinsanction if (params.numEnq == 2) { 18728607074Ssinsanction othersTransSelVec.get(1).valid := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) 18828607074Ssinsanction othersTransSelVec.get(1).bits := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).bits, othersTransPolicy.get.io.enqSelOHVec(1).bits) 1898321ef33Ssinsanction } 1908321ef33Ssinsanction 19128607074Ssinsanction finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 19228607074Ssinsanction finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits 1935db4956bSzhanglyGit } 1945db4956bSzhanglyGit 19528607074Ssinsanction //othersEntryEnq 19628607074Ssinsanction othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) => 19728607074Ssinsanction val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx)) 19828607074Ssinsanction if (othersEnqOH.size == 1) 19928607074Ssinsanction othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 20028607074Ssinsanction else 20128607074Ssinsanction othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec) 2025db4956bSzhanglyGit } 20328607074Ssinsanction } 20428607074Ssinsanction else { 20528607074Ssinsanction //transPolicy 20628607074Ssinsanction simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt 20728607074Ssinsanction compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt 20828607074Ssinsanction 209b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to comp/simp entries. 210b43488b9Ssinsanction // when all of simp entries are empty and comp entries are enough, transfer to comp entries. 211b43488b9Ssinsanction // otherwise, transfer to simp entries. 21228607074Ssinsanction enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _) 21328607074Ssinsanction enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec) 21428607074Ssinsanction simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) => 21528607074Ssinsanction canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U 21628607074Ssinsanction } 21728607074Ssinsanction 218b43488b9Ssinsanction // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i]. 219b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 220b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 221b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 22228607074Ssinsanction simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 22328607074Ssinsanction simpTransSelVec.get(0).bits := simpTransPolicy.get.io.enqSelOHVec(0).bits 22428607074Ssinsanction compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 22528607074Ssinsanction compTransSelVec.get(0).bits := compTransPolicy.get.io.enqSelOHVec(0).bits 22628607074Ssinsanction if (params.numEnq == 2) { 22728607074Ssinsanction simpTransSelVec.get(1).valid := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) 22828607074Ssinsanction simpTransSelVec.get(1).bits := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).bits, simpTransPolicy.get.io.enqSelOHVec(1).bits) 22928607074Ssinsanction compTransSelVec.get(1).valid := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) 23028607074Ssinsanction compTransSelVec.get(1).bits := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).bits, compTransPolicy.get.io.enqSelOHVec(1).bits) 23128607074Ssinsanction } 23228607074Ssinsanction 23328607074Ssinsanction finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 23428607074Ssinsanction finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits 23528607074Ssinsanction } 23628607074Ssinsanction finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach { 23728607074Ssinsanction case (((finalOH, selOH), origSelOH), enqIdx) => 23828607074Ssinsanction finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits) 23928607074Ssinsanction } 24028607074Ssinsanction 24128607074Ssinsanction //othersEntryEnq 24228607074Ssinsanction simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) => 24328607074Ssinsanction val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx)) 24428607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 24528607074Ssinsanction if (simpEnqOH.size == 1) 24628607074Ssinsanction simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 24728607074Ssinsanction else 24828607074Ssinsanction simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec) 24928607074Ssinsanction } 25028607074Ssinsanction 25128607074Ssinsanction compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) => 25228607074Ssinsanction compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get)) 25328607074Ssinsanction } 25428607074Ssinsanction compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) => 25528607074Ssinsanction val compEnqOH = finalCompTransSelVec.get.map(_(compIdx)) 25628607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 25728607074Ssinsanction if (compEnqOH.size == 1) 25828607074Ssinsanction compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head)) 25928607074Ssinsanction else 26028607074Ssinsanction compEntryEnq := Mux1H(compEnqOH, compEnqVec.get) 26128607074Ssinsanction } 26228607074Ssinsanction 26328607074Ssinsanction assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n") 26428607074Ssinsanction assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n") 26528607074Ssinsanction } 26628607074Ssinsanction 2678d081717Sszw_kaixin if(backendParams.debugEn) { 26828607074Ssinsanction dontTouch(othersEntryEnqVec) 2698d081717Sszw_kaixin } 2705db4956bSzhanglyGit 2715db4956bSzhanglyGit //issueRespVec 27228ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 27328ac1c16Sxiaofeibao-xjtu issueRespVec.lazyZip(sqIdxVec.get.zip(lqIdxVec.get)).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (sqIdx, lqIdx), (issueTimer, deqPortIdx)) => 274dd40a82bSsinsanction val respInDatapath = resps(issueTimer(0))(deqPortIdx) 275dd40a82bSsinsanction val respAfterDatapath = Wire(chiselTypeOf(respInDatapath)) 276f7890d3cSXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => 27728ac1c16Sxiaofeibao-xjtu x.valid && 27828ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackSqIdx) x.bits.sqIdx.get === sqIdx else true.B) && 27928ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackLqIdx) x.bits.lqIdx.get === lqIdx else true.B) 280f7890d3cSXuan Hu ).toSeq) 281dd40a82bSsinsanction respAfterDatapath.valid := hitRespsVec.reduce(_ | _) 282dd40a82bSsinsanction respAfterDatapath.bits := (if (memEtyResps.size == 1) memEtyResps.head.bits 283dd40a82bSsinsanction else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)) 284dd40a82bSsinsanction issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath) 285887f9c3dSzhanglinjuan } 2865db4956bSzhanglyGit } 2875db4956bSzhanglyGit else { 288dd40a82bSsinsanction issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) => 2895db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 2905db4956bSzhanglyGit issueResp := Resp 2915db4956bSzhanglyGit } 2925db4956bSzhanglyGit } 2935db4956bSzhanglyGit 29440283787Ssinsanction //deq 29528607074Ssinsanction val enqEntryOldest = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 29628607074Ssinsanction val simpEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 29728607074Ssinsanction val compEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 29828607074Ssinsanction val othersEntryOldest = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 29928607074Ssinsanction val enqEntryOldestCancel = Wire(Vec(params.numDeq, Bool())) 30028607074Ssinsanction val simpEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30128607074Ssinsanction val compEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30228607074Ssinsanction val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool()))) 30328607074Ssinsanction 30428607074Ssinsanction io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) => 30528607074Ssinsanction enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum)) 306eea4a3caSzhanglyGit enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum)) 30740283787Ssinsanction } 30828607074Ssinsanction 30928607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 31028607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 31128607074Ssinsanction othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum)) 312eea4a3caSzhanglyGit othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum)) 313af4bd265SzhanglyGit } 31440283787Ssinsanction } 31528607074Ssinsanction else { 31628607074Ssinsanction io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 31728607074Ssinsanction simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum)) 318eea4a3caSzhanglyGit simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum)) 31928607074Ssinsanction } 32028607074Ssinsanction io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32128607074Ssinsanction compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum)) 322eea4a3caSzhanglyGit compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum)) 32328607074Ssinsanction } 324af4bd265SzhanglyGit } 325cf4a131aSsinsanction 326cf4a131aSsinsanction if (params.deqFuSame) { 327cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 328cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 329a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 330cf4a131aSsinsanction 331aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 332aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 33328607074Ssinsanction 33428607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 33528607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 33628607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 337eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 338eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 339cf4a131aSsinsanction 34028607074Ssinsanction io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1)) 341aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 34228607074Ssinsanction io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)) 343a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 34428607074Ssinsanction } 34528607074Ssinsanction else { 34628607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 34728607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries) 348eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 349eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 35028607074Ssinsanction 35128607074Ssinsanction io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid, 35228607074Ssinsanction compEntryOldest.get(0), 35328607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1))) 35428607074Ssinsanction io.deqEntry(1) := subDeqPolicyEntryVec(0) 35528607074Ssinsanction io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid, 35628607074Ssinsanction compEntryOldestCancel.get(0), 35728607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))) 35828607074Ssinsanction io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 35928607074Ssinsanction } 360cf4a131aSsinsanction 361cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 362aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 36340283787Ssinsanction } 364cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 365aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 366f7f73727Ssinsanction } 367f7f73727Ssinsanction } 368f7f73727Ssinsanction else { 36928607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 37028607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) => 37128607074Ssinsanction io.deqEntry(i) := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i)) 37228607074Ssinsanction io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i)) 37328607074Ssinsanction } 37428607074Ssinsanction } 37528607074Ssinsanction else { 37628607074Ssinsanction io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) => 37728607074Ssinsanction io.deqEntry(i) := Mux(compSel.valid, 37828607074Ssinsanction compEntryOldest.get(i), 37928607074Ssinsanction Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i))) 38028607074Ssinsanction io.cancelDeqVec(i) := Mux(compSel.valid, 38128607074Ssinsanction compEntryOldestCancel.get(i), 38228607074Ssinsanction Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i))) 38328607074Ssinsanction } 384af4bd265SzhanglyGit } 385af4bd265SzhanglyGit } 386af4bd265SzhanglyGit 3875db4956bSzhanglyGit io.valid := validVec.asUInt 3885db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3895db4956bSzhanglyGit io.fuType := fuTypeVec 3905db4956bSzhanglyGit io.dataSources := dataSourceVec 391864480f4Sxiaofeibao-xjtu io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 392eea4a3caSzhanglyGit io.loadDependency := loadDependencyVec 393aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 394aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 3958d081717Sszw_kaixin } 39628607074Ssinsanction io.simpEntryEnqSelVec.foreach(_ := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid))) 39728607074Ssinsanction io.compEntryEnqSelVec.foreach(_ := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid))) 39828607074Ssinsanction io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid))) 399aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 400aa2bcc31SzhanglyGit 4017e471bf8SXuan Hu 402aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 403aa2bcc31SzhanglyGit in.flush := io.flush 404aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 405aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 406b6279fc6SZiyue Zhang in.vlIsZero := io.vlIsZero 407b6279fc6SZiyue Zhang in.vlIsVlmax := io.vlIsVlmax 408aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 409aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 410aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 411aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 412aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 413aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 414aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 415aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 416aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 417aa2bcc31SzhanglyGit } 418aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 419aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 420aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 421aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 422aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 423aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 424aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 425aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 426aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 427eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 428ec49b127Ssinsanction cancelBypassVec(entryIdx) := out.cancelBypass 429aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 430aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 431aa2bcc31SzhanglyGit } 43228ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 43338f78b5dSxiaofeibao-xjtu sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx 43428ac1c16Sxiaofeibao-xjtu lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx 435aa2bcc31SzhanglyGit } 436a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 437a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 438a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 439e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 440e3ef3537Ssinsanction if (params.hasIQWakeUp) { 441e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 442e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 443e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 444aa2bcc31SzhanglyGit } 445aa2bcc31SzhanglyGit } 446a6938b17Ssinsanction 44725df626eSgood-circle io.vecLdIn.foreach(dontTouch(_)) 448a6938b17Ssinsanction 449a6938b17Ssinsanction // entries perf counter 450a6938b17Ssinsanction // enq 451a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 452a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 453a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 454a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 455a6938b17Ssinsanction } 456a6938b17Ssinsanction // simple 457a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 458a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 459a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 460a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 461a6938b17Ssinsanction } 462a6938b17Ssinsanction // complex 463a6938b17Ssinsanction for (i <- 0 until params.numComp) { 464a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 465a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 466a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 467a6938b17Ssinsanction } 468a6938b17Ssinsanction // total 469a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 470a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 471a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 472e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 473e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 474d280e426Slewislzh if (params.hasIQWakeUp) { 475e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 476e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 477e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 478e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 479e3ef3537Ssinsanction } 480e3ef3537Ssinsanction } 481d280e426Slewislzh } 482a6938b17Ssinsanction 483a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 484a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 485a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 4867e471bf8SXuan Hu 487e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 488e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 489d280e426Slewislzh if (params.hasIQWakeUp) { 490e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 491e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 492e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 493e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 494e3ef3537Ssinsanction } 495e3ef3537Ssinsanction } 496e3ef3537Ssinsanction } 497e3ef3537Ssinsanction 498e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 499e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 500e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 501e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 502e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 503e3ef3537Ssinsanction if (params.hasIQWakeUp) { 504e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 505e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 506e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 507e3ef3537Ssinsanction 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) })) 508e3ef3537Ssinsanction } 509e3ef3537Ssinsanction } 510e3ef3537Ssinsanction } 511e3ef3537Ssinsanction } 512d280e426Slewislzh } 513aa2bcc31SzhanglyGit} 514aa2bcc31SzhanglyGit 515aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 516aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 517aa2bcc31SzhanglyGit //enq 518aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 519aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 520aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 521c38df446SzhanglyGit val og2Resp = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 522aa2bcc31SzhanglyGit //deq sel 523aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 524aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 525aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 52628607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 52728607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 52828607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 529aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 530aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 531aa2bcc31SzhanglyGit // wakeup 532aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 533aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 534b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 535b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 536aa2bcc31SzhanglyGit val og0Cancel = Input(ExuOH(backendParams.numExu)) 537aa2bcc31SzhanglyGit val og1Cancel = Input(ExuOH(backendParams.numExu)) 538aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 539aa2bcc31SzhanglyGit //entries status 540aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 541aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 542aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 543aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 544ec49b127Ssinsanction val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))) 545864480f4Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec())))) 546aa2bcc31SzhanglyGit //deq status 547aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 548aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 549aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 550e07131b2Ssinsanction 551e07131b2Ssinsanction // load/hybird only 552e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 553e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 554e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 555e07131b2Ssinsanction }) 556aa2bcc31SzhanglyGit // mem only 557e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 558aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 559d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 560e07131b2Ssinsanction }) 56199944b79Ssinsanction // vec mem only 562aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 563aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 564aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 565aa2bcc31SzhanglyGit }) 5667e471bf8SXuan Hu val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle { 5677e471bf8SXuan Hu val resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 5687e471bf8SXuan Hu }) 569aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 570aa2bcc31SzhanglyGit 57128607074Ssinsanction // trans 57228607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 57328607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 57428607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 57528607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 576aa2bcc31SzhanglyGit 577aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5785db4956bSzhanglyGit} 579