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 152d270511Ssinsanctionimport xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr} 165db4956bSzhanglyGit 175db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 185db4956bSzhanglyGit val waitForSqIdx = new SqPtr // generated by store data valid check 195db4956bSzhanglyGit val waitForRobIdx = new RobPtr // generated by store set 205db4956bSzhanglyGit val waitForStd = Bool() 215db4956bSzhanglyGit val strictWait = Bool() 225db4956bSzhanglyGit val sqIdx = new SqPtr 235db4956bSzhanglyGit} 245db4956bSzhanglyGit 252d270511Ssinsanctionclass StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 262d270511Ssinsanction val sqIdx = new SqPtr 272d270511Ssinsanction val lqIdx = new LqPtr 282d270511Ssinsanction} 292d270511Ssinsanction 300f55a0d3SHaojin Tangclass Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 315db4956bSzhanglyGit val srcState = Vec(params.numRegSrc, SrcState()) 325db4956bSzhanglyGit 335db4956bSzhanglyGit val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W)) 345db4956bSzhanglyGit val srcType = Vec(params.numRegSrc, SrcType()) 355db4956bSzhanglyGit val fuType = FuType() 365db4956bSzhanglyGit val robIdx = new RobPtr 372d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx()) 385db4956bSzhanglyGit val issued = Bool() // for predict issue 395db4956bSzhanglyGit val firstIssue = Bool() 405db4956bSzhanglyGit val blocked = Bool() // for some block reason 415db4956bSzhanglyGit // read reg or get data from bypass network 425db4956bSzhanglyGit val dataSources = Vec(params.numRegSrc, DataSource()) 435db4956bSzhanglyGit // if waked up by iq, set when waked up by iq 447a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuOH())) 455db4956bSzhanglyGit // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued. 465db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W))) 475db4956bSzhanglyGit val issueTimer = UInt(2.W) 485db4956bSzhanglyGit val deqPortIdx = UInt(1.W) 490f55a0d3SHaojin Tang val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))) 505db4956bSzhanglyGit 515db4956bSzhanglyGit 525db4956bSzhanglyGit // mem only 535db4956bSzhanglyGit val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None 545db4956bSzhanglyGit 552d270511Ssinsanction // vector mem only 562d270511Ssinsanction val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None 572d270511Ssinsanction 585db4956bSzhanglyGit // need pc 595db4956bSzhanglyGit val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None 605db4956bSzhanglyGit 615db4956bSzhanglyGit def srcReady: Bool = { 625db4956bSzhanglyGit VecInit(srcState.map(SrcState.isReady)).asUInt.andR 635db4956bSzhanglyGit } 645db4956bSzhanglyGit 655db4956bSzhanglyGit def canIssue: Bool = { 665db4956bSzhanglyGit srcReady && !issued && !blocked 675db4956bSzhanglyGit } 680f55a0d3SHaojin Tang 6983ba63b3SXuan Hu def mergedLoadDependency = { 7083ba63b3SXuan Hu srcLoadDependency.map(_.map(_.toSeq).reduce({ 7183ba63b3SXuan Hu case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2)) 7283ba63b3SXuan Hu }: (Vec[UInt], Vec[UInt]) => Vec[UInt])) 7383ba63b3SXuan Hu } 745db4956bSzhanglyGit} 755db4956bSzhanglyGit 765db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 775db4956bSzhanglyGit val robIdx = new RobPtr 78*887f9c3dSzhanglinjuan val uopIdx = UopIdx() 795db4956bSzhanglyGit val respType = RSFeedbackType() // update credit if needs replay 805db4956bSzhanglyGit val dataInvalidSqIdx = new SqPtr 815db4956bSzhanglyGit val rfWen = Bool() 825db4956bSzhanglyGit val fuType = FuType() 835db4956bSzhanglyGit} 845db4956bSzhanglyGit 855db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 865db4956bSzhanglyGit val status = new Status() 875db4956bSzhanglyGit val imm = UInt(XLEN.W) 885db4956bSzhanglyGit val payload = new DynInst() 895db4956bSzhanglyGit} 905db4956bSzhanglyGit 915db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 925db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 935db4956bSzhanglyGit val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 945db4956bSzhanglyGit} 955db4956bSzhanglyGit 965db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 975db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 985db4956bSzhanglyGit // status 995db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 1005db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 1015db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 1025db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 1035db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1047a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1055db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1062d270511Ssinsanction val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 1072d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 1085db4956bSzhanglyGit //enq 1095db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 1105db4956bSzhanglyGit // wakeup 1115db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 1125db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 1137a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 1147a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 1156810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 1165db4956bSzhanglyGit //deq 1175db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 1185db4956bSzhanglyGit val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1195db4956bSzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1205db4956bSzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1218a66c02cSXuan Hu val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1228a66c02cSXuan Hu val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1235db4956bSzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 1245db4956bSzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 1255db4956bSzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 1265db4956bSzhanglyGit 1275db4956bSzhanglyGit 1285db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 1295db4956bSzhanglyGit // mem only 1305db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 1315db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 1325db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 1335db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1345db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1355db4956bSzhanglyGit }) else None 1365db4956bSzhanglyGit 1372d270511Ssinsanction // vector mem only 1382d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 1392d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 1402d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1412d270511Ssinsanction }) 1422d270511Ssinsanction 14389740385Ssinsanction // debug 14489740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 14589740385Ssinsanction 1465db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 1475db4956bSzhanglyGit} 1485db4956bSzhanglyGit 1495db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 1505db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 1515db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 1525db4956bSzhanglyGit val io = IO(new EntriesIO) 1535db4956bSzhanglyGit 154c838dea1SXuan Hu // only memAddrIQ use it 155c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 15656715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 15756715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 15856715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 15956715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 16056715025SXuan Hu else if (params.isMemAddrIQ) 16156715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 162c838dea1SXuan Hu else MixedVecInit(Seq()) 163c838dea1SXuan Hu } 164c838dea1SXuan Hu 165c838dea1SXuan Hu val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp)) 1665db4956bSzhanglyGit 1675db4956bSzhanglyGit //Module 1685db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 1695db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 1705db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 1715db4956bSzhanglyGit 1725db4956bSzhanglyGit //Wire 1735db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 1745db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 1755db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 1765db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 1775db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 1785db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 1795db4956bSzhanglyGit 1805db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 1815db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 1825db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 1835db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 1845db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1857a96cc7fSHaojin Tang val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1865db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1875db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 1885db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 1895db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 1905db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 1915db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 19289740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 1932d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 1945db4956bSzhanglyGit 1955db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 1965db4956bSzhanglyGit 1975db4956bSzhanglyGit //enqEntries 1985db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 1995db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 2005db4956bSzhanglyGit enqEntry.io.flush := io.flush 2015db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 2025db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2035db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 2045db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 2050f55a0d3SHaojin Tang enqEntry.io.ldCancel := io.ldCancel 2065db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 2075db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 2085db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 2095db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 2105db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 2115db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 2125db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 2135db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 2145db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 2155db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 2165db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 2175db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 2185db4956bSzhanglyGit if (params.hasIQWakeUp) { 2195db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 2205db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 22189740385Ssinsanction cancelVec.get(entryIdx) := enqEntry.io.cancel.get 2225db4956bSzhanglyGit } 2235db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 2245db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 2255db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 2265db4956bSzhanglyGit //for mem 2275db4956bSzhanglyGit if (params.isMemAddrIQ) { 2285db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2295db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2305db4956bSzhanglyGit } 2312d270511Ssinsanction if (params.isVecMemIQ) { 2322d270511Ssinsanction uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 2332d270511Ssinsanction enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2342d270511Ssinsanction enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2352d270511Ssinsanction } 2365db4956bSzhanglyGit } 2375db4956bSzhanglyGit //othersEntries 2385db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 2395db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 2405db4956bSzhanglyGit othersEntry.io.flush := io.flush 2415db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 2425db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2435db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 2445db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 2450f55a0d3SHaojin Tang othersEntry.io.ldCancel := io.ldCancel 2465db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 2475db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 2485db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 2495db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 2505db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 2515db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 2525db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 2535db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 2545db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 2555db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 2565db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 2575db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 2585db4956bSzhanglyGit if (params.hasIQWakeUp) { 2595db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 2605db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 26189740385Ssinsanction cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 2625db4956bSzhanglyGit } 2635db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 2645db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 2655db4956bSzhanglyGit //for mem 2665db4956bSzhanglyGit if (params.isMemAddrIQ) { 2675db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2685db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2695db4956bSzhanglyGit } 2702d270511Ssinsanction if (params.isVecMemIQ) { 2712d270511Ssinsanction uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 2722d270511Ssinsanction othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2732d270511Ssinsanction othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2742d270511Ssinsanction } 2755db4956bSzhanglyGit } 2765db4956bSzhanglyGit 2775db4956bSzhanglyGit 2785db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 2795db4956bSzhanglyGit val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i)) 2805db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 2815db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 2825db4956bSzhanglyGit } 2835db4956bSzhanglyGit 2845db4956bSzhanglyGit 2855db4956bSzhanglyGit //transPolicy 2865db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 2875db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 2885db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 2895db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 2905db4956bSzhanglyGit } 2915db4956bSzhanglyGit } 2925db4956bSzhanglyGit 2935db4956bSzhanglyGit //transEntryEnq 2945db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 2955db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 2965db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 2975db4956bSzhanglyGit } 2985db4956bSzhanglyGit dontTouch(transEntryEnqVec) 2995db4956bSzhanglyGit 3005db4956bSzhanglyGit //issueRespVec 301*887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 302*887f9c3dSzhanglinjuan // vector memory IQ 303*887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 304*887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 305*887f9c3dSzhanglinjuan x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 306*887f9c3dSzhanglinjuan )) 307*887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 308*887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 309*887f9c3dSzhanglinjuan } 310*887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 311*887f9c3dSzhanglinjuan // scalar memory IQ 3125db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 313c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3145db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 315c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3165db4956bSzhanglyGit } 3175db4956bSzhanglyGit } 3185db4956bSzhanglyGit else { 3195db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3205db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3215db4956bSzhanglyGit issueResp := Resp 3225db4956bSzhanglyGit } 3235db4956bSzhanglyGit } 3245db4956bSzhanglyGit 3255db4956bSzhanglyGit io.valid := validVec.asUInt 3265db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3275db4956bSzhanglyGit io.clear := clearVec.asUInt 3285db4956bSzhanglyGit io.fuType := fuTypeVec 3295db4956bSzhanglyGit io.dataSources := dataSourceVec 3305db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 3315db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 33289740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 3332d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 3342d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 3355db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 3365db4956bSzhanglyGit io.deq.foreach{ x => 3375db4956bSzhanglyGit x.isFirstIssue := Mux(x.deqSelOH.valid, Mux1H(x.deqSelOH.bits, isFirstIssueVec), false.B) 3385db4956bSzhanglyGit } 3395db4956bSzhanglyGit dontTouch(io.deq) 3405db4956bSzhanglyGit io.deqEntry.zip(io.deq.map(_.deqSelOH)).foreach{ case (deqEntry, deqSelOH) => 3415db4956bSzhanglyGit deqEntry.valid := deqSelOH.valid && entries(OHToUInt(deqSelOH.bits)).valid 3425db4956bSzhanglyGit deqEntry.bits := entries(OHToUInt(deqSelOH.bits)).bits 3435db4956bSzhanglyGit } 3445db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 3455db4956bSzhanglyGit sink := source.asUInt 3465db4956bSzhanglyGit } 3475db4956bSzhanglyGit} 348