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 21*27811ea4SXuan Hu require(params.numEnq <= 2, "number of enq should be no more than 2") 22*27811ea4SXuan 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())))) 58aa2bcc31SzhanglyGit //deq sel 59aa2bcc31SzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 60aa2bcc31SzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 615db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 625db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 63aa2bcc31SzhanglyGit //trans sel 64aa2bcc31SzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 65aa2bcc31SzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 66aa2bcc31SzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 67aa2bcc31SzhanglyGit //debug 6889740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 69aa2bcc31SzhanglyGit //og0Cancel bypass 70aa2bcc31SzhanglyGit val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 712d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 725db4956bSzhanglyGit 738321ef33Ssinsanction val canTrans = Wire(Bool()) 748321ef33Ssinsanction val enqReadyOthersVec = Wire(Vec(OthersEntryNum, Bool())) 758321ef33Ssinsanction val enqTransSelVec = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))) 768321ef33Ssinsanction 775db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 785db4956bSzhanglyGit 795db4956bSzhanglyGit //enqEntries 805db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 81aa2bcc31SzhanglyGit enqEntry.io.commonIn.enq := io.enq(entryIdx) 82aa2bcc31SzhanglyGit enqEntry.io.commonIn.transSel := canTrans && enqTransSelVec(entryIdx).valid 83aa2bcc31SzhanglyGit EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx) 84aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB) 85aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ) 86aa2bcc31SzhanglyGit enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel.asUInt) 87aa2b5219Ssinsanction enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel) 885db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 89aa2bcc31SzhanglyGit // TODO: move it into EntriesConnect 902d270511Ssinsanction if (params.isVecMemIQ) { 91aa2bcc31SzhanglyGit enqEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 92aa2bcc31SzhanglyGit enqEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 932d270511Ssinsanction } 945db4956bSzhanglyGit } 955db4956bSzhanglyGit //othersEntries 965db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 97aa2bcc31SzhanglyGit othersEntry.io.commonIn.enq := transEntryEnqVec(entryIdx) 98aa2bcc31SzhanglyGit EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum) 99aa2bcc31SzhanglyGit othersEntry.io.commonIn.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 1008321ef33Ssinsanction enqReadyOthersVec(entryIdx) := othersEntry.io.enqReady 1012d270511Ssinsanction if (params.isVecMemIQ) { 102aa2bcc31SzhanglyGit othersEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 103aa2bcc31SzhanglyGit othersEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 1042d270511Ssinsanction } 1055db4956bSzhanglyGit } 1065db4956bSzhanglyGit 1075db4956bSzhanglyGit 1085db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 109aa2bcc31SzhanglyGit val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2) 1105db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 1115db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 1125db4956bSzhanglyGit } 1135db4956bSzhanglyGit 1145db4956bSzhanglyGit 1155db4956bSzhanglyGit //transPolicy 1168321ef33Ssinsanction transPolicy.io.canEnq := enqReadyOthersVec.asUInt 1178321ef33Ssinsanction canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec) 1188321ef33Ssinsanction enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid 1198321ef33Ssinsanction enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits 120*27811ea4SXuan Hu // Todo: comments why enqTransSelVec(1).valid relies on validVec(0) 1218321ef33Ssinsanction if (params.numEnq == 2) { 1228321ef33Ssinsanction enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid) 1238321ef33Ssinsanction enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits) 1248321ef33Ssinsanction } 1258321ef33Ssinsanction 1268321ef33Ssinsanction transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) => 1278321ef33Ssinsanction selBools.zipWithIndex.foreach { case (selBool, othersIdx) => 1288321ef33Ssinsanction selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx) 1295db4956bSzhanglyGit } 1305db4956bSzhanglyGit } 1315db4956bSzhanglyGit 1325db4956bSzhanglyGit //transEntryEnq 1335db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 1345db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 1355db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 1365db4956bSzhanglyGit } 1378d081717Sszw_kaixin if(backendParams.debugEn) { 1385db4956bSzhanglyGit dontTouch(transEntryEnqVec) 1398d081717Sszw_kaixin } 1405db4956bSzhanglyGit 1415db4956bSzhanglyGit //issueRespVec 142887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 143887f9c3dSzhanglinjuan // vector memory IQ 144887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 145887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 146aa2bcc31SzhanglyGit x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx 147887f9c3dSzhanglinjuan )) 148887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 149887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 150887f9c3dSzhanglinjuan } 151887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 152887f9c3dSzhanglinjuan // scalar memory IQ 1535db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 154c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 1555db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 156c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 1575db4956bSzhanglyGit } 1585db4956bSzhanglyGit } 1595db4956bSzhanglyGit else { 1605db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 1615db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 1625db4956bSzhanglyGit issueResp := Resp 1635db4956bSzhanglyGit } 1645db4956bSzhanglyGit } 1655db4956bSzhanglyGit 16640283787Ssinsanction //deq 167aa2bcc31SzhanglyGit val enqEntryOldest = io.enqEntryOldestSel.map { x => 168aa2bcc31SzhanglyGit Mux1H(x.bits, entries.take(EnqEntryNum)) 16940283787Ssinsanction } 170aa2bcc31SzhanglyGit val enqEntryOldestCancel = io.enqEntryOldestSel.map { x => 171aa2bcc31SzhanglyGit Mux1H(x.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum)) 172af4bd265SzhanglyGit } 173aa2bcc31SzhanglyGit val othersEntryOldest = io.othersEntryOldestSel.map { x => 174aa2bcc31SzhanglyGit Mux1H(x.bits, entries.drop(EnqEntryNum)) 17540283787Ssinsanction } 176aa2bcc31SzhanglyGit val othersEntryOldestCancel = io.othersEntryOldestSel.map { x => 177aa2bcc31SzhanglyGit Mux1H(x.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum)) 178af4bd265SzhanglyGit } 179cf4a131aSsinsanction 180cf4a131aSsinsanction if (params.deqFuSame) { 181cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 182cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 183af4bd265SzhanglyGit val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool())) 184cf4a131aSsinsanction 185aa2bcc31SzhanglyGit subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries) 186aa2bcc31SzhanglyGit subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse) 187aa2bcc31SzhanglyGit subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U 188aa2bcc31SzhanglyGit subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U 189aa2bcc31SzhanglyGit subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.subDeqRequest.get(0), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B)))) 190aa2bcc31SzhanglyGit subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse) 191cf4a131aSsinsanction 192aa2bcc31SzhanglyGit io.deqEntry(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldest(0), subDeqPolicyEntryVec(1)) 193aa2bcc31SzhanglyGit io.deqEntry(1) := subDeqPolicyEntryVec(0) 194aa2bcc31SzhanglyGit io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1)) 195af4bd265SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0) 196cf4a131aSsinsanction 197cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 198aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 19940283787Ssinsanction } 200cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 201aa2bcc31SzhanglyGit assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 202f7f73727Ssinsanction } 203f7f73727Ssinsanction } 204f7f73727Ssinsanction else { 205aa2bcc31SzhanglyGit io.othersEntryOldestSel.zipWithIndex.foreach { case (x, i) => 206aa2bcc31SzhanglyGit io.deqEntry(i) := Mux(x.valid, othersEntryOldest(i), enqEntryOldest(i)) 207aa2bcc31SzhanglyGit io.cancelDeqVec(i) := Mux(x.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i)) 208af4bd265SzhanglyGit } 209af4bd265SzhanglyGit } 210af4bd265SzhanglyGit 211af4bd265SzhanglyGit if (params.hasIQWakeUp) { 212aa2bcc31SzhanglyGit cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[Vec[Bool]]), srcTimer: Vec[UInt]) => 213af4bd265SzhanglyGit cancelByOg0 := l1ExuOH.zip(srcTimer).map { 214af4bd265SzhanglyGit case(exuOH, srcTimer) => 215af4bd265SzhanglyGit (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 216af4bd265SzhanglyGit }.reduce(_ | _) 21740283787Ssinsanction } 21840283787Ssinsanction } 21940283787Ssinsanction 2205db4956bSzhanglyGit io.valid := validVec.asUInt 2215db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 2225db4956bSzhanglyGit io.fuType := fuTypeVec 2235db4956bSzhanglyGit io.dataSources := dataSourceVec 224aa2bcc31SzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get.map(x => VecInit(x.map(_.asUInt)))) 2255db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 226aa2bcc31SzhanglyGit io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) => 227aa2bcc31SzhanglyGit isFirstIssue := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec) 2288d081717Sszw_kaixin } 2295db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 2305db4956bSzhanglyGit sink := source.asUInt 2315db4956bSzhanglyGit } 232aa2bcc31SzhanglyGit io.robIdx.foreach(_ := robIdxVec) 233aa2bcc31SzhanglyGit io.uopIdx.foreach(_ := uopIdxVec.get) 234aa2bcc31SzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //should be removed 235aa2bcc31SzhanglyGit io.cancel.foreach(_ := cancelVec.get) //for debug 236aa2bcc31SzhanglyGit 237aa2bcc31SzhanglyGit def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = { 238aa2bcc31SzhanglyGit in.flush := io.flush 239aa2bcc31SzhanglyGit in.wakeUpFromWB := io.wakeUpFromWB 240aa2bcc31SzhanglyGit in.wakeUpFromIQ := io.wakeUpFromIQ 241aa2bcc31SzhanglyGit in.og0Cancel := io.og0Cancel 242aa2bcc31SzhanglyGit in.og1Cancel := io.og1Cancel 243aa2bcc31SzhanglyGit in.ldCancel := io.ldCancel 244aa2bcc31SzhanglyGit in.deqSel := deqSelVec(entryIdx) 245aa2bcc31SzhanglyGit in.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 246aa2bcc31SzhanglyGit in.issueResp := issueRespVec(entryIdx) 247aa2bcc31SzhanglyGit if (params.isMemAddrIQ) { 248aa2bcc31SzhanglyGit in.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 249aa2bcc31SzhanglyGit in.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 250aa2bcc31SzhanglyGit } 251aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 252aa2bcc31SzhanglyGit in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr 253aa2bcc31SzhanglyGit in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr 254aa2bcc31SzhanglyGit } 255aa2bcc31SzhanglyGit validVec(entryIdx) := out.valid 256aa2bcc31SzhanglyGit canIssueVec(entryIdx) := out.canIssue 257aa2bcc31SzhanglyGit fuTypeVec(entryIdx) := out.fuType 258aa2bcc31SzhanglyGit robIdxVec(entryIdx) := out.robIdx 259aa2bcc31SzhanglyGit dataSourceVec(entryIdx) := out.dataSource 260aa2bcc31SzhanglyGit isFirstIssueVec(entryIdx) := out.isFirstIssue 261aa2bcc31SzhanglyGit entries(entryIdx) := out.entry 262aa2bcc31SzhanglyGit deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead 263aa2bcc31SzhanglyGit issueTimerVec(entryIdx) := out.issueTimerRead 264aa2bcc31SzhanglyGit if (params.hasIQWakeUp) { 265aa2bcc31SzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := out.srcWakeUpL1ExuOH.get 266aa2bcc31SzhanglyGit srcTimerVec.get(entryIdx) := out.srcTimer.get 267aa2bcc31SzhanglyGit cancelVec.get(entryIdx) := out.cancel.get 268aa2bcc31SzhanglyGit } 269aa2bcc31SzhanglyGit if (params.isVecMemIQ) { 270aa2bcc31SzhanglyGit uopIdxVec.get(entryIdx) := out.uopIdx.get 271aa2bcc31SzhanglyGit } 272aa2bcc31SzhanglyGit } 273aa2bcc31SzhanglyGit} 274aa2bcc31SzhanglyGit 275aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 276aa2bcc31SzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 277aa2bcc31SzhanglyGit //enq 278aa2bcc31SzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 279aa2bcc31SzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 280aa2bcc31SzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 281aa2bcc31SzhanglyGit val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))) 282aa2bcc31SzhanglyGit //deq sel 283aa2bcc31SzhanglyGit val deqReady = Vec(params.numDeq, Input(Bool())) 284aa2bcc31SzhanglyGit val deqSelOH = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W)))) 285aa2bcc31SzhanglyGit val enqEntryOldestSel = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W)))) 286aa2bcc31SzhanglyGit val othersEntryOldestSel= Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))) 287aa2bcc31SzhanglyGit val subDeqRequest = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 288aa2bcc31SzhanglyGit val subDeqSelOH = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W)))) 289aa2bcc31SzhanglyGit // wakeup 290aa2bcc31SzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 291aa2bcc31SzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 292aa2bcc31SzhanglyGit val og0Cancel = Input(ExuOH(backendParams.numExu)) 293aa2bcc31SzhanglyGit val og1Cancel = Input(ExuOH(backendParams.numExu)) 294aa2bcc31SzhanglyGit val ldCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO)) 295aa2bcc31SzhanglyGit //trans output 296aa2bcc31SzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 297aa2bcc31SzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries - params.numEnq).W))) 298aa2bcc31SzhanglyGit //entries status 299aa2bcc31SzhanglyGit val valid = Output(UInt(params.numEntries.W)) 300aa2bcc31SzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 301aa2bcc31SzhanglyGit val fuType = Vec(params.numEntries, Output(FuType())) 302aa2bcc31SzhanglyGit val dataSources = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource()))) 303aa2bcc31SzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuOH())))) 304aa2bcc31SzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(UInt(3.W))))) 305aa2bcc31SzhanglyGit //deq status 306aa2bcc31SzhanglyGit val isFirstIssue = Vec(params.numDeq, Output(Bool())) 307aa2bcc31SzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 308aa2bcc31SzhanglyGit val cancelDeqVec = Vec(params.numDeq, Output(Bool())) 309aa2bcc31SzhanglyGit // mem only 310aa2bcc31SzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 311aa2bcc31SzhanglyGit val stIssuePtr = Input(new SqPtr) 312aa2bcc31SzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 313aa2bcc31SzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 314aa2bcc31SzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 315aa2bcc31SzhanglyGit }) else None 316aa2bcc31SzhanglyGit val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle { 317aa2bcc31SzhanglyGit val sqDeqPtr = Input(new SqPtr) 318aa2bcc31SzhanglyGit val lqDeqPtr = Input(new LqPtr) 319aa2bcc31SzhanglyGit }) 320aa2bcc31SzhanglyGit 321aa2bcc31SzhanglyGit val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 322aa2bcc31SzhanglyGit val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 323aa2bcc31SzhanglyGit 324aa2bcc31SzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 325aa2bcc31SzhanglyGit 326aa2bcc31SzhanglyGit // debug 327aa2bcc31SzhanglyGit val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 328aa2bcc31SzhanglyGit 329aa2bcc31SzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 3305db4956bSzhanglyGit} 331