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 61ae0295f4STang Haojin val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = Wire(Vec(4, chiselTypeOf(io.og0Resp))) 62ae0295f4STang Haojin 63c38df446SzhanglyGit if (params.inVfSchd) 64ae0295f4STang Haojin resps := Seq(io.og0Resp, io.og1Resp, io.og2Resp.get, WireDefault(0.U.asTypeOf(io.og0Resp))) 65c38df446SzhanglyGit else 66ae0295f4STang 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())) 84*c0beb497Sxiaofeibao val issuedVec = Wire(Vec(params.numEntries, Bool())) 85*c0beb497Sxiaofeibao val validForTrans = VecInit(validVec.zip(issuedVec).map(x => x._1 && !x._2)) 865db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 875db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 885db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 895db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 9028ac1c16Sxiaofeibao-xjtu val sqIdxVec = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new SqPtr()))) 9128ac1c16Sxiaofeibao-xjtu val lqIdxVec = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new LqPtr()))) 92aa2bcc31SzhanglyGit //src status 93aa2bcc31SzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 94ec49b127Ssinsanction val loadDependencyVec = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))) 95aa2bcc31SzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 96aa2bcc31SzhanglyGit //deq sel 97aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 98aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 995db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 1005db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 101aa2bcc31SzhanglyGit //trans sel 10228607074Ssinsanction val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool())) 10328607074Ssinsanction val othersEntryEnqVec = Wire(Vec(OthersEntryNum, Valid(new EntryBundle))) 10428607074Ssinsanction val enqEntryTransVec = Wire(Vec(EnqEntryNum, Valid(new EntryBundle))) 10528607074Ssinsanction val simpEntryTransVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle)))) 10628607074Ssinsanction val compEnqVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))) 10728607074Ssinsanction 10828607074Ssinsanction val enqCanTrans2Simp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 10928607074Ssinsanction val enqCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 11028607074Ssinsanction val simpCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool()))) 11128607074Ssinsanction val simpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W))))) 11228607074Ssinsanction val compTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W))))) 11328607074Ssinsanction val finalSimpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W)))) 11428607074Ssinsanction val finalCompTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W)))) 11528607074Ssinsanction 11628607074Ssinsanction val enqCanTrans2Others = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool())) 11728607074Ssinsanction val othersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))) 11828607074Ssinsanction val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W)))) 11928607074Ssinsanction 12028607074Ssinsanction val simpEntryEnqReadyVec = othersEntryEnqReadyVec.take(SimpEntryNum) 12128607074Ssinsanction val compEntryEnqReadyVec = othersEntryEnqReadyVec.takeRight(CompEntryNum) 12228607074Ssinsanction val simpEntryEnqVec = othersEntryEnqVec.take(SimpEntryNum) 12328607074Ssinsanction val compEntryEnqVec = othersEntryEnqVec.takeRight(CompEntryNum) 124aa2bcc31SzhanglyGit //debug 125a6938b17Ssinsanction val entryInValidVec = Wire(Vec(params.numEntries, Bool())) 126a6938b17Ssinsanction val entryOutDeqValidVec = Wire(Vec(params.numEntries, Bool())) 127a6938b17Ssinsanction val entryOutTransValidVec = Wire(Vec(params.numEntries, Bool())) 128e3ef3537Ssinsanction val perfLdCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 129e3ef3537Ssinsanction val perfOg0CancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 130e3ef3537Ssinsanction val perfWakeupByWBVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))) 131e3ef3537Ssinsanction val perfWakeupByIQVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))))) 132a4d38a63SzhanglyGit //cancel bypass 133eea4a3caSzhanglyGit val cancelBypassVec = Wire(Vec(params.numEntries, Bool())) 1345db4956bSzhanglyGit 1355db4956bSzhanglyGit 1365db4956bSzhanglyGit //enqEntries 1375db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 138aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 13928607074Ssinsanction enqEntry.io.commonIn.transSel := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid 14028607074Ssinsanction else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid) 141aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 14256db494fSxiaofeibao-xjtu enqEntry.io.enqDelayIn1.wakeUpFromWB := RegNext(io.wakeUpFromWB) 14356db494fSxiaofeibao-xjtu enqEntry.io.enqDelayIn1.wakeUpFromIQ := RegNext(io.wakeUpFromIQ) 14456db494fSxiaofeibao-xjtu enqEntry.io.enqDelayIn1.srcLoadDependency := RegNext(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc))) 145be9ff987Ssinsanction enqEntry.io.enqDelayIn1.og0Cancel := RegNext(io.og0Cancel) 1464fa640e4Ssinsanction enqEntry.io.enqDelayIn1.ldCancel := RegNext(io.ldCancel) 1474fa640e4Ssinsanction // note: these signals with 2 cycle delay should not be enabled by io.enq.valid 1484fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromWB := DelayN(io.wakeUpFromWB, 2) 1494fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromIQ := DelayN(io.wakeUpFromIQ, 2) 15091f31488Sxiaofeibao-xjtu enqEntry.io.enqDelayIn2.srcLoadDependency := DelayN(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), 2) 151be9ff987Ssinsanction enqEntry.io.enqDelayIn2.og0Cancel := DelayN(io.og0Cancel, 2) 1524fa640e4Ssinsanction enqEntry.io.enqDelayIn2.ldCancel := DelayN(io.ldCancel, 2) 15328607074Ssinsanction enqEntryTransVec(entryIdx) := enqEntry.io.commonOut.transEntry 1545db4956bSzhanglyGit } 1555db4956bSzhanglyGit //othersEntries 1565db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 15728607074Ssinsanction othersEntry.io.commonIn.enq := othersEntryEnqVec(entryIdx) 15828607074Ssinsanction othersEntry.io.commonIn.transSel := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) 15928607074Ssinsanction io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _) 16028607074Ssinsanction else false.B) 161aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 16228607074Ssinsanction othersEntryEnqReadyVec(entryIdx) := othersEntry.io.commonOut.enqReady 16328607074Ssinsanction if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) { 16428607074Ssinsanction simpEntryTransVec.get(entryIdx) := othersEntry.io.commonOut.transEntry 16528607074Ssinsanction } 1665db4956bSzhanglyGit } 1675db4956bSzhanglyGit 1685db4956bSzhanglyGit 1695db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 170aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1715db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1725db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1735db4956bSzhanglyGit } 1745db4956bSzhanglyGit 1755db4956bSzhanglyGit 17628607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 1775db4956bSzhanglyGit //transPolicy 178b9631a81Sxiaofeibao-xjtu othersTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(OthersEntryNum).map(!_)).asUInt 179b43488b9Ssinsanction 180b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to others entries. 181b9631a81Sxiaofeibao-xjtu enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(OthersEntryNum).map(!_)) 182b43488b9Ssinsanction // othersTransSelVec(i) is the target others entry for enq entry [i]. 183b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 184b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 185b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 186*c0beb497Sxiaofeibao othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0) 18728607074Ssinsanction othersTransSelVec.get(0).bits := othersTransPolicy.get.io.enqSelOHVec(0).bits 1888321ef33Ssinsanction if (params.numEnq == 2) { 189*c0beb497Sxiaofeibao othersTransSelVec.get(1).valid := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 190*c0beb497Sxiaofeibao othersTransSelVec.get(1).bits := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).bits, othersTransPolicy.get.io.enqSelOHVec(1).bits) 1918321ef33Ssinsanction } 1928321ef33Ssinsanction 19328607074Ssinsanction finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 19428607074Ssinsanction finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits 1955db4956bSzhanglyGit } 1965db4956bSzhanglyGit 19728607074Ssinsanction //othersEntryEnq 19828607074Ssinsanction othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) => 19928607074Ssinsanction val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx)) 20028607074Ssinsanction if (othersEnqOH.size == 1) 20128607074Ssinsanction othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 20228607074Ssinsanction else 20328607074Ssinsanction othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec) 2045db4956bSzhanglyGit } 20528607074Ssinsanction } 20628607074Ssinsanction else { 20728607074Ssinsanction //transPolicy 20828607074Ssinsanction simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt 20928607074Ssinsanction compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt 21028607074Ssinsanction 211b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to comp/simp entries. 212b43488b9Ssinsanction // when all of simp entries are empty and comp entries are enough, transfer to comp entries. 213b43488b9Ssinsanction // otherwise, transfer to simp entries. 21428607074Ssinsanction enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _) 21528607074Ssinsanction enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec) 21628607074Ssinsanction simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) => 21728607074Ssinsanction canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U 21828607074Ssinsanction } 21928607074Ssinsanction 220b43488b9Ssinsanction // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i]. 221b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 222b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 223b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 224*c0beb497Sxiaofeibao simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0) 22528607074Ssinsanction simpTransSelVec.get(0).bits := simpTransPolicy.get.io.enqSelOHVec(0).bits 226*c0beb497Sxiaofeibao compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0) 22728607074Ssinsanction compTransSelVec.get(0).bits := compTransPolicy.get.io.enqSelOHVec(0).bits 22828607074Ssinsanction if (params.numEnq == 2) { 229*c0beb497Sxiaofeibao simpTransSelVec.get(1).valid := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 230*c0beb497Sxiaofeibao simpTransSelVec.get(1).bits := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).bits, simpTransPolicy.get.io.enqSelOHVec(1).bits) 231*c0beb497Sxiaofeibao compTransSelVec.get(1).valid := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 232*c0beb497Sxiaofeibao compTransSelVec.get(1).bits := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).bits, compTransPolicy.get.io.enqSelOHVec(1).bits) 23328607074Ssinsanction } 23428607074Ssinsanction 23528607074Ssinsanction finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 23628607074Ssinsanction finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits 23728607074Ssinsanction } 23828607074Ssinsanction finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach { 23928607074Ssinsanction case (((finalOH, selOH), origSelOH), enqIdx) => 24028607074Ssinsanction finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits) 24128607074Ssinsanction } 24228607074Ssinsanction 24328607074Ssinsanction //othersEntryEnq 24428607074Ssinsanction simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) => 24528607074Ssinsanction val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx)) 24628607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 24728607074Ssinsanction if (simpEnqOH.size == 1) 24828607074Ssinsanction simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 24928607074Ssinsanction else 25028607074Ssinsanction simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec) 25128607074Ssinsanction } 25228607074Ssinsanction 25328607074Ssinsanction compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) => 25428607074Ssinsanction compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get)) 25528607074Ssinsanction } 25628607074Ssinsanction compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) => 25728607074Ssinsanction val compEnqOH = finalCompTransSelVec.get.map(_(compIdx)) 25828607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 25928607074Ssinsanction if (compEnqOH.size == 1) 26028607074Ssinsanction compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head)) 26128607074Ssinsanction else 26228607074Ssinsanction compEntryEnq := Mux1H(compEnqOH, compEnqVec.get) 26328607074Ssinsanction } 26428607074Ssinsanction 26528607074Ssinsanction assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n") 26628607074Ssinsanction assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n") 26728607074Ssinsanction } 26828607074Ssinsanction 2698d081717Sszw_kaixin if(backendParams.debugEn) { 27028607074Ssinsanction dontTouch(othersEntryEnqVec) 2718d081717Sszw_kaixin } 2725db4956bSzhanglyGit 2735db4956bSzhanglyGit //issueRespVec 27428ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 27528ac1c16Sxiaofeibao-xjtu issueRespVec.lazyZip(sqIdxVec.get.zip(lqIdxVec.get)).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (sqIdx, lqIdx), (issueTimer, deqPortIdx)) => 276dd40a82bSsinsanction val respInDatapath = resps(issueTimer(0))(deqPortIdx) 277dd40a82bSsinsanction val respAfterDatapath = Wire(chiselTypeOf(respInDatapath)) 278f7890d3cSXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => 27928ac1c16Sxiaofeibao-xjtu x.valid && 28028ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackSqIdx) x.bits.sqIdx.get === sqIdx else true.B) && 28128ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackLqIdx) x.bits.lqIdx.get === lqIdx else true.B) 282f7890d3cSXuan Hu ).toSeq) 283dd40a82bSsinsanction respAfterDatapath.valid := hitRespsVec.reduce(_ | _) 284dd40a82bSsinsanction respAfterDatapath.bits := (if (memEtyResps.size == 1) memEtyResps.head.bits 285dd40a82bSsinsanction else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)) 286dd40a82bSsinsanction issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath) 287887f9c3dSzhanglinjuan } 2885db4956bSzhanglyGit } 2895db4956bSzhanglyGit else { 290dd40a82bSsinsanction issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) => 2915db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 2925db4956bSzhanglyGit issueResp := Resp 2935db4956bSzhanglyGit } 2945db4956bSzhanglyGit } 2955db4956bSzhanglyGit 29640283787Ssinsanction //deq 29728607074Ssinsanction val enqEntryOldest = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 29828607074Ssinsanction val simpEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 29928607074Ssinsanction val compEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30028607074Ssinsanction val othersEntryOldest = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30128607074Ssinsanction val enqEntryOldestCancel = Wire(Vec(params.numDeq, Bool())) 30228607074Ssinsanction val simpEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30328607074Ssinsanction val compEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30428607074Ssinsanction val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool()))) 30528607074Ssinsanction 30628607074Ssinsanction io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) => 30728607074Ssinsanction enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum)) 308eea4a3caSzhanglyGit enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum)) 30940283787Ssinsanction } 31028607074Ssinsanction 31128607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 31228607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 31328607074Ssinsanction othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum)) 314eea4a3caSzhanglyGit othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum)) 315af4bd265SzhanglyGit } 31640283787Ssinsanction } 31728607074Ssinsanction else { 31828607074Ssinsanction io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 31928607074Ssinsanction simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum)) 320eea4a3caSzhanglyGit simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum)) 32128607074Ssinsanction } 32228607074Ssinsanction io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32328607074Ssinsanction compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum)) 324eea4a3caSzhanglyGit compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum)) 32528607074Ssinsanction } 326af4bd265SzhanglyGit } 327cf4a131aSsinsanction 328cf4a131aSsinsanction if (params.deqFuSame) { 329cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 330cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 331a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 332cf4a131aSsinsanction 333aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 334aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 33528607074Ssinsanction 33628607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 33728607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 33828607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 339eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 340eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 341cf4a131aSsinsanction 34228607074Ssinsanction io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1)) 343aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 34428607074Ssinsanction io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)) 345a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 34628607074Ssinsanction } 34728607074Ssinsanction else { 34828607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 34928607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries) 350eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 351eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 35228607074Ssinsanction 35328607074Ssinsanction io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid, 35428607074Ssinsanction compEntryOldest.get(0), 35528607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1))) 35628607074Ssinsanction io.deqEntry(1) := subDeqPolicyEntryVec(0) 35728607074Ssinsanction io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid, 35828607074Ssinsanction compEntryOldestCancel.get(0), 35928607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))) 36028607074Ssinsanction io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 36128607074Ssinsanction } 362cf4a131aSsinsanction 363cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 364aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 36540283787Ssinsanction } 366cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 367aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 368f7f73727Ssinsanction } 369f7f73727Ssinsanction } 370f7f73727Ssinsanction else { 37128607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 37228607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) => 37328607074Ssinsanction io.deqEntry(i) := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i)) 37428607074Ssinsanction io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i)) 37528607074Ssinsanction } 37628607074Ssinsanction } 37728607074Ssinsanction else { 37828607074Ssinsanction io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) => 37928607074Ssinsanction io.deqEntry(i) := Mux(compSel.valid, 38028607074Ssinsanction compEntryOldest.get(i), 38128607074Ssinsanction Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i))) 38228607074Ssinsanction io.cancelDeqVec(i) := Mux(compSel.valid, 38328607074Ssinsanction compEntryOldestCancel.get(i), 38428607074Ssinsanction Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i))) 38528607074Ssinsanction } 386af4bd265SzhanglyGit } 387af4bd265SzhanglyGit } 388af4bd265SzhanglyGit 3895db4956bSzhanglyGit io.valid := validVec.asUInt 390*c0beb497Sxiaofeibao io.issued := issuedVec.asUInt 3915db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3925db4956bSzhanglyGit io.fuType := fuTypeVec 3935db4956bSzhanglyGit io.dataSources := dataSourceVec 394864480f4Sxiaofeibao-xjtu io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 395eea4a3caSzhanglyGit io.loadDependency := loadDependencyVec 396aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 397aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 3988d081717Sszw_kaixin } 39928607074Ssinsanction io.simpEntryEnqSelVec.foreach(_ := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid))) 40028607074Ssinsanction io.compEntryEnqSelVec.foreach(_ := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid))) 40128607074Ssinsanction io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid))) 402aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 403aa2bcc31SzhanglyGit 4047e471bf8SXuan Hu 405aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 406aa2bcc31SzhanglyGit in.flush := io.flush 407aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 408aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 409b6279fc6SZiyue Zhang in.vlIsZero := io.vlIsZero 410b6279fc6SZiyue Zhang in.vlIsVlmax := io.vlIsVlmax 411aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 412aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 413aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 414aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 415aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 416aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 417aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 418aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 419aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 420aa2bcc31SzhanglyGit } 421aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 422*c0beb497Sxiaofeibao issuedVec(entryIdx) := out.issued 423aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 424aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 425aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 426aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 427aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 428aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 429aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 430aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 431eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 432ec49b127Ssinsanction cancelBypassVec(entryIdx) := out.cancelBypass 433aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 434aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 435aa2bcc31SzhanglyGit } 43628ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 43738f78b5dSxiaofeibao-xjtu sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx 43828ac1c16Sxiaofeibao-xjtu lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx 439aa2bcc31SzhanglyGit } 440a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 441a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 442a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 443e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 444e3ef3537Ssinsanction if (params.hasIQWakeUp) { 445e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 446e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 447e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 448aa2bcc31SzhanglyGit } 449aa2bcc31SzhanglyGit } 450a6938b17Ssinsanction 45125df626eSgood-circle io.vecLdIn.foreach(dontTouch(_)) 452a6938b17Ssinsanction 453a6938b17Ssinsanction // entries perf counter 454a6938b17Ssinsanction // enq 455a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 456a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 457a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 458a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 459a6938b17Ssinsanction } 460a6938b17Ssinsanction // simple 461a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 462a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 463a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 464a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 465a6938b17Ssinsanction } 466a6938b17Ssinsanction // complex 467a6938b17Ssinsanction for (i <- 0 until params.numComp) { 468a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 469a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 470a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 471a6938b17Ssinsanction } 472a6938b17Ssinsanction // total 473a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 474a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 475a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 476e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 477e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 478d280e426Slewislzh if (params.hasIQWakeUp) { 479e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 480e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 481e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 482e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 483e3ef3537Ssinsanction } 484e3ef3537Ssinsanction } 485d280e426Slewislzh } 486a6938b17Ssinsanction 487a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 488a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 489a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 4907e471bf8SXuan Hu 491e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 492e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 493d280e426Slewislzh if (params.hasIQWakeUp) { 494e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 495e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 496e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 497e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 498e3ef3537Ssinsanction } 499e3ef3537Ssinsanction } 500e3ef3537Ssinsanction } 501e3ef3537Ssinsanction 502e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 503e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 504e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 505e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 506e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 507e3ef3537Ssinsanction if (params.hasIQWakeUp) { 508e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 509e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 510e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 511e3ef3537Ssinsanction 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) })) 512e3ef3537Ssinsanction } 513e3ef3537Ssinsanction } 514e3ef3537Ssinsanction } 515e3ef3537Ssinsanction } 516d280e426Slewislzh } 517aa2bcc31SzhanglyGit} 518aa2bcc31SzhanglyGit 519aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 520aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 521aa2bcc31SzhanglyGit //enq 522aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 523aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 524aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 525c38df446SzhanglyGit val og2Resp = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 526aa2bcc31SzhanglyGit //deq sel 527aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 528aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 529aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 53028607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 53128607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 53228607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 533aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 534aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 535aa2bcc31SzhanglyGit // wakeup 536aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 537aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 538b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 539b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 540be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 541be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 542aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 543aa2bcc31SzhanglyGit //entries status 544aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 545*c0beb497Sxiaofeibao val issued = Output(UInt(params.numEntries.W)) 546aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 547aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 548aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 549ec49b127Ssinsanction val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))) 550864480f4Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec())))) 551aa2bcc31SzhanglyGit //deq status 552aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 553aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 554aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 555e07131b2Ssinsanction 556e07131b2Ssinsanction // load/hybird only 557e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 558e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 559e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 560e07131b2Ssinsanction }) 561aa2bcc31SzhanglyGit // mem only 562e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 563aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 564d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 565e07131b2Ssinsanction }) 56699944b79Ssinsanction // vec mem only 567aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 568aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 569aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 570aa2bcc31SzhanglyGit }) 5717e471bf8SXuan Hu val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle { 5727e471bf8SXuan Hu val resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 5737e471bf8SXuan Hu }) 574aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 575aa2bcc31SzhanglyGit 57628607074Ssinsanction // trans 57728607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 57828607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 57928607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 58028607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 581aa2bcc31SzhanglyGit 582aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5835db4956bSzhanglyGit} 584