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 { 9240283787Ssinsanction //input 9340283787Ssinsanction val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W))) 9440283787Ssinsanction val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))) 95*cf4a131aSsinsanction val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 96*cf4a131aSsinsanction val subDeqSelOH = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 97ea159d42Ssinsanction val deqReady = Input(Bool()) 98f7f73727Ssinsanction val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 9940283787Ssinsanction //output 1005db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 10140283787Ssinsanction val deqEntry = ValidIO(new EntryBundle) 1025db4956bSzhanglyGit} 1035db4956bSzhanglyGit 1045db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 1055db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 1065db4956bSzhanglyGit // status 1075db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 1085db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 1095db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 1105db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 1115db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1127a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1135db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1142d270511Ssinsanction val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 1152d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 1165db4956bSzhanglyGit //enq 1175db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 1185db4956bSzhanglyGit // wakeup 1195db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 1205db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 1217a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 1227a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 1236810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 1245db4956bSzhanglyGit //deq 1255db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 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) 163ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 16456715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 165ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 16656715025SXuan Hu else if (params.isMemAddrIQ) 167ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 168c838dea1SXuan Hu else MixedVecInit(Seq()) 169c838dea1SXuan Hu } 170c838dea1SXuan Hu 171ea159d42Ssinsanction val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 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) => 285ea159d42Ssinsanction val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady) 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 } 3048d081717Sszw_kaixin if(backendParams.debugEn) { 3055db4956bSzhanglyGit dontTouch(transEntryEnqVec) 3068d081717Sszw_kaixin } 3075db4956bSzhanglyGit 3085db4956bSzhanglyGit //issueRespVec 309887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 310887f9c3dSzhanglinjuan // vector memory IQ 311887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 312887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 313887f9c3dSzhanglinjuan x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 314887f9c3dSzhanglinjuan )) 315887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 316887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 317887f9c3dSzhanglinjuan } 318887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 319887f9c3dSzhanglinjuan // scalar memory IQ 3205db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 321c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3225db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 323c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3245db4956bSzhanglyGit } 3255db4956bSzhanglyGit } 3265db4956bSzhanglyGit else { 3275db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3285db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3295db4956bSzhanglyGit issueResp := Resp 3305db4956bSzhanglyGit } 3315db4956bSzhanglyGit } 3325db4956bSzhanglyGit 33340283787Ssinsanction //deq 33440283787Ssinsanction val enqEntryOldest = io.deq.map { deq => 33540283787Ssinsanction Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 33640283787Ssinsanction } 33740283787Ssinsanction val othersEntryOldest = io.deq.map { deq => 33840283787Ssinsanction Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 33940283787Ssinsanction } 340*cf4a131aSsinsanction 341*cf4a131aSsinsanction if (params.deqFuSame) { 342*cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 343*cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 344*cf4a131aSsinsanction 345*cf4a131aSsinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries) 346*cf4a131aSsinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse) 347*cf4a131aSsinsanction subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U 348*cf4a131aSsinsanction subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U 349*cf4a131aSsinsanction 350*cf4a131aSsinsanction io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(0)) 351*cf4a131aSsinsanction io.deq(1).deqEntry := subDeqPolicyEntryVec(1) 352*cf4a131aSsinsanction 353*cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 354*cf4a131aSsinsanction assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 35540283787Ssinsanction } 356*cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 357*cf4a131aSsinsanction assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 358f7f73727Ssinsanction } 359f7f73727Ssinsanction } 360f7f73727Ssinsanction else { 361f7f73727Ssinsanction io.deq.zipWithIndex.foreach { case (x, i) => 362*cf4a131aSsinsanction x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i)) 36340283787Ssinsanction } 36440283787Ssinsanction } 36540283787Ssinsanction 3665db4956bSzhanglyGit io.valid := validVec.asUInt 3675db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3685db4956bSzhanglyGit io.clear := clearVec.asUInt 3695db4956bSzhanglyGit io.fuType := fuTypeVec 3705db4956bSzhanglyGit io.dataSources := dataSourceVec 3715db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 3725db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 37389740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 3742d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 3752d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 3765db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 3775db4956bSzhanglyGit io.deq.foreach{ x => 378*cf4a131aSsinsanction x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec) 3795db4956bSzhanglyGit } 3808d081717Sszw_kaixin if(backendParams.debugEn) { 3815db4956bSzhanglyGit dontTouch(io.deq) 3828d081717Sszw_kaixin } 3835db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 3845db4956bSzhanglyGit sink := source.asUInt 3855db4956bSzhanglyGit } 3865db4956bSzhanglyGit} 387