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))) 95cf4a131aSsinsanction val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 96cf4a131aSsinsanction 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))) 132*af4bd265SzhanglyGit val cancelDeqVec = Output(Vec(params.numDeq, Bool())) 1335db4956bSzhanglyGit 1345db4956bSzhanglyGit 1355db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 1365db4956bSzhanglyGit // mem only 1375db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 1385db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 1395db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 1405db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1415db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1425db4956bSzhanglyGit }) else None 1435db4956bSzhanglyGit 1442d270511Ssinsanction // vector mem only 1452d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 1462d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 1472d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1482d270511Ssinsanction }) 1492d270511Ssinsanction 15089740385Ssinsanction // debug 15189740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 15289740385Ssinsanction 1535db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 1545db4956bSzhanglyGit} 1555db4956bSzhanglyGit 1565db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 1575db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 1585db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 1595db4956bSzhanglyGit val io = IO(new EntriesIO) 1605db4956bSzhanglyGit 161c838dea1SXuan Hu // only memAddrIQ use it 162c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 16356715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 164ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 16556715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 166ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 16756715025SXuan Hu else if (params.isMemAddrIQ) 168ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 169c838dea1SXuan Hu else MixedVecInit(Seq()) 170c838dea1SXuan Hu } 171c838dea1SXuan Hu 172ea159d42Ssinsanction val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 1735db4956bSzhanglyGit 1745db4956bSzhanglyGit //Module 1755db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 1765db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 1775db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 1785db4956bSzhanglyGit 1795db4956bSzhanglyGit //Wire 1805db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 1815db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 1825db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 1835db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 1845db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 1855db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 1865db4956bSzhanglyGit 1875db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 1885db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 1895db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 1905db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 1915db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1927a96cc7fSHaojin Tang val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1935db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 194*af4bd265SzhanglyGit val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 1955db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 1965db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 1975db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 1985db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 1995db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 20089740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 2012d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 2025db4956bSzhanglyGit 2035db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 2045db4956bSzhanglyGit 2055db4956bSzhanglyGit //enqEntries 2065db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 2075db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 2085db4956bSzhanglyGit enqEntry.io.flush := io.flush 2095db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 2105db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2115db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 2125db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 2130f55a0d3SHaojin Tang enqEntry.io.ldCancel := io.ldCancel 2145db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 2155db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 2165db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 2175db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 2185db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 2195db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 2205db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 2215db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 2225db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 2235db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 2245db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 2255db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 2265db4956bSzhanglyGit if (params.hasIQWakeUp) { 2275db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 2285db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 22989740385Ssinsanction cancelVec.get(entryIdx) := enqEntry.io.cancel.get 2305db4956bSzhanglyGit } 2315db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 2325db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 2335db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 2345db4956bSzhanglyGit //for mem 2355db4956bSzhanglyGit if (params.isMemAddrIQ) { 2365db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2375db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2385db4956bSzhanglyGit } 2392d270511Ssinsanction if (params.isVecMemIQ) { 2402d270511Ssinsanction uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 2412d270511Ssinsanction enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2422d270511Ssinsanction enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2432d270511Ssinsanction } 2445db4956bSzhanglyGit } 2455db4956bSzhanglyGit //othersEntries 2465db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 2475db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 2485db4956bSzhanglyGit othersEntry.io.flush := io.flush 2495db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 2505db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2515db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 2525db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 2530f55a0d3SHaojin Tang othersEntry.io.ldCancel := io.ldCancel 2545db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 2555db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 2565db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 2575db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 2585db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 2595db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 2605db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 2615db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 2625db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 2635db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 2645db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 2655db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 2665db4956bSzhanglyGit if (params.hasIQWakeUp) { 2675db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 2685db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 26989740385Ssinsanction cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 2705db4956bSzhanglyGit } 2715db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 2725db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 2735db4956bSzhanglyGit //for mem 2745db4956bSzhanglyGit if (params.isMemAddrIQ) { 2755db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2765db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2775db4956bSzhanglyGit } 2782d270511Ssinsanction if (params.isVecMemIQ) { 2792d270511Ssinsanction uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 2802d270511Ssinsanction othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2812d270511Ssinsanction othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2822d270511Ssinsanction } 2835db4956bSzhanglyGit } 2845db4956bSzhanglyGit 2855db4956bSzhanglyGit 2865db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 287ea159d42Ssinsanction val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady) 2885db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 2895db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 2905db4956bSzhanglyGit } 2915db4956bSzhanglyGit 2925db4956bSzhanglyGit 2935db4956bSzhanglyGit //transPolicy 2945db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 2955db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 2965db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 2975db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 2985db4956bSzhanglyGit } 2995db4956bSzhanglyGit } 3005db4956bSzhanglyGit 3015db4956bSzhanglyGit //transEntryEnq 3025db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 3035db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 3045db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 3055db4956bSzhanglyGit } 3068d081717Sszw_kaixin if(backendParams.debugEn) { 3075db4956bSzhanglyGit dontTouch(transEntryEnqVec) 3088d081717Sszw_kaixin } 3095db4956bSzhanglyGit 3105db4956bSzhanglyGit //issueRespVec 311887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 312887f9c3dSzhanglinjuan // vector memory IQ 313887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 314887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 315887f9c3dSzhanglinjuan x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 316887f9c3dSzhanglinjuan )) 317887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 318887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 319887f9c3dSzhanglinjuan } 320887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 321887f9c3dSzhanglinjuan // scalar memory IQ 3225db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 323c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3245db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 325c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3265db4956bSzhanglyGit } 3275db4956bSzhanglyGit } 3285db4956bSzhanglyGit else { 3295db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3305db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3315db4956bSzhanglyGit issueResp := Resp 3325db4956bSzhanglyGit } 3335db4956bSzhanglyGit } 3345db4956bSzhanglyGit 33540283787Ssinsanction //deq 33640283787Ssinsanction val enqEntryOldest = io.deq.map { deq => 33740283787Ssinsanction Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 33840283787Ssinsanction } 339*af4bd265SzhanglyGit val enqEntryOldestCancel = io.deq.map { deq => 340*af4bd265SzhanglyGit Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum)) 341*af4bd265SzhanglyGit } 34240283787Ssinsanction val othersEntryOldest = io.deq.map { deq => 34340283787Ssinsanction Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 34440283787Ssinsanction } 345*af4bd265SzhanglyGit val othersEntryOldestCancel = io.deq.map { deq => 346*af4bd265SzhanglyGit Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum)) 347*af4bd265SzhanglyGit } 348cf4a131aSsinsanction 349cf4a131aSsinsanction if (params.deqFuSame) { 350cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 351cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 352*af4bd265SzhanglyGit val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool())) 353cf4a131aSsinsanction 354cf4a131aSsinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries) 355cf4a131aSsinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse) 356cf4a131aSsinsanction subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U 357cf4a131aSsinsanction subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U 358*af4bd265SzhanglyGit subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B)))) 359*af4bd265SzhanglyGit subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse) 360cf4a131aSsinsanction 3615a6da888Ssinsanction io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1)) 3625a6da888Ssinsanction io.deq(1).deqEntry := subDeqPolicyEntryVec(0) 363*af4bd265SzhanglyGit io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1)) 364*af4bd265SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0) 365cf4a131aSsinsanction 366cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 367cf4a131aSsinsanction assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 36840283787Ssinsanction } 369cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 370cf4a131aSsinsanction assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 371f7f73727Ssinsanction } 372f7f73727Ssinsanction } 373f7f73727Ssinsanction else { 374f7f73727Ssinsanction io.deq.zipWithIndex.foreach { case (x, i) => 375cf4a131aSsinsanction x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i)) 376*af4bd265SzhanglyGit io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i)) 377*af4bd265SzhanglyGit } 378*af4bd265SzhanglyGit } 379*af4bd265SzhanglyGit 380*af4bd265SzhanglyGit if (params.hasIQWakeUp) { 381*af4bd265SzhanglyGit cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) => 382*af4bd265SzhanglyGit cancelByOg0 := l1ExuOH.zip(srcTimer).map { 383*af4bd265SzhanglyGit case(exuOH, srcTimer) => 384*af4bd265SzhanglyGit (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 385*af4bd265SzhanglyGit }.reduce(_ | _) 38640283787Ssinsanction } 38740283787Ssinsanction } 38840283787Ssinsanction 3895db4956bSzhanglyGit io.valid := validVec.asUInt 3905db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3915db4956bSzhanglyGit io.clear := clearVec.asUInt 3925db4956bSzhanglyGit io.fuType := fuTypeVec 3935db4956bSzhanglyGit io.dataSources := dataSourceVec 3945db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 3955db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 39689740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 3972d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 3982d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 3995db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 4005db4956bSzhanglyGit io.deq.foreach{ x => 401cf4a131aSsinsanction x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec) 4025db4956bSzhanglyGit } 4038d081717Sszw_kaixin if(backendParams.debugEn) { 4045db4956bSzhanglyGit dontTouch(io.deq) 4058d081717Sszw_kaixin } 4065db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 4075db4956bSzhanglyGit sink := source.asUInt 4085db4956bSzhanglyGit } 4095db4956bSzhanglyGit} 410