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 63*42b6cdf9Ssinsanction if (params.needOg2Resp) 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())) 84c0beb497Sxiaofeibao val issuedVec = Wire(Vec(params.numEntries, Bool())) 85c0beb497Sxiaofeibao 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. 186c0beb497Sxiaofeibao 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) { 189c0beb497Sxiaofeibao othersTransSelVec.get(1).valid := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 190c0beb497Sxiaofeibao 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. 224c0beb497Sxiaofeibao simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0) 22528607074Ssinsanction simpTransSelVec.get(0).bits := simpTransPolicy.get.io.enqSelOHVec(0).bits 226c0beb497Sxiaofeibao 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) { 229c0beb497Sxiaofeibao simpTransSelVec.get(1).valid := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 230c0beb497Sxiaofeibao simpTransSelVec.get(1).bits := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).bits, simpTransPolicy.get.io.enqSelOHVec(1).bits) 231c0beb497Sxiaofeibao compTransSelVec.get(1).valid := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1) 232c0beb497Sxiaofeibao 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)) => 276*42b6cdf9Ssinsanction val respInDatapath = if (!params.isVecMemIQ) resps(issueTimer(0))(deqPortIdx) 277*42b6cdf9Ssinsanction else resps(issueTimer)(deqPortIdx) 278dd40a82bSsinsanction val respAfterDatapath = Wire(chiselTypeOf(respInDatapath)) 279f7890d3cSXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => 28028ac1c16Sxiaofeibao-xjtu x.valid && 28128ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackSqIdx) x.bits.sqIdx.get === sqIdx else true.B) && 28228ac1c16Sxiaofeibao-xjtu (if (params.needFeedBackLqIdx) x.bits.lqIdx.get === lqIdx else true.B) 283f7890d3cSXuan Hu ).toSeq) 284dd40a82bSsinsanction respAfterDatapath.valid := hitRespsVec.reduce(_ | _) 285dd40a82bSsinsanction respAfterDatapath.bits := (if (memEtyResps.size == 1) memEtyResps.head.bits 286dd40a82bSsinsanction else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)) 287*42b6cdf9Ssinsanction issueResp := (if (!params.isVecMemIQ) Mux(issueTimer(1), respAfterDatapath, respInDatapath) 288*42b6cdf9Ssinsanction else Mux(issueTimer === "b11".U, respAfterDatapath, respInDatapath)) 289887f9c3dSzhanglinjuan } 2905db4956bSzhanglyGit } 2915db4956bSzhanglyGit else { 292dd40a82bSsinsanction issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) => 2935db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 2945db4956bSzhanglyGit issueResp := Resp 2955db4956bSzhanglyGit } 2965db4956bSzhanglyGit } 2975db4956bSzhanglyGit 29840283787Ssinsanction //deq 29928607074Ssinsanction val enqEntryOldest = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 30028607074Ssinsanction val simpEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30128607074Ssinsanction val compEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30228607074Ssinsanction val othersEntryOldest = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30328607074Ssinsanction val enqEntryOldestCancel = Wire(Vec(params.numDeq, Bool())) 30428607074Ssinsanction val simpEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30528607074Ssinsanction val compEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 30628607074Ssinsanction val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool()))) 30728607074Ssinsanction 30828607074Ssinsanction io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) => 30928607074Ssinsanction enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum)) 310eea4a3caSzhanglyGit enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum)) 31140283787Ssinsanction } 31228607074Ssinsanction 31328607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 31428607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 31528607074Ssinsanction othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum)) 316eea4a3caSzhanglyGit othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum)) 317af4bd265SzhanglyGit } 31840283787Ssinsanction } 31928607074Ssinsanction else { 32028607074Ssinsanction io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32128607074Ssinsanction simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum)) 322eea4a3caSzhanglyGit simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum)) 32328607074Ssinsanction } 32428607074Ssinsanction io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32528607074Ssinsanction compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum)) 326eea4a3caSzhanglyGit compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum)) 32728607074Ssinsanction } 328af4bd265SzhanglyGit } 329cf4a131aSsinsanction 330cf4a131aSsinsanction if (params.deqFuSame) { 331cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 332cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 333a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 334cf4a131aSsinsanction 335aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 336aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 33728607074Ssinsanction 33828607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 33928607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 34028607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 341eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 342eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 343cf4a131aSsinsanction 34428607074Ssinsanction io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1)) 345aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 34628607074Ssinsanction io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)) 347a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 34828607074Ssinsanction } 34928607074Ssinsanction else { 35028607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 35128607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries) 352eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 353eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 35428607074Ssinsanction 35528607074Ssinsanction io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid, 35628607074Ssinsanction compEntryOldest.get(0), 35728607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1))) 35828607074Ssinsanction io.deqEntry(1) := subDeqPolicyEntryVec(0) 35928607074Ssinsanction io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid, 36028607074Ssinsanction compEntryOldestCancel.get(0), 36128607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))) 36228607074Ssinsanction io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 36328607074Ssinsanction } 364cf4a131aSsinsanction 365cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 366aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 36740283787Ssinsanction } 368cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 369aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 370f7f73727Ssinsanction } 371f7f73727Ssinsanction } 372f7f73727Ssinsanction else { 37328607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 37428607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) => 37528607074Ssinsanction io.deqEntry(i) := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i)) 37628607074Ssinsanction io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i)) 37728607074Ssinsanction } 37828607074Ssinsanction } 37928607074Ssinsanction else { 38028607074Ssinsanction io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) => 38128607074Ssinsanction io.deqEntry(i) := Mux(compSel.valid, 38228607074Ssinsanction compEntryOldest.get(i), 38328607074Ssinsanction Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i))) 38428607074Ssinsanction io.cancelDeqVec(i) := Mux(compSel.valid, 38528607074Ssinsanction compEntryOldestCancel.get(i), 38628607074Ssinsanction Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i))) 38728607074Ssinsanction } 388af4bd265SzhanglyGit } 389af4bd265SzhanglyGit } 390af4bd265SzhanglyGit 3915db4956bSzhanglyGit io.valid := validVec.asUInt 392c0beb497Sxiaofeibao io.issued := issuedVec.asUInt 3935db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3945db4956bSzhanglyGit io.fuType := fuTypeVec 3955db4956bSzhanglyGit io.dataSources := dataSourceVec 396864480f4Sxiaofeibao-xjtu io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 397eea4a3caSzhanglyGit io.loadDependency := loadDependencyVec 398aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 399aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 4008d081717Sszw_kaixin } 40128607074Ssinsanction io.simpEntryEnqSelVec.foreach(_ := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid))) 40228607074Ssinsanction io.compEntryEnqSelVec.foreach(_ := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid))) 40328607074Ssinsanction io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid))) 404aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 405aa2bcc31SzhanglyGit 4067e471bf8SXuan Hu 407aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 408aa2bcc31SzhanglyGit in.flush := io.flush 409aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 410aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 411b6279fc6SZiyue Zhang in.vlIsZero := io.vlIsZero 412b6279fc6SZiyue Zhang in.vlIsVlmax := io.vlIsVlmax 413aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 414aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 415aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 416aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 417aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 418aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 419aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 420aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 421aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 422aa2bcc31SzhanglyGit } 423aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 424c0beb497Sxiaofeibao issuedVec(entryIdx) := out.issued 425aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 426aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 427aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 428aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 429aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 430aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 431aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 432aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 433eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 434ec49b127Ssinsanction cancelBypassVec(entryIdx) := out.cancelBypass 435aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 436aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 437aa2bcc31SzhanglyGit } 43828ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 43938f78b5dSxiaofeibao-xjtu sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx 44028ac1c16Sxiaofeibao-xjtu lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx 441aa2bcc31SzhanglyGit } 442a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 443a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 444a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 445e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 446e3ef3537Ssinsanction if (params.hasIQWakeUp) { 447e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 448e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 449e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 450aa2bcc31SzhanglyGit } 451aa2bcc31SzhanglyGit } 452a6938b17Ssinsanction 45325df626eSgood-circle io.vecLdIn.foreach(dontTouch(_)) 454a6938b17Ssinsanction 455a6938b17Ssinsanction // entries perf counter 456a6938b17Ssinsanction // enq 457a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 458a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 459a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 460a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 461a6938b17Ssinsanction } 462a6938b17Ssinsanction // simple 463a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 464a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 465a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 466a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 467a6938b17Ssinsanction } 468a6938b17Ssinsanction // complex 469a6938b17Ssinsanction for (i <- 0 until params.numComp) { 470a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 471a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 472a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 473a6938b17Ssinsanction } 474a6938b17Ssinsanction // total 475a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 476a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 477a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 478e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 479e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 480d280e426Slewislzh if (params.hasIQWakeUp) { 481e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 482e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 483e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 484e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 485e3ef3537Ssinsanction } 486e3ef3537Ssinsanction } 487d280e426Slewislzh } 488a6938b17Ssinsanction 489a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 490a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 491a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 4927e471bf8SXuan Hu 493e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 494e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 495d280e426Slewislzh if (params.hasIQWakeUp) { 496e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 497e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 498e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 499e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 500e3ef3537Ssinsanction } 501e3ef3537Ssinsanction } 502e3ef3537Ssinsanction } 503e3ef3537Ssinsanction 504e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 505e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 506e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 507e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 508e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 509e3ef3537Ssinsanction if (params.hasIQWakeUp) { 510e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 511e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 512e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 513e3ef3537Ssinsanction 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) })) 514e3ef3537Ssinsanction } 515e3ef3537Ssinsanction } 516e3ef3537Ssinsanction } 517e3ef3537Ssinsanction } 518d280e426Slewislzh } 519aa2bcc31SzhanglyGit} 520aa2bcc31SzhanglyGit 521aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 522aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 523aa2bcc31SzhanglyGit //enq 524aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 525aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 526aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 527*42b6cdf9Ssinsanction val og2Resp = OptionWrapper(params.needOg2Resp, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 528aa2bcc31SzhanglyGit //deq sel 529aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 530aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 531aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 53228607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 53328607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 53428607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 535aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 536aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 537aa2bcc31SzhanglyGit // wakeup 538aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 539aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 540b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 541b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 542be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 543be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 544aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 545aa2bcc31SzhanglyGit //entries status 546aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 547c0beb497Sxiaofeibao val issued = Output(UInt(params.numEntries.W)) 548aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 549aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 550aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 551ec49b127Ssinsanction val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))) 552864480f4Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec())))) 553aa2bcc31SzhanglyGit //deq status 554aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 555aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 556aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 557e07131b2Ssinsanction 558e07131b2Ssinsanction // load/hybird only 559e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 560e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 561e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 562e07131b2Ssinsanction }) 563aa2bcc31SzhanglyGit // mem only 564e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 565aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 566d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 567e07131b2Ssinsanction }) 56899944b79Ssinsanction // vec mem only 569aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 570aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 571aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 572aa2bcc31SzhanglyGit }) 5737e471bf8SXuan Hu val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle { 5747e471bf8SXuan Hu val resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 5757e471bf8SXuan Hu }) 576aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 577aa2bcc31SzhanglyGit 57828607074Ssinsanction // trans 57928607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 58028607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 58128607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 58228607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 583aa2bcc31SzhanglyGit 584aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5855db4956bSzhanglyGit} 586