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 61c38df446SzhanglyGit val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = { 62c38df446SzhanglyGit if (params.inVfSchd) 63c38df446SzhanglyGit VecInit(io.og0Resp, io.og1Resp, io.og2Resp.get, 0.U.asTypeOf(io.og0Resp)) 64c38df446SzhanglyGit else 65c38df446SzhanglyGit VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 66c38df446SzhanglyGit } 675db4956bSzhanglyGit 687e471bf8SXuan Hu 697e471bf8SXuan Hu 705db4956bSzhanglyGit //Module 71df26db8aSsinsanction val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(isComp = true)(p, params))) 7228607074Ssinsanction val othersEntriesSimp = Seq.fill(SimpEntryNum)(Module(OthersEntry(isComp = false)(p, params))) 7328607074Ssinsanction val othersEntriesComp = Seq.fill(CompEntryNum)(Module(OthersEntry(isComp = true)(p, params))) 7428607074Ssinsanction val othersEntries = othersEntriesSimp ++ othersEntriesComp 7528607074Ssinsanction val othersTransPolicy = OptionWrapper(params.isAllComp || params.isAllSimp, Module(new EnqPolicy)) 7628607074Ssinsanction val simpTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 7728607074Ssinsanction val compTransPolicy = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy)) 785db4956bSzhanglyGit 795db4956bSzhanglyGit //Wire 80aa2bcc31SzhanglyGit //entries status 815db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 82aa2bcc31SzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 835db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 845db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 855db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 865db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 875db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 8899944b79Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 89aa2bcc31SzhanglyGit //src status 90aa2bcc31SzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 91ec49b127Ssinsanction val loadDependencyVec = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))) 92aa2bcc31SzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 93aa2bcc31SzhanglyGit //deq sel 94aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 95aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 965db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 975db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 98aa2bcc31SzhanglyGit //trans sel 9928607074Ssinsanction val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool())) 10028607074Ssinsanction val othersEntryEnqVec = Wire(Vec(OthersEntryNum, Valid(new EntryBundle))) 10128607074Ssinsanction val enqEntryTransVec = Wire(Vec(EnqEntryNum, Valid(new EntryBundle))) 10228607074Ssinsanction val simpEntryTransVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle)))) 10328607074Ssinsanction val compEnqVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))) 10428607074Ssinsanction 10528607074Ssinsanction val enqCanTrans2Simp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 10628607074Ssinsanction val enqCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Bool())) 10728607074Ssinsanction val simpCanTrans2Comp = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool()))) 10828607074Ssinsanction val simpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W))))) 10928607074Ssinsanction val compTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W))))) 11028607074Ssinsanction val finalSimpTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W)))) 11128607074Ssinsanction val finalCompTransSelVec = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W)))) 11228607074Ssinsanction 11328607074Ssinsanction val enqCanTrans2Others = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool())) 11428607074Ssinsanction val othersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))) 11528607074Ssinsanction val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W)))) 11628607074Ssinsanction 11728607074Ssinsanction val simpEntryEnqReadyVec = othersEntryEnqReadyVec.take(SimpEntryNum) 11828607074Ssinsanction val compEntryEnqReadyVec = othersEntryEnqReadyVec.takeRight(CompEntryNum) 11928607074Ssinsanction val simpEntryEnqVec = othersEntryEnqVec.take(SimpEntryNum) 12028607074Ssinsanction val compEntryEnqVec = othersEntryEnqVec.takeRight(CompEntryNum) 121aa2bcc31SzhanglyGit //debug 122a6938b17Ssinsanction val entryInValidVec = Wire(Vec(params.numEntries, Bool())) 123a6938b17Ssinsanction val entryOutDeqValidVec = Wire(Vec(params.numEntries, Bool())) 124a6938b17Ssinsanction val entryOutTransValidVec = Wire(Vec(params.numEntries, Bool())) 125e3ef3537Ssinsanction val perfLdCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 126e3ef3537Ssinsanction val perfOg0CancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))) 127e3ef3537Ssinsanction val perfWakeupByWBVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))) 128e3ef3537Ssinsanction val perfWakeupByIQVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))))) 129a4d38a63SzhanglyGit //cancel bypass 130eea4a3caSzhanglyGit val cancelBypassVec = Wire(Vec(params.numEntries, Bool())) 1315db4956bSzhanglyGit 1325db4956bSzhanglyGit 1335db4956bSzhanglyGit //enqEntries 1345db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 135aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 13628607074Ssinsanction enqEntry.io.commonIn.transSel := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid 13728607074Ssinsanction else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid) 138aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 1394fa640e4Ssinsanction enqEntry.io.enqDelayIn1.wakeUpFromWB := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid) 1404fa640e4Ssinsanction enqEntry.io.enqDelayIn1.wakeUpFromIQ := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid) 14191f31488Sxiaofeibao-xjtu enqEntry.io.enqDelayIn1.srcLoadDependency := RegEnable(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), io.enq(entryIdx).valid) 1424fa640e4Ssinsanction enqEntry.io.enqDelayIn1.og0Cancel := RegNext(io.og0Cancel.asUInt) 1434fa640e4Ssinsanction enqEntry.io.enqDelayIn1.ldCancel := RegNext(io.ldCancel) 1444fa640e4Ssinsanction // note: these signals with 2 cycle delay should not be enabled by io.enq.valid 1454fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromWB := DelayN(io.wakeUpFromWB, 2) 1464fa640e4Ssinsanction enqEntry.io.enqDelayIn2.wakeUpFromIQ := DelayN(io.wakeUpFromIQ, 2) 14791f31488Sxiaofeibao-xjtu enqEntry.io.enqDelayIn2.srcLoadDependency := DelayN(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), 2) 1484fa640e4Ssinsanction enqEntry.io.enqDelayIn2.og0Cancel := DelayN(io.og0Cancel.asUInt, 2) 1494fa640e4Ssinsanction enqEntry.io.enqDelayIn2.ldCancel := DelayN(io.ldCancel, 2) 15028607074Ssinsanction enqEntryTransVec(entryIdx) := enqEntry.io.commonOut.transEntry 1515db4956bSzhanglyGit } 1525db4956bSzhanglyGit //othersEntries 1535db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 15428607074Ssinsanction othersEntry.io.commonIn.enq := othersEntryEnqVec(entryIdx) 15528607074Ssinsanction othersEntry.io.commonIn.transSel := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) 15628607074Ssinsanction io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _) 15728607074Ssinsanction else false.B) 158aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 15928607074Ssinsanction othersEntryEnqReadyVec(entryIdx) := othersEntry.io.commonOut.enqReady 16028607074Ssinsanction if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) { 16128607074Ssinsanction simpEntryTransVec.get(entryIdx) := othersEntry.io.commonOut.transEntry 16228607074Ssinsanction } 1635db4956bSzhanglyGit } 1645db4956bSzhanglyGit 1655db4956bSzhanglyGit 1665db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 167aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1685db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1695db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1705db4956bSzhanglyGit } 1715db4956bSzhanglyGit 1725db4956bSzhanglyGit 17328607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 1745db4956bSzhanglyGit //transPolicy 175*b9631a81Sxiaofeibao-xjtu othersTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(OthersEntryNum).map(!_)).asUInt 176b43488b9Ssinsanction 177b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to others entries. 178*b9631a81Sxiaofeibao-xjtu enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(OthersEntryNum).map(!_)) 179b43488b9Ssinsanction // othersTransSelVec(i) is the target others entry for enq entry [i]. 180b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 181b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 182b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 18328607074Ssinsanction othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 18428607074Ssinsanction othersTransSelVec.get(0).bits := othersTransPolicy.get.io.enqSelOHVec(0).bits 1858321ef33Ssinsanction if (params.numEnq == 2) { 18628607074Ssinsanction othersTransSelVec.get(1).valid := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) 18728607074Ssinsanction othersTransSelVec.get(1).bits := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).bits, othersTransPolicy.get.io.enqSelOHVec(1).bits) 1888321ef33Ssinsanction } 1898321ef33Ssinsanction 19028607074Ssinsanction finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 19128607074Ssinsanction finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits 1925db4956bSzhanglyGit } 1935db4956bSzhanglyGit 19428607074Ssinsanction //othersEntryEnq 19528607074Ssinsanction othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) => 19628607074Ssinsanction val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx)) 19728607074Ssinsanction if (othersEnqOH.size == 1) 19828607074Ssinsanction othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 19928607074Ssinsanction else 20028607074Ssinsanction othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec) 2015db4956bSzhanglyGit } 20228607074Ssinsanction } 20328607074Ssinsanction else { 20428607074Ssinsanction //transPolicy 20528607074Ssinsanction simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt 20628607074Ssinsanction compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt 20728607074Ssinsanction 208b43488b9Ssinsanction // we only allow all or none of the enq entries transfering to comp/simp entries. 209b43488b9Ssinsanction // when all of simp entries are empty and comp entries are enough, transfer to comp entries. 210b43488b9Ssinsanction // otherwise, transfer to simp entries. 21128607074Ssinsanction enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _) 21228607074Ssinsanction enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec) 21328607074Ssinsanction simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) => 21428607074Ssinsanction canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U 21528607074Ssinsanction } 21628607074Ssinsanction 217b43488b9Ssinsanction // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i]. 218b43488b9Ssinsanction // note that dispatch does not guarantee the validity of enq entries with low index. 219b43488b9Ssinsanction // that means in some cases enq entry [0] is invalid while enq entry [1] is valid. 220b43488b9Ssinsanction // in this case, enq entry [1] should use result [0] of TransPolicy. 22128607074Ssinsanction simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 22228607074Ssinsanction simpTransSelVec.get(0).bits := simpTransPolicy.get.io.enqSelOHVec(0).bits 22328607074Ssinsanction compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0) 22428607074Ssinsanction compTransSelVec.get(0).bits := compTransPolicy.get.io.enqSelOHVec(0).bits 22528607074Ssinsanction if (params.numEnq == 2) { 22628607074Ssinsanction simpTransSelVec.get(1).valid := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) 22728607074Ssinsanction simpTransSelVec.get(1).bits := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).bits, simpTransPolicy.get.io.enqSelOHVec(1).bits) 22828607074Ssinsanction compTransSelVec.get(1).valid := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) 22928607074Ssinsanction compTransSelVec.get(1).bits := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).bits, compTransPolicy.get.io.enqSelOHVec(1).bits) 23028607074Ssinsanction } 23128607074Ssinsanction 23228607074Ssinsanction finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) => 23328607074Ssinsanction finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits 23428607074Ssinsanction } 23528607074Ssinsanction finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach { 23628607074Ssinsanction case (((finalOH, selOH), origSelOH), enqIdx) => 23728607074Ssinsanction finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits) 23828607074Ssinsanction } 23928607074Ssinsanction 24028607074Ssinsanction //othersEntryEnq 24128607074Ssinsanction simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) => 24228607074Ssinsanction val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx)) 24328607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 24428607074Ssinsanction if (simpEnqOH.size == 1) 24528607074Ssinsanction simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head)) 24628607074Ssinsanction else 24728607074Ssinsanction simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec) 24828607074Ssinsanction } 24928607074Ssinsanction 25028607074Ssinsanction compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) => 25128607074Ssinsanction compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get)) 25228607074Ssinsanction } 25328607074Ssinsanction compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) => 25428607074Ssinsanction val compEnqOH = finalCompTransSelVec.get.map(_(compIdx)) 25528607074Ssinsanction // shit Mux1H directly returns in(0) if the seq has only 1 elements 25628607074Ssinsanction if (compEnqOH.size == 1) 25728607074Ssinsanction compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head)) 25828607074Ssinsanction else 25928607074Ssinsanction compEntryEnq := Mux1H(compEnqOH, compEnqVec.get) 26028607074Ssinsanction } 26128607074Ssinsanction 26228607074Ssinsanction assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n") 26328607074Ssinsanction assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n") 26428607074Ssinsanction } 26528607074Ssinsanction 2668d081717Sszw_kaixin if(backendParams.debugEn) { 26728607074Ssinsanction dontTouch(othersEntryEnqVec) 2688d081717Sszw_kaixin } 2695db4956bSzhanglyGit 2705db4956bSzhanglyGit //issueRespVec 271887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 272887f9c3dSzhanglinjuan // vector memory IQ 273dd40a82bSsinsanction issueRespVec.lazyZip(robIdxVec.lazyZip(uopIdxVec.get)).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (robIdx, uopIdx), (issueTimer, deqPortIdx)) => 274dd40a82bSsinsanction val respInDatapath = resps(issueTimer(0))(deqPortIdx) 275dd40a82bSsinsanction val respAfterDatapath = Wire(chiselTypeOf(respInDatapath)) 276f7890d3cSXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => 277aa2bcc31SzhanglyGit x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx 278f7890d3cSXuan Hu ).toSeq) 279dd40a82bSsinsanction respAfterDatapath.valid := hitRespsVec.reduce(_ | _) 280dd40a82bSsinsanction respAfterDatapath.bits := (if (memEtyResps.size == 1) memEtyResps.head.bits 281dd40a82bSsinsanction else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)) 282dd40a82bSsinsanction issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath) 283887f9c3dSzhanglinjuan } 284887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 285887f9c3dSzhanglinjuan // scalar memory IQ 286dd40a82bSsinsanction issueRespVec.lazyZip(robIdxVec).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, robIdx, (issueTimer, deqPortIdx)) => 287dd40a82bSsinsanction val respInDatapath = resps(issueTimer(0))(deqPortIdx) 288dd40a82bSsinsanction val respAfterDatapath = Wire(chiselTypeOf(respInDatapath)) 289c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 290dd40a82bSsinsanction respAfterDatapath.valid := hitRespsVec.reduce(_ | _) 291dd40a82bSsinsanction respAfterDatapath.bits := (if (memEtyResps.size == 1) memEtyResps.head.bits 292dd40a82bSsinsanction else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)) 293dd40a82bSsinsanction issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath) 2945db4956bSzhanglyGit } 2955db4956bSzhanglyGit } 2965db4956bSzhanglyGit else { 297dd40a82bSsinsanction issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) => 2985db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 2995db4956bSzhanglyGit issueResp := Resp 3005db4956bSzhanglyGit } 3015db4956bSzhanglyGit } 3025db4956bSzhanglyGit 30340283787Ssinsanction //deq 30428607074Ssinsanction val enqEntryOldest = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 30528607074Ssinsanction val simpEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30628607074Ssinsanction val compEntryOldest = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30728607074Ssinsanction val othersEntryOldest = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))) 30828607074Ssinsanction val enqEntryOldestCancel = Wire(Vec(params.numDeq, Bool())) 30928607074Ssinsanction val simpEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 31028607074Ssinsanction val compEntryOldestCancel = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool()))) 31128607074Ssinsanction val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool()))) 31228607074Ssinsanction 31328607074Ssinsanction io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) => 31428607074Ssinsanction enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum)) 315eea4a3caSzhanglyGit enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum)) 31640283787Ssinsanction } 31728607074Ssinsanction 31828607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 31928607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32028607074Ssinsanction othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum)) 321eea4a3caSzhanglyGit othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum)) 322af4bd265SzhanglyGit } 32340283787Ssinsanction } 32428607074Ssinsanction else { 32528607074Ssinsanction io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 32628607074Ssinsanction simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum)) 327eea4a3caSzhanglyGit simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum)) 32828607074Ssinsanction } 32928607074Ssinsanction io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) => 33028607074Ssinsanction compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum)) 331eea4a3caSzhanglyGit compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum)) 33228607074Ssinsanction } 333af4bd265SzhanglyGit } 334cf4a131aSsinsanction 335cf4a131aSsinsanction if (params.deqFuSame) { 336cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 337cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 338a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 339cf4a131aSsinsanction 340aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 341aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 34228607074Ssinsanction 34328607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 34428607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 34528607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 346eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 347eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 348cf4a131aSsinsanction 34928607074Ssinsanction io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1)) 350aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 35128607074Ssinsanction io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)) 352a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 35328607074Ssinsanction } 35428607074Ssinsanction else { 35528607074Ssinsanction subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 35628607074Ssinsanction subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries) 357eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse) 358eea4a3caSzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec) 35928607074Ssinsanction 36028607074Ssinsanction io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid, 36128607074Ssinsanction compEntryOldest.get(0), 36228607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1))) 36328607074Ssinsanction io.deqEntry(1) := subDeqPolicyEntryVec(0) 36428607074Ssinsanction io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid, 36528607074Ssinsanction compEntryOldestCancel.get(0), 36628607074Ssinsanction Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))) 36728607074Ssinsanction io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 36828607074Ssinsanction } 369cf4a131aSsinsanction 370cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 371aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 37240283787Ssinsanction } 373cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 374aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 375f7f73727Ssinsanction } 376f7f73727Ssinsanction } 377f7f73727Ssinsanction else { 37828607074Ssinsanction if (params.isAllComp || params.isAllSimp) { 37928607074Ssinsanction io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) => 38028607074Ssinsanction io.deqEntry(i) := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i)) 38128607074Ssinsanction io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i)) 38228607074Ssinsanction } 38328607074Ssinsanction } 38428607074Ssinsanction else { 38528607074Ssinsanction io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) => 38628607074Ssinsanction io.deqEntry(i) := Mux(compSel.valid, 38728607074Ssinsanction compEntryOldest.get(i), 38828607074Ssinsanction Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i))) 38928607074Ssinsanction io.cancelDeqVec(i) := Mux(compSel.valid, 39028607074Ssinsanction compEntryOldestCancel.get(i), 39128607074Ssinsanction Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i))) 39228607074Ssinsanction } 393af4bd265SzhanglyGit } 394af4bd265SzhanglyGit } 395af4bd265SzhanglyGit 3965db4956bSzhanglyGit io.valid := validVec.asUInt 3975db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3985db4956bSzhanglyGit io.fuType := fuTypeVec 3995db4956bSzhanglyGit io.dataSources := dataSourceVec 400864480f4Sxiaofeibao-xjtu io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 401eea4a3caSzhanglyGit io.loadDependency := loadDependencyVec 402aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 403aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 4048d081717Sszw_kaixin } 40528607074Ssinsanction io.simpEntryEnqSelVec.foreach(_ := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid))) 40628607074Ssinsanction io.compEntryEnqSelVec.foreach(_ := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid))) 40728607074Ssinsanction io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid))) 408aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 409aa2bcc31SzhanglyGit io.uopIdx.foreach(_ := uopIdxVec.get) 410aa2bcc31SzhanglyGit 4117e471bf8SXuan Hu 412aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 413aa2bcc31SzhanglyGit in.flush := io.flush 414aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 415aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 416b6279fc6SZiyue Zhang in.vlIsZero := io.vlIsZero 417b6279fc6SZiyue Zhang in.vlIsVlmax := io.vlIsVlmax 418aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 419aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 420aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 421aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 422aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 423aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 424aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 425aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 426aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 427aa2bcc31SzhanglyGit } 428aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 429aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 430aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 431aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 432aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 433aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 434aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 435aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 436aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 437eea4a3caSzhanglyGit loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency 438ec49b127Ssinsanction cancelBypassVec(entryIdx) := out.cancelBypass 439aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 440aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 441aa2bcc31SzhanglyGit } 442aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 443aa2bcc31SzhanglyGit uopIdxVec.get(entryIdx) := out.uopIdx.get 444aa2bcc31SzhanglyGit } 445a6938b17Ssinsanction entryInValidVec(entryIdx) := out.entryInValid 446a6938b17Ssinsanction entryOutDeqValidVec(entryIdx) := out.entryOutDeqValid 447a6938b17Ssinsanction entryOutTransValidVec(entryIdx) := out.entryOutTransValid 448e3ef3537Ssinsanction perfWakeupByWBVec(entryIdx) := out.perfWakeupByWB 449e3ef3537Ssinsanction if (params.hasIQWakeUp) { 450e3ef3537Ssinsanction perfLdCancelVec.get(entryIdx) := out.perfLdCancel.get 451e3ef3537Ssinsanction perfOg0CancelVec.get(entryIdx) := out.perfOg0Cancel.get 452e3ef3537Ssinsanction perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get 453aa2bcc31SzhanglyGit } 454aa2bcc31SzhanglyGit } 455a6938b17Ssinsanction 45625df626eSgood-circle io.vecLdIn.foreach(dontTouch(_)) 457a6938b17Ssinsanction 458a6938b17Ssinsanction // entries perf counter 459a6938b17Ssinsanction // enq 460a6938b17Ssinsanction for (i <- 0 until params.numEnq) { 461a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i)) 462a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i)) 463a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i)) 464a6938b17Ssinsanction } 465a6938b17Ssinsanction // simple 466a6938b17Ssinsanction for (i <- 0 until params.numSimp) { 467a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq)) 468a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq)) 469a6938b17Ssinsanction XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq)) 470a6938b17Ssinsanction } 471a6938b17Ssinsanction // complex 472a6938b17Ssinsanction for (i <- 0 until params.numComp) { 473a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp)) 474a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp)) 475a6938b17Ssinsanction XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp)) 476a6938b17Ssinsanction } 477a6938b17Ssinsanction // total 478a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq))) 479a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq))) 480a6938b17Ssinsanction XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq))) 481e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 482e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx)))) 483d280e426Slewislzh if (params.hasIQWakeUp) { 484e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx)))) 485e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx)))) 486e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 487e3ef3537Ssinsanction XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx)))) 488e3ef3537Ssinsanction } 489e3ef3537Ssinsanction } 490d280e426Slewislzh } 491a6938b17Ssinsanction 492a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq))) 493a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq))) 494a6938b17Ssinsanction XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq))) 4957e471bf8SXuan Hu 496e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 497e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx)))) 498d280e426Slewislzh if (params.hasIQWakeUp) { 499e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 500e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx)))) 501e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 502e3ef3537Ssinsanction XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx)))) 503e3ef3537Ssinsanction } 504e3ef3537Ssinsanction } 505e3ef3537Ssinsanction } 506e3ef3537Ssinsanction 507e3ef3537Ssinsanction for (t <- FuType.functionNameMap.keys) { 508e3ef3537Ssinsanction val fuName = FuType.functionNameMap(t) 509e3ef3537Ssinsanction if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) { 510e3ef3537Ssinsanction for (srcIdx <- 0 until params.numRegSrc) { 511e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 512e3ef3537Ssinsanction if (params.hasIQWakeUp) { 513e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 514e3ef3537Ssinsanction XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) })) 515e3ef3537Ssinsanction for (iqIdx <- 0 until params.numWakeupFromIQ) { 516e3ef3537Ssinsanction 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) })) 517e3ef3537Ssinsanction } 518e3ef3537Ssinsanction } 519e3ef3537Ssinsanction } 520e3ef3537Ssinsanction } 521d280e426Slewislzh } 522aa2bcc31SzhanglyGit} 523aa2bcc31SzhanglyGit 524aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 525aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 526aa2bcc31SzhanglyGit //enq 527aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 528aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 529aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 530c38df446SzhanglyGit val og2Resp = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 531aa2bcc31SzhanglyGit //deq sel 532aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 533aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 534aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 53528607074Ssinsanction val simpEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W))))) 53628607074Ssinsanction val compEntryOldestSel = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W))))) 53728607074Ssinsanction val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))) 538aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 539aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 540aa2bcc31SzhanglyGit // wakeup 541aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 542aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 543b6279fc6SZiyue Zhang val vlIsZero = Input(Bool()) 544b6279fc6SZiyue Zhang val vlIsVlmax = Input(Bool()) 545aa2bcc31SzhanglyGit val og0Cancel = Input(ExuOH(backendParams.numExu)) 546aa2bcc31SzhanglyGit val og1Cancel = Input(ExuOH(backendParams.numExu)) 547aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 548aa2bcc31SzhanglyGit //entries status 549aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 550aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 551aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 552aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 553ec49b127Ssinsanction val loadDependency = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))) 554864480f4Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec())))) 555aa2bcc31SzhanglyGit //deq status 556aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 557aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 558aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 559e07131b2Ssinsanction 560e07131b2Ssinsanction // load/hybird only 561e07131b2Ssinsanction val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle { 562e07131b2Ssinsanction val finalIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 563e07131b2Ssinsanction val memAddrIssueResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 564e07131b2Ssinsanction }) 565aa2bcc31SzhanglyGit // mem only 566e07131b2Ssinsanction val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle { 567aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 568d3372210SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 569e07131b2Ssinsanction }) 57099944b79Ssinsanction // vec mem only 571aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 572aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 573aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 574aa2bcc31SzhanglyGit }) 5757e471bf8SXuan Hu val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle { 5767e471bf8SXuan Hu val resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 5777e471bf8SXuan Hu }) 578aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 579aa2bcc31SzhanglyGit val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 580aa2bcc31SzhanglyGit 58128607074Ssinsanction // trans 58228607074Ssinsanction val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W)))) 58328607074Ssinsanction val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W)))) 58428607074Ssinsanction val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W)))) 58528607074Ssinsanction val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W)))) 586aa2bcc31SzhanglyGit 587aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 5885db4956bSzhanglyGit} 589