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 6342b6cdf9Ssinsanction 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) 1428338e674Sxiaofeibao-xjtu enqEntry.io.enqDelayIn1.wakeUpFromWB := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid) 1438338e674Sxiaofeibao-xjtu enqEntry.io.enqDelayIn1.wakeUpFromIQ := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid) 1448338e674Sxiaofeibao-xjtu enqEntry.io.enqDelayIn1.srcLoadDependency := RegEnable(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), io.enq(entryIdx).valid) 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)) => 27642b6cdf9Ssinsanction val respInDatapath = if (!params.isVecMemIQ) resps(issueTimer(0))(deqPortIdx) 27742b6cdf9Ssinsanction 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)) 28742b6cdf9Ssinsanction issueResp := (if (!params.isVecMemIQ) Mux(issueTimer(1), respAfterDatapath, respInDatapath) 28842b6cdf9Ssinsanction 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 411*d88d4328SZiyue Zhang in.vlFromIntIsZero := io.vlFromIntIsZero 412*d88d4328SZiyue Zhang in.vlFromIntIsVlmax := io.vlFromIntIsVlmax 413*d88d4328SZiyue Zhang in.vlFromVfIsZero := io.vlFromVfIsZero 414*d88d4328SZiyue Zhang in.vlFromVfIsVlmax := io.vlFromVfIsVlmax 415aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 416aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 417aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 418aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 419aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 420aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 421aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 422aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 423aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 424aa2bcc31SzhanglyGit } 425aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 426c0beb497Sxiaofeibao issuedVec(entryIdx) := out.issued 427aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 428aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 429aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 430aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 431aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 432aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 433aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 434aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 435eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 436ec49b127Ssinsanction cancelBypassVec(entryIdx) := out.cancelBypass 437aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 438aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 439aa2bcc31SzhanglyGit } 44028ac1c16Sxiaofeibao-xjtu if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) { 44138f78b5dSxiaofeibao-xjtu sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx 44228ac1c16Sxiaofeibao-xjtu lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx 443aa2bcc31SzhanglyGit } 444a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 445a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 446a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 447e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 448e3ef3537Ssinsanction if (params.hasIQWakeUp) { 449e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 450e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 451e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 452aa2bcc31SzhanglyGit } 453aa2bcc31SzhanglyGit } 454a6938b17Ssinsanction 45525df626eSgood-circle io.vecLdIn.foreach(dontTouch(_)) 456a6938b17Ssinsanction 457a6938b17Ssinsanction // entries perf counter 458a6938b17Ssinsanction // enq 459a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 460a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 461a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 462a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 463a6938b17Ssinsanction } 464a6938b17Ssinsanction // simple 465a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 466a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 467a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 468a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 469a6938b17Ssinsanction } 470a6938b17Ssinsanction // complex 471a6938b17Ssinsanction for (i <- 0 until params.numComp) { 472a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 473a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 474a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 475a6938b17Ssinsanction } 476a6938b17Ssinsanction // total 477a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 478a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 479a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 480e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 481e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 482d280e426Slewislzh if (params.hasIQWakeUp) { 483e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 484e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 485e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 486e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 487e3ef3537Ssinsanction } 488e3ef3537Ssinsanction } 489d280e426Slewislzh } 490a6938b17Ssinsanction 491a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 492a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 493a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 4947e471bf8SXuan Hu 495e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 496e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 497d280e426Slewislzh if (params.hasIQWakeUp) { 498e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 499e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 500e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 501e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 502e3ef3537Ssinsanction } 503e3ef3537Ssinsanction } 504e3ef3537Ssinsanction } 505e3ef3537Ssinsanction 506e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 507e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 508e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 509e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 510e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 511e3ef3537Ssinsanction if (params.hasIQWakeUp) { 512e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 513e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 514e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 515e3ef3537Ssinsanction 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) })) 516e3ef3537Ssinsanction } 517e3ef3537Ssinsanction } 518e3ef3537Ssinsanction } 519e3ef3537Ssinsanction } 520d280e426Slewislzh } 521aa2bcc31SzhanglyGit} 522aa2bcc31SzhanglyGit 523aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 524aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 525aa2bcc31SzhanglyGit //enq 526aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 527aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 528aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 52942b6cdf9Ssinsanction val og2Resp = OptionWrapper(params.needOg2Resp, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 530aa2bcc31SzhanglyGit //deq sel 531aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 532aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 533aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 53428607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 53528607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 53628607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 537aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 538aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 539aa2bcc31SzhanglyGit // wakeup 540aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 541aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 542*d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 543*d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 544*d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 545*d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 546be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 547be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 548aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 549aa2bcc31SzhanglyGit //entries status 550aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 551c0beb497Sxiaofeibao val issued = Output(UInt(params.numEntries.W)) 552aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 553aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 554aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 555ec49b127Ssinsanction val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))) 556864480f4Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec())))) 557aa2bcc31SzhanglyGit //deq status 558aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 559aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 560aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 561e07131b2Ssinsanction 562e07131b2Ssinsanction // load/hybird only 563e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 564e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 565e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 566e07131b2Ssinsanction }) 567aa2bcc31SzhanglyGit // mem only 568e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 569aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 570d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 571e07131b2Ssinsanction }) 57299944b79Ssinsanction // vec mem only 573aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 574aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 575aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 576aa2bcc31SzhanglyGit }) 5777e471bf8SXuan Hu val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle { 5787e471bf8SXuan Hu val resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 5797e471bf8SXuan Hu }) 580aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 581aa2bcc31SzhanglyGit 58228607074Ssinsanction // trans 58328607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 58428607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 58528607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 58628607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 587aa2bcc31SzhanglyGit 588aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5895db4956bSzhanglyGit} 590