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 78887f9c3dSzhanglinjuan 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 { 92*40283787Ssinsanction //input 93*40283787Ssinsanction val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W))) 94*40283787Ssinsanction val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))) 95*40283787Ssinsanction val subDeqPolicyRequest = Input(UInt(params.numEntries.W)) 96*40283787Ssinsanction val subDeqSelOH = Vec(params.numDeq, Input(UInt(params.numEntries.W))) 97*40283787Ssinsanction val finalDeqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 98*40283787Ssinsanction //output 995db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 100*40283787Ssinsanction val deqEntry = ValidIO(new EntryBundle) 1015db4956bSzhanglyGit} 1025db4956bSzhanglyGit 1035db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 1045db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 1055db4956bSzhanglyGit // status 1065db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 1075db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 1085db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 1095db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 1105db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1117a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1125db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1132d270511Ssinsanction val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 1142d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 1155db4956bSzhanglyGit //enq 1165db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 1175db4956bSzhanglyGit // wakeup 1185db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 1195db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 1207a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 1217a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 1226810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 1235db4956bSzhanglyGit //deq 1245db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 1255db4956bSzhanglyGit val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1265db4956bSzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1275db4956bSzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1288a66c02cSXuan Hu val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1298a66c02cSXuan Hu val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1305db4956bSzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 1315db4956bSzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 1325db4956bSzhanglyGit 1335db4956bSzhanglyGit 1345db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 1355db4956bSzhanglyGit // mem only 1365db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 1375db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 1385db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 1395db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1405db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1415db4956bSzhanglyGit }) else None 1425db4956bSzhanglyGit 1432d270511Ssinsanction // vector mem only 1442d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 1452d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 1462d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1472d270511Ssinsanction }) 1482d270511Ssinsanction 14989740385Ssinsanction // debug 15089740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 15189740385Ssinsanction 1525db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 1535db4956bSzhanglyGit} 1545db4956bSzhanglyGit 1555db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 1565db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 1575db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 1585db4956bSzhanglyGit val io = IO(new EntriesIO) 1595db4956bSzhanglyGit 160c838dea1SXuan Hu // only memAddrIQ use it 161c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 16256715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 16356715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 16456715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 16556715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 16656715025SXuan Hu else if (params.isMemAddrIQ) 16756715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 168c838dea1SXuan Hu else MixedVecInit(Seq()) 169c838dea1SXuan Hu } 170c838dea1SXuan Hu 171c838dea1SXuan Hu val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp)) 1725db4956bSzhanglyGit 1735db4956bSzhanglyGit //Module 1745db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 1755db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 1765db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 1775db4956bSzhanglyGit 1785db4956bSzhanglyGit //Wire 1795db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 1805db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 1815db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 1825db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 1835db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 1845db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 1855db4956bSzhanglyGit 1865db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 1875db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 1885db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 1895db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 1905db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1917a96cc7fSHaojin Tang val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1925db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1935db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 1945db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 1955db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 1965db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 1975db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 19889740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 1992d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 2005db4956bSzhanglyGit 2015db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 2025db4956bSzhanglyGit 2035db4956bSzhanglyGit //enqEntries 2045db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 2055db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 2065db4956bSzhanglyGit enqEntry.io.flush := io.flush 2075db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 2085db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2095db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 2105db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 2110f55a0d3SHaojin Tang enqEntry.io.ldCancel := io.ldCancel 2125db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 2135db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 2145db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 2155db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 2165db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 2175db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 2185db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 2195db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 2205db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 2215db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 2225db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 2235db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 2245db4956bSzhanglyGit if (params.hasIQWakeUp) { 2255db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 2265db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 22789740385Ssinsanction cancelVec.get(entryIdx) := enqEntry.io.cancel.get 2285db4956bSzhanglyGit } 2295db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 2305db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 2315db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 2325db4956bSzhanglyGit //for mem 2335db4956bSzhanglyGit if (params.isMemAddrIQ) { 2345db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2355db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2365db4956bSzhanglyGit } 2372d270511Ssinsanction if (params.isVecMemIQ) { 2382d270511Ssinsanction uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 2392d270511Ssinsanction enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2402d270511Ssinsanction enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2412d270511Ssinsanction } 2425db4956bSzhanglyGit } 2435db4956bSzhanglyGit //othersEntries 2445db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 2455db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 2465db4956bSzhanglyGit othersEntry.io.flush := io.flush 2475db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 2485db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2495db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 2505db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 2510f55a0d3SHaojin Tang othersEntry.io.ldCancel := io.ldCancel 2525db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 2535db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 2545db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 2555db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 2565db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 2575db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 2585db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 2595db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 2605db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 2615db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 2625db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 2635db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 2645db4956bSzhanglyGit if (params.hasIQWakeUp) { 2655db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 2665db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 26789740385Ssinsanction cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 2685db4956bSzhanglyGit } 2695db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 2705db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 2715db4956bSzhanglyGit //for mem 2725db4956bSzhanglyGit if (params.isMemAddrIQ) { 2735db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2745db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2755db4956bSzhanglyGit } 2762d270511Ssinsanction if (params.isVecMemIQ) { 2772d270511Ssinsanction uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 2782d270511Ssinsanction othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2792d270511Ssinsanction othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2802d270511Ssinsanction } 2815db4956bSzhanglyGit } 2825db4956bSzhanglyGit 2835db4956bSzhanglyGit 2845db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 285*40283787Ssinsanction val deqVec = io.deq.map(x => x.finalDeqSelOH.valid && x.finalDeqSelOH.bits(i)) 2865db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 2875db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 2885db4956bSzhanglyGit } 2895db4956bSzhanglyGit 2905db4956bSzhanglyGit 2915db4956bSzhanglyGit //transPolicy 2925db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 2935db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 2945db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 2955db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 2965db4956bSzhanglyGit } 2975db4956bSzhanglyGit } 2985db4956bSzhanglyGit 2995db4956bSzhanglyGit //transEntryEnq 3005db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 3015db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 3025db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 3035db4956bSzhanglyGit } 3045db4956bSzhanglyGit dontTouch(transEntryEnqVec) 3055db4956bSzhanglyGit 3065db4956bSzhanglyGit //issueRespVec 307887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 308887f9c3dSzhanglinjuan // vector memory IQ 309887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 310887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 311887f9c3dSzhanglinjuan x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 312887f9c3dSzhanglinjuan )) 313887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 314887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 315887f9c3dSzhanglinjuan } 316887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 317887f9c3dSzhanglinjuan // scalar memory IQ 3185db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 319c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3205db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 321c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3225db4956bSzhanglyGit } 3235db4956bSzhanglyGit } 3245db4956bSzhanglyGit else { 3255db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3265db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3275db4956bSzhanglyGit issueResp := Resp 3285db4956bSzhanglyGit } 3295db4956bSzhanglyGit } 3305db4956bSzhanglyGit 331*40283787Ssinsanction //deq 332*40283787Ssinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, Vec(params.numDeq, ValidIO(new EntryBundle)))) 333*40283787Ssinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Vec(params.numDeq, Bool()))) 334*40283787Ssinsanction val deqSelEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 335*40283787Ssinsanction 336*40283787Ssinsanction val enqEntryOldest = io.deq.map { deq => 337*40283787Ssinsanction Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 338*40283787Ssinsanction } 339*40283787Ssinsanction val othersEntryOldest = io.deq.map { deq => 340*40283787Ssinsanction Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 341*40283787Ssinsanction } 342*40283787Ssinsanction subDeqPolicyEntryVec.zip(subDeqPolicyValidVec).zipWithIndex.foreach { case ((entry, valid), i) => 343*40283787Ssinsanction entry(0) := PriorityMux(io.deq(i).subDeqPolicyRequest, entries) 344*40283787Ssinsanction valid(0) := PopCount(io.deq(i).subDeqPolicyRequest) >= 1.U 345*40283787Ssinsanction if (params.numDeq == 2) { 346*40283787Ssinsanction entry(1) := PriorityMux(Reverse(io.deq(i).subDeqPolicyRequest), entries.reverse) 347*40283787Ssinsanction valid(1) := PopCount(io.deq(i).subDeqPolicyRequest) >= 2.U 348*40283787Ssinsanction } 349*40283787Ssinsanction } 350*40283787Ssinsanction 351*40283787Ssinsanction deqSelEntryVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), 352*40283787Ssinsanction Mux(io.deq(0).enqEntryOldestSel.valid, enqEntryOldest(0), subDeqPolicyEntryVec(0)(0))) 353*40283787Ssinsanction io.deq(0).deqEntry.valid := (io.deq(0).othersEntryOldestSel.valid || io.deq(0).enqEntryOldestSel.valid || subDeqPolicyValidVec(0)(0)) && deqSelEntryVec(0).valid 354*40283787Ssinsanction io.deq(0).deqEntry.bits := deqSelEntryVec(0).bits 355*40283787Ssinsanction 356*40283787Ssinsanction if (params.numDeq == 2) { 357*40283787Ssinsanction val chooseOthersOldest = io.deq(1).othersEntryOldestSel.valid && Cat(io.deq(1).othersEntryOldestSel.bits, 0.U((params.numEnq).W)) =/= io.deq(0).finalDeqSelOH.bits 358*40283787Ssinsanction val chooseEnqOldest = io.deq(1).enqEntryOldestSel.valid && Cat(0.U((params.numEntries-params.numEnq).W), io.deq(1).enqEntryOldestSel.bits) =/= io.deq(0).finalDeqSelOH.bits 359*40283787Ssinsanction val choose1stSub = io.deq(1).subDeqSelOH(0) =/= io.deq(0).finalDeqSelOH.bits 360*40283787Ssinsanction 361*40283787Ssinsanction when (subDeqPolicyValidVec(0)(0)) { 362*40283787Ssinsanction assert(Mux1H(io.deq(0).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0)(0).bits.status.robIdx, "subDeqSelOH isnot the same 0 0\n") 363*40283787Ssinsanction } 364*40283787Ssinsanction when (subDeqPolicyValidVec(1)(0)) { 365*40283787Ssinsanction assert(Mux1H(io.deq(1).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(0).bits.status.robIdx, "subDeqSelOH isnot the same 1 0\n") 366*40283787Ssinsanction } 367*40283787Ssinsanction when (subDeqPolicyValidVec(1)(1)) { 368*40283787Ssinsanction assert(Mux1H(io.deq(1).subDeqSelOH(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(1).bits.status.robIdx, "subDeqSelOH isnot the same 1 1\n") 369*40283787Ssinsanction } 370*40283787Ssinsanction 371*40283787Ssinsanction deqSelEntryVec(1) := Mux(chooseOthersOldest, othersEntryOldest(1), 372*40283787Ssinsanction Mux(chooseEnqOldest, enqEntryOldest(1), 373*40283787Ssinsanction Mux(choose1stSub, subDeqPolicyEntryVec(1)(0), subDeqPolicyEntryVec(1)(1)))) 374*40283787Ssinsanction io.deq(1).deqEntry.valid := io.deq(1).finalDeqSelOH.valid && deqSelEntryVec(1).valid 375*40283787Ssinsanction io.deq(1).deqEntry.bits := deqSelEntryVec(1).bits 376*40283787Ssinsanction } 377*40283787Ssinsanction 3785db4956bSzhanglyGit io.valid := validVec.asUInt 3795db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3805db4956bSzhanglyGit io.clear := clearVec.asUInt 3815db4956bSzhanglyGit io.fuType := fuTypeVec 3825db4956bSzhanglyGit io.dataSources := dataSourceVec 3835db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 3845db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 38589740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 3862d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 3872d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 3885db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 3895db4956bSzhanglyGit io.deq.foreach{ x => 390*40283787Ssinsanction x.isFirstIssue := x.finalDeqSelOH.valid && Mux1H(x.finalDeqSelOH.bits, isFirstIssueVec) 3915db4956bSzhanglyGit } 3925db4956bSzhanglyGit dontTouch(io.deq) 3935db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 3945db4956bSzhanglyGit sink := source.asUInt 3955db4956bSzhanglyGit } 3965db4956bSzhanglyGit} 397