15db4956bSzhanglyGitpackage xiangshan.backend.issue 25db4956bSzhanglyGit 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 45db4956bSzhanglyGitimport chisel3._ 55db4956bSzhanglyGitimport chisel3.util._ 65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper 75db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper, XSError} 85db4956bSzhanglyGitimport xiangshan._ 95db4956bSzhanglyGitimport xiangshan.backend.Bundles._ 105db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData 115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource 125db4956bSzhanglyGitimport xiangshan.backend.fu.FuType 135db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes 145db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr 15aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr} 16aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._ 175db4956bSzhanglyGit 185db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 190721d1aaSXuan Hu override def desiredName: String = params.getEntryName 200721d1aaSXuan Hu 2127811ea4SXuan Hu require(params.numEnq <= 2, "number of enq should be no more than 2") 2227811ea4SXuan Hu 235db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 245db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 255db4956bSzhanglyGit val io = IO(new EntriesIO) 265db4956bSzhanglyGit 27c838dea1SXuan Hu // only memAddrIQ use it 28c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 2956715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 30aa2bcc31SzhanglyGit MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.finalIssueResp.get) 3156715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 32aa2bcc31SzhanglyGit MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 3356715025SXuan Hu else if (params.isMemAddrIQ) 34ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 35c838dea1SXuan Hu else MixedVecInit(Seq()) 36c838dea1SXuan Hu } 37c838dea1SXuan Hu 38ea159d42Ssinsanction val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 395db4956bSzhanglyGit 405db4956bSzhanglyGit //Module 415db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 425db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 435db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 445db4956bSzhanglyGit 455db4956bSzhanglyGit //Wire 46aa2bcc31SzhanglyGit //entries status 475db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 48aa2bcc31SzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 495db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 505db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 515db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 525db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 535db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 54aa2bcc31SzhanglyGit //src status 55aa2bcc31SzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 56aa2bcc31SzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 57aa2bcc31SzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 58a4d38a63SzhanglyGit val srcLoadDependencyVec= OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))))) 59*3d81019fSzhanglyGit val loadDependencyVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W))))) 60aa2bcc31SzhanglyGit //deq sel 61aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 62aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 635db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 645db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 65aa2bcc31SzhanglyGit //trans sel 66aa2bcc31SzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 67aa2bcc31SzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 68aa2bcc31SzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 69aa2bcc31SzhanglyGit //debug 7089740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 71a4d38a63SzhanglyGit //cancel bypass 72a4d38a63SzhanglyGit val cancelBypassVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 732d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 745db4956bSzhanglyGit 758321ef33Ssinsanction val canTrans = Wire(Bool()) 768321ef33Ssinsanction val enqReadyOthersVec = Wire(Vec(OthersEntryNum, Bool())) 778321ef33Ssinsanction val enqTransSelVec = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))) 788321ef33Ssinsanction 795db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 805db4956bSzhanglyGit 815db4956bSzhanglyGit //enqEntries 825db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 83aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 84aa2bcc31SzhanglyGit enqEntry.io.commonIn.transSel := canTrans && enqTransSelVec(entryIdx).valid 85aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 86aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB) 87aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ) 88aa2bcc31SzhanglyGit enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel.asUInt) 89aa2b5219Ssinsanction enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel) 905db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 91aa2bcc31SzhanglyGit // TODO: move it into EntriesConnect 922d270511Ssinsanction if (params.isVecMemIQ) { 93aa2bcc31SzhanglyGit enqEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 94aa2bcc31SzhanglyGit enqEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 952d270511Ssinsanction } 965db4956bSzhanglyGit } 975db4956bSzhanglyGit //othersEntries 985db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 99aa2bcc31SzhanglyGit othersEntry.io.commonIn.enq := transEntryEnqVec(entryIdx) 100aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 101aa2bcc31SzhanglyGit othersEntry.io.commonIn.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 1028321ef33Ssinsanction enqReadyOthersVec(entryIdx) := othersEntry.io.enqReady 1032d270511Ssinsanction if (params.isVecMemIQ) { 104aa2bcc31SzhanglyGit othersEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 105aa2bcc31SzhanglyGit othersEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 1062d270511Ssinsanction } 1075db4956bSzhanglyGit } 1085db4956bSzhanglyGit 1095db4956bSzhanglyGit 1105db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 111aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1125db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1135db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1145db4956bSzhanglyGit } 1155db4956bSzhanglyGit 1165db4956bSzhanglyGit 1175db4956bSzhanglyGit //transPolicy 1188321ef33Ssinsanction transPolicy.io.canEnq := enqReadyOthersVec.asUInt 1198321ef33Ssinsanction canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec) 1208321ef33Ssinsanction enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid 1218321ef33Ssinsanction enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits 12227811ea4SXuan Hu // Todo: comments why enqTransSelVec(1).valid relies on validVec(0) 1238321ef33Ssinsanction if (params.numEnq == 2) { 1248321ef33Ssinsanction enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid) 1258321ef33Ssinsanction enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits) 1268321ef33Ssinsanction } 1278321ef33Ssinsanction 1288321ef33Ssinsanction transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) => 1298321ef33Ssinsanction selBools.zipWithIndex.foreach { case (selBool, othersIdx) => 1308321ef33Ssinsanction selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx) 1315db4956bSzhanglyGit } 1325db4956bSzhanglyGit } 1335db4956bSzhanglyGit 1345db4956bSzhanglyGit //transEntryEnq 1355db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 1365db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 1375db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 1385db4956bSzhanglyGit } 1398d081717Sszw_kaixin if(backendParams.debugEn) { 1405db4956bSzhanglyGit dontTouch(transEntryEnqVec) 1418d081717Sszw_kaixin } 1425db4956bSzhanglyGit 1435db4956bSzhanglyGit //issueRespVec 144887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 145887f9c3dSzhanglinjuan // vector memory IQ 146887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 147887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 148aa2bcc31SzhanglyGit x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx 149887f9c3dSzhanglinjuan )) 150887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 151887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 152887f9c3dSzhanglinjuan } 153887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 154887f9c3dSzhanglinjuan // scalar memory IQ 1555db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 156c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 1575db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 158c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 1595db4956bSzhanglyGit } 1605db4956bSzhanglyGit } 1615db4956bSzhanglyGit else { 1625db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 1635db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 1645db4956bSzhanglyGit issueResp := Resp 1655db4956bSzhanglyGit } 1665db4956bSzhanglyGit } 1675db4956bSzhanglyGit 16840283787Ssinsanction //deq 169aa2bcc31SzhanglyGit val enqEntryOldest = io.enqEntryOldestSel.map { x => 170aa2bcc31SzhanglyGit Mux1H(x.bits, entries.take(EnqEntryNum)) 17140283787Ssinsanction } 172aa2bcc31SzhanglyGit val enqEntryOldestCancel = io.enqEntryOldestSel.map { x => 173a4d38a63SzhanglyGit Mux1H(x.bits, cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum)) 174af4bd265SzhanglyGit } 175aa2bcc31SzhanglyGit val othersEntryOldest = io.othersEntryOldestSel.map { x => 176aa2bcc31SzhanglyGit Mux1H(x.bits, entries.drop(EnqEntryNum)) 17740283787Ssinsanction } 178aa2bcc31SzhanglyGit val othersEntryOldestCancel = io.othersEntryOldestSel.map { x => 179a4d38a63SzhanglyGit Mux1H(x.bits, cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum)) 180af4bd265SzhanglyGit } 181cf4a131aSsinsanction 182cf4a131aSsinsanction if (params.deqFuSame) { 183cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 184cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 185a4d38a63SzhanglyGit val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool())) 186cf4a131aSsinsanction 187aa2bcc31SzhanglyGit subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 188aa2bcc31SzhanglyGit subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 189aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 190aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 191a4d38a63SzhanglyGit subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B)))) 192a4d38a63SzhanglyGit subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse) 193cf4a131aSsinsanction 194aa2bcc31SzhanglyGit io.deqEntry(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldest(0), subDeqPolicyEntryVec(1)) 195aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 196a4d38a63SzhanglyGit io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldestCancel(0), subDeqPolicyCancelBypassVec(1)) 197a4d38a63SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0) 198cf4a131aSsinsanction 199cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 200aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 20140283787Ssinsanction } 202cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 203aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 204f7f73727Ssinsanction } 205f7f73727Ssinsanction } 206f7f73727Ssinsanction else { 207aa2bcc31SzhanglyGit io.othersEntryOldestSel.zipWithIndex.foreach { case (x, i) => 208aa2bcc31SzhanglyGit io.deqEntry(i) := Mux(x.valid, othersEntryOldest(i), enqEntryOldest(i)) 209aa2bcc31SzhanglyGit io.cancelDeqVec(i) := Mux(x.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i)) 210af4bd265SzhanglyGit } 211af4bd265SzhanglyGit } 212af4bd265SzhanglyGit 213af4bd265SzhanglyGit if (params.hasIQWakeUp) { 214a4d38a63SzhanglyGit cancelBypassVec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).zip(srcLoadDependencyVec.get).foreach{ case (((cancelBypass: Bool, l1ExuOH: Vec[Vec[Bool]]), srcTimer: Vec[UInt]), srcLoadDependency: Vec[Vec[UInt]]) => 215a4d38a63SzhanglyGit val cancelByOg0 = l1ExuOH.zip(srcTimer).map { 216af4bd265SzhanglyGit case(exuOH, srcTimer) => 217af4bd265SzhanglyGit (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 218af4bd265SzhanglyGit }.reduce(_ | _) 219a4d38a63SzhanglyGit val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _) 220a4d38a63SzhanglyGit cancelBypass := cancelByOg0 || cancelByLd 22140283787Ssinsanction } 22240283787Ssinsanction } 22340283787Ssinsanction 2245db4956bSzhanglyGit io.valid := validVec.asUInt 2255db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 2265db4956bSzhanglyGit io.fuType := fuTypeVec 2275db4956bSzhanglyGit io.dataSources := dataSourceVec 228aa2bcc31SzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get.map(x => VecInit(x.map(_.asUInt)))) 2295db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 230*3d81019fSzhanglyGit io.loadDependency.foreach(_ := loadDependencyVec.get) 231aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 232aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 2338d081717Sszw_kaixin } 2345db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 2355db4956bSzhanglyGit sink := source.asUInt 2365db4956bSzhanglyGit } 237aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 238aa2bcc31SzhanglyGit io.uopIdx.foreach(_ := uopIdxVec.get) 239aa2bcc31SzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //should be removed 240aa2bcc31SzhanglyGit io.cancel.foreach(_ := cancelVec.get) //for debug 241aa2bcc31SzhanglyGit 242aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 243aa2bcc31SzhanglyGit in.flush := io.flush 244aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 245aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 246aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 247aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 248aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 249aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 250aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 251aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 252aa2bcc31SzhanglyGit if (params.isMemAddrIQ) { 253aa2bcc31SzhanglyGit in.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 254aa2bcc31SzhanglyGit in.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 255aa2bcc31SzhanglyGit } 256aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 257aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 258aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 259aa2bcc31SzhanglyGit } 260aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 261aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 262aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 263aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 264aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 265aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 266aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 267aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 268aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 269aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 270aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 271aa2bcc31SzhanglyGit srcTimerVec.get(entryIdx) := out.srcTimer.get 272a4d38a63SzhanglyGit srcLoadDependencyVec.get(entryIdx) := out.srcLoadDependency.get 273*3d81019fSzhanglyGit loadDependencyVec.get(entryIdx) := out.entry.bits.status.mergedLoadDependency.get 274aa2bcc31SzhanglyGit cancelVec.get(entryIdx) := out.cancel.get 275aa2bcc31SzhanglyGit } 276aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 277aa2bcc31SzhanglyGit uopIdxVec.get(entryIdx) := out.uopIdx.get 278aa2bcc31SzhanglyGit } 279aa2bcc31SzhanglyGit } 280aa2bcc31SzhanglyGit} 281aa2bcc31SzhanglyGit 282aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 283aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 284aa2bcc31SzhanglyGit //enq 285aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 286aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 287aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 288aa2bcc31SzhanglyGit val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 289aa2bcc31SzhanglyGit //deq sel 290aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 291aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 292aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 293aa2bcc31SzhanglyGit val othersEntryOldestSel= Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))) 294aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 295aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 296aa2bcc31SzhanglyGit // wakeup 297aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 298aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 299aa2bcc31SzhanglyGit val og0Cancel = Input(ExuOH(backendParams.numExu)) 300aa2bcc31SzhanglyGit val og1Cancel = Input(ExuOH(backendParams.numExu)) 301aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 302aa2bcc31SzhanglyGit //trans output 303aa2bcc31SzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 304aa2bcc31SzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries - params.numEnq).W))) 305aa2bcc31SzhanglyGit //entries status 306aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 307aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 308aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 309aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 310aa2bcc31SzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuOH())))) 311aa2bcc31SzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(UInt(3.W))))) 312*3d81019fSzhanglyGit val loadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W)))) 313aa2bcc31SzhanglyGit //deq status 314aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 315aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 316aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 317aa2bcc31SzhanglyGit // mem only 318aa2bcc31SzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 319aa2bcc31SzhanglyGit val stIssuePtr = Input(new SqPtr) 320aa2bcc31SzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 321aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 322aa2bcc31SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 323aa2bcc31SzhanglyGit }) else None 324aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 325aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 326aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 327aa2bcc31SzhanglyGit }) 328aa2bcc31SzhanglyGit 329aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 330aa2bcc31SzhanglyGit val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 331aa2bcc31SzhanglyGit 332aa2bcc31SzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 333aa2bcc31SzhanglyGit 334aa2bcc31SzhanglyGit // debug 335aa2bcc31SzhanglyGit val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 336aa2bcc31SzhanglyGit 337aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 3385db4956bSzhanglyGit} 339