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 15*2d270511Ssinsanctionimport 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 25*2d270511Ssinsanctionclass StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 26*2d270511Ssinsanction val sqIdx = new SqPtr 27*2d270511Ssinsanction val lqIdx = new LqPtr 28*2d270511Ssinsanction} 29*2d270511Ssinsanction 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 37*2d270511Ssinsanction 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 55*2d270511Ssinsanction // vector mem only 56*2d270511Ssinsanction val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None 57*2d270511Ssinsanction 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 785db4956bSzhanglyGit val respType = RSFeedbackType() // update credit if needs replay 795db4956bSzhanglyGit val dataInvalidSqIdx = new SqPtr 805db4956bSzhanglyGit val rfWen = Bool() 815db4956bSzhanglyGit val fuType = FuType() 825db4956bSzhanglyGit} 835db4956bSzhanglyGit 845db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 855db4956bSzhanglyGit val status = new Status() 865db4956bSzhanglyGit val imm = UInt(XLEN.W) 875db4956bSzhanglyGit val payload = new DynInst() 885db4956bSzhanglyGit} 895db4956bSzhanglyGit 905db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 915db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 925db4956bSzhanglyGit val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 935db4956bSzhanglyGit} 945db4956bSzhanglyGit 955db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 965db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 975db4956bSzhanglyGit // status 985db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 995db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 1005db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 1015db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 1025db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1037a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1045db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 105*2d270511Ssinsanction val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 106*2d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 1075db4956bSzhanglyGit //enq 1085db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 1095db4956bSzhanglyGit // wakeup 1105db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 1115db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 1127a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 1137a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 1146810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 1155db4956bSzhanglyGit //deq 1165db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 1175db4956bSzhanglyGit val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1185db4956bSzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1195db4956bSzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1208a66c02cSXuan Hu val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1218a66c02cSXuan Hu val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1225db4956bSzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 1235db4956bSzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 1245db4956bSzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 1255db4956bSzhanglyGit 1265db4956bSzhanglyGit 1275db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 1285db4956bSzhanglyGit // mem only 1295db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 1305db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 1315db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 1325db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1335db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1345db4956bSzhanglyGit }) else None 1355db4956bSzhanglyGit 136*2d270511Ssinsanction // vector mem only 137*2d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 138*2d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 139*2d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 140*2d270511Ssinsanction }) 141*2d270511Ssinsanction 14289740385Ssinsanction // debug 14389740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 14489740385Ssinsanction 1455db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 1465db4956bSzhanglyGit} 1475db4956bSzhanglyGit 1485db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 1495db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 1505db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 1515db4956bSzhanglyGit val io = IO(new EntriesIO) 1525db4956bSzhanglyGit 153c838dea1SXuan Hu // only memAddrIQ use it 154c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 15556715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 15656715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 15756715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 15856715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 15956715025SXuan Hu else if (params.isMemAddrIQ) 16056715025SXuan Hu MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 161c838dea1SXuan Hu else MixedVecInit(Seq()) 162c838dea1SXuan Hu } 163c838dea1SXuan Hu 164c838dea1SXuan Hu val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp)) 1655db4956bSzhanglyGit 1665db4956bSzhanglyGit //Module 1675db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 1685db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 1695db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 1705db4956bSzhanglyGit 1715db4956bSzhanglyGit //Wire 1725db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 1735db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 1745db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 1755db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 1765db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 1775db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 1785db4956bSzhanglyGit 1795db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 1805db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 1815db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 1825db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 1835db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1847a96cc7fSHaojin Tang val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1855db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1865db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 1875db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 1885db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 1895db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 1905db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 19189740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 192*2d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 1935db4956bSzhanglyGit 1945db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 1955db4956bSzhanglyGit 1965db4956bSzhanglyGit //enqEntries 1975db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 1985db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 1995db4956bSzhanglyGit enqEntry.io.flush := io.flush 2005db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 2015db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2025db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 2035db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 2040f55a0d3SHaojin Tang enqEntry.io.ldCancel := io.ldCancel 2055db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 2065db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 2075db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 2085db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 2095db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 2105db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 2115db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 2125db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 2135db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 2145db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 2155db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 2165db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 2175db4956bSzhanglyGit if (params.hasIQWakeUp) { 2185db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 2195db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 22089740385Ssinsanction cancelVec.get(entryIdx) := enqEntry.io.cancel.get 2215db4956bSzhanglyGit } 2225db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 2235db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 2245db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 2255db4956bSzhanglyGit //for mem 2265db4956bSzhanglyGit if (params.isMemAddrIQ) { 2275db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2285db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2295db4956bSzhanglyGit } 230*2d270511Ssinsanction if (params.isVecMemIQ) { 231*2d270511Ssinsanction uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 232*2d270511Ssinsanction enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 233*2d270511Ssinsanction enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 234*2d270511Ssinsanction } 2355db4956bSzhanglyGit } 2365db4956bSzhanglyGit //othersEntries 2375db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 2385db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 2395db4956bSzhanglyGit othersEntry.io.flush := io.flush 2405db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 2415db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2425db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 2435db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 2440f55a0d3SHaojin Tang othersEntry.io.ldCancel := io.ldCancel 2455db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 2465db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 2475db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 2485db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 2495db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 2505db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 2515db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 2525db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 2535db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 2545db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 2555db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 2565db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 2575db4956bSzhanglyGit if (params.hasIQWakeUp) { 2585db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 2595db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 26089740385Ssinsanction cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 2615db4956bSzhanglyGit } 2625db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 2635db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 2645db4956bSzhanglyGit //for mem 2655db4956bSzhanglyGit if (params.isMemAddrIQ) { 2665db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2675db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2685db4956bSzhanglyGit } 269*2d270511Ssinsanction if (params.isVecMemIQ) { 270*2d270511Ssinsanction uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 271*2d270511Ssinsanction othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 272*2d270511Ssinsanction othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 273*2d270511Ssinsanction } 2745db4956bSzhanglyGit } 2755db4956bSzhanglyGit 2765db4956bSzhanglyGit 2775db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 2785db4956bSzhanglyGit val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i)) 2795db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 2805db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 2815db4956bSzhanglyGit } 2825db4956bSzhanglyGit 2835db4956bSzhanglyGit 2845db4956bSzhanglyGit //transPolicy 2855db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 2865db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 2875db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 2885db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 2895db4956bSzhanglyGit } 2905db4956bSzhanglyGit } 2915db4956bSzhanglyGit 2925db4956bSzhanglyGit //transEntryEnq 2935db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 2945db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 2955db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 2965db4956bSzhanglyGit } 2975db4956bSzhanglyGit dontTouch(transEntryEnqVec) 2985db4956bSzhanglyGit 2995db4956bSzhanglyGit //issueRespVec 3005db4956bSzhanglyGit if(params.isMemAddrIQ){ 3015db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 302c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3035db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 304c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3055db4956bSzhanglyGit } 3065db4956bSzhanglyGit } 3075db4956bSzhanglyGit else { 3085db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3095db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3105db4956bSzhanglyGit issueResp := Resp 3115db4956bSzhanglyGit } 3125db4956bSzhanglyGit } 3135db4956bSzhanglyGit 3145db4956bSzhanglyGit io.valid := validVec.asUInt 3155db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 3165db4956bSzhanglyGit io.clear := clearVec.asUInt 3175db4956bSzhanglyGit io.fuType := fuTypeVec 3185db4956bSzhanglyGit io.dataSources := dataSourceVec 3195db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 3205db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 32189740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 322*2d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 323*2d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 3245db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 3255db4956bSzhanglyGit io.deq.foreach{ x => 3265db4956bSzhanglyGit x.isFirstIssue := Mux(x.deqSelOH.valid, Mux1H(x.deqSelOH.bits, isFirstIssueVec), false.B) 3275db4956bSzhanglyGit } 3285db4956bSzhanglyGit dontTouch(io.deq) 3295db4956bSzhanglyGit io.deqEntry.zip(io.deq.map(_.deqSelOH)).foreach{ case (deqEntry, deqSelOH) => 3305db4956bSzhanglyGit deqEntry.valid := deqSelOH.valid && entries(OHToUInt(deqSelOH.bits)).valid 3315db4956bSzhanglyGit deqEntry.bits := entries(OHToUInt(deqSelOH.bits)).bits 3325db4956bSzhanglyGit } 3335db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 3345db4956bSzhanglyGit sink := source.asUInt 3355db4956bSzhanglyGit } 3365db4956bSzhanglyGit} 337