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 17543f3ac7Ssinsanctionobject IQFuType { 18543f3ac7Ssinsanction def num = FuType.num 19543f3ac7Ssinsanction 20543f3ac7Ssinsanction def apply() = Vec(num, Bool()) 21543f3ac7Ssinsanction 22543f3ac7Ssinsanction def readFuType(fuType: Vec[Bool], fus: Seq[FuType.OHType]): Vec[Bool] = { 23543f3ac7Ssinsanction val res = 0.U.asTypeOf(fuType) 24543f3ac7Ssinsanction fus.foreach(x => res(x.id) := fuType(x.id)) 25543f3ac7Ssinsanction res 26543f3ac7Ssinsanction } 27543f3ac7Ssinsanction} 28543f3ac7Ssinsanction 295db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 305db4956bSzhanglyGit val waitForSqIdx = new SqPtr // generated by store data valid check 315db4956bSzhanglyGit val waitForRobIdx = new RobPtr // generated by store set 325db4956bSzhanglyGit val waitForStd = Bool() 335db4956bSzhanglyGit val strictWait = Bool() 345db4956bSzhanglyGit val sqIdx = new SqPtr 355db4956bSzhanglyGit} 365db4956bSzhanglyGit 372d270511Ssinsanctionclass StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 382d270511Ssinsanction val sqIdx = new SqPtr 392d270511Ssinsanction val lqIdx = new LqPtr 402d270511Ssinsanction} 412d270511Ssinsanction 420f55a0d3SHaojin Tangclass Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 435db4956bSzhanglyGit val srcState = Vec(params.numRegSrc, SrcState()) 445db4956bSzhanglyGit 455db4956bSzhanglyGit val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W)) 465db4956bSzhanglyGit val srcType = Vec(params.numRegSrc, SrcType()) 47543f3ac7Ssinsanction val fuType = IQFuType() 485db4956bSzhanglyGit val robIdx = new RobPtr 492d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx()) 505db4956bSzhanglyGit val issued = Bool() // for predict issue 515db4956bSzhanglyGit val firstIssue = Bool() 525db4956bSzhanglyGit val blocked = Bool() // for some block reason 535db4956bSzhanglyGit // read reg or get data from bypass network 545db4956bSzhanglyGit val dataSources = Vec(params.numRegSrc, DataSource()) 555db4956bSzhanglyGit // if waked up by iq, set when waked up by iq 561f35da39Sxiaofeibao-xjtu val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec())) 575db4956bSzhanglyGit // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued. 585db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W))) 595db4956bSzhanglyGit val issueTimer = UInt(2.W) 605db4956bSzhanglyGit val deqPortIdx = UInt(1.W) 610f55a0d3SHaojin Tang val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))) 625db4956bSzhanglyGit 635db4956bSzhanglyGit // mem only 645db4956bSzhanglyGit val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None 655db4956bSzhanglyGit 662d270511Ssinsanction // vector mem only 672d270511Ssinsanction val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None 682d270511Ssinsanction 695db4956bSzhanglyGit def srcReady: Bool = { 705db4956bSzhanglyGit VecInit(srcState.map(SrcState.isReady)).asUInt.andR 715db4956bSzhanglyGit } 725db4956bSzhanglyGit 735db4956bSzhanglyGit def canIssue: Bool = { 745db4956bSzhanglyGit srcReady && !issued && !blocked 755db4956bSzhanglyGit } 760f55a0d3SHaojin Tang 7783ba63b3SXuan Hu def mergedLoadDependency = { 7883ba63b3SXuan Hu srcLoadDependency.map(_.map(_.toSeq).reduce({ 7983ba63b3SXuan Hu case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2)) 8083ba63b3SXuan Hu }: (Vec[UInt], Vec[UInt]) => Vec[UInt])) 8183ba63b3SXuan Hu } 825db4956bSzhanglyGit} 835db4956bSzhanglyGit 845db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 855db4956bSzhanglyGit val robIdx = new RobPtr 86887f9c3dSzhanglinjuan val uopIdx = UopIdx() 875db4956bSzhanglyGit val respType = RSFeedbackType() // update credit if needs replay 885db4956bSzhanglyGit val dataInvalidSqIdx = new SqPtr 895db4956bSzhanglyGit val rfWen = Bool() 905db4956bSzhanglyGit val fuType = FuType() 915db4956bSzhanglyGit} 925db4956bSzhanglyGit 935db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 945db4956bSzhanglyGit val status = new Status() 95520f7dacSsinsanction val imm = OptionWrapper(params.needImm, UInt((params.deqImmTypesMaxLen).W)) 965db4956bSzhanglyGit val payload = new DynInst() 975db4956bSzhanglyGit} 985db4956bSzhanglyGit 995db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 10040283787Ssinsanction //input 10140283787Ssinsanction val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W))) 10240283787Ssinsanction val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))) 103cf4a131aSsinsanction val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 104cf4a131aSsinsanction val subDeqSelOH = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 105ea159d42Ssinsanction val deqReady = Input(Bool()) 106f7f73727Ssinsanction val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 10740283787Ssinsanction //output 1085db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 10940283787Ssinsanction val deqEntry = ValidIO(new EntryBundle) 1105db4956bSzhanglyGit} 1115db4956bSzhanglyGit 1125db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 1135db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 1145db4956bSzhanglyGit // status 1155db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 1165db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 1175db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 1185db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 1195db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 1207a96cc7fSHaojin Tang val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 1215db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 1222d270511Ssinsanction val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 1232d270511Ssinsanction val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 1245db4956bSzhanglyGit //enq 1255db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 1265db4956bSzhanglyGit // wakeup 1275db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 1285db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 1297a96cc7fSHaojin Tang val og0Cancel = Input(ExuOH(backendParams.numExu)) 1307a96cc7fSHaojin Tang val og1Cancel = Input(ExuOH(backendParams.numExu)) 1316810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 1325db4956bSzhanglyGit //deq 1335db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 1345db4956bSzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1355db4956bSzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1368a66c02cSXuan Hu val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1378a66c02cSXuan Hu val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 1385db4956bSzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 1395db4956bSzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 140af4bd265SzhanglyGit val cancelDeqVec = Output(Vec(params.numDeq, Bool())) 1415db4956bSzhanglyGit 1425db4956bSzhanglyGit 1435db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 1445db4956bSzhanglyGit // mem only 1455db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 1465db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 1475db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 1485db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1495db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 1505db4956bSzhanglyGit }) else None 1515db4956bSzhanglyGit 1522d270511Ssinsanction // vector mem only 1532d270511Ssinsanction val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 1542d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 1552d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1562d270511Ssinsanction }) 1572d270511Ssinsanction 15889740385Ssinsanction // debug 15989740385Ssinsanction val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 16089740385Ssinsanction 1615db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 1625db4956bSzhanglyGit} 1635db4956bSzhanglyGit 1645db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 165*0721d1aaSXuan Hu override def desiredName: String = params.getEntryName 166*0721d1aaSXuan Hu 1675db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 1685db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 1695db4956bSzhanglyGit val io = IO(new EntriesIO) 1705db4956bSzhanglyGit 171c838dea1SXuan Hu // only memAddrIQ use it 172c838dea1SXuan Hu val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 17356715025SXuan Hu if (params.isLdAddrIQ && !params.isStAddrIQ) 174ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 17556715025SXuan Hu else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 176ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 17756715025SXuan Hu else if (params.isMemAddrIQ) 178ea159d42Ssinsanction MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 179c838dea1SXuan Hu else MixedVecInit(Seq()) 180c838dea1SXuan Hu } 181c838dea1SXuan Hu 182ea159d42Ssinsanction val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 1835db4956bSzhanglyGit 1845db4956bSzhanglyGit //Module 1855db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 1865db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 1875db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 1885db4956bSzhanglyGit 1895db4956bSzhanglyGit //Wire 1905db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 1915db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 1925db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 1935db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 1945db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 1955db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 1965db4956bSzhanglyGit 1975db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 1985db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 1995db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 2005db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 2015db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 2027a96cc7fSHaojin Tang val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 2035db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 204af4bd265SzhanglyGit val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 2055db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 2065db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 2075db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 2085db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 2095db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 21089740385Ssinsanction val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 2112d270511Ssinsanction val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 2125db4956bSzhanglyGit 2135db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 2145db4956bSzhanglyGit 2155db4956bSzhanglyGit //enqEntries 2165db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 2175db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 2185db4956bSzhanglyGit enqEntry.io.flush := io.flush 2195db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 2205db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2215db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 2225db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 2230f55a0d3SHaojin Tang enqEntry.io.ldCancel := io.ldCancel 224aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB) 225aa2b5219Ssinsanction enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ) 226aa2b5219Ssinsanction enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel) 227aa2b5219Ssinsanction enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel) 2285db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 2295db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 2305db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 2315db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 2325db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 2335db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 2345db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 2355db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 2365db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 2375db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 2385db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 2395db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 2405db4956bSzhanglyGit if (params.hasIQWakeUp) { 2415db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 2425db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 24389740385Ssinsanction cancelVec.get(entryIdx) := enqEntry.io.cancel.get 2445db4956bSzhanglyGit } 2455db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 2465db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 2475db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 2485db4956bSzhanglyGit //for mem 2495db4956bSzhanglyGit if (params.isMemAddrIQ) { 2505db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2515db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2525db4956bSzhanglyGit } 2532d270511Ssinsanction if (params.isVecMemIQ) { 2542d270511Ssinsanction uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 2552d270511Ssinsanction enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2562d270511Ssinsanction enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2572d270511Ssinsanction } 2585db4956bSzhanglyGit } 2595db4956bSzhanglyGit //othersEntries 2605db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 2615db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 2625db4956bSzhanglyGit othersEntry.io.flush := io.flush 2635db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 2645db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 2655db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 2665db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 2670f55a0d3SHaojin Tang othersEntry.io.ldCancel := io.ldCancel 2685db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 2695db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 2705db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 2715db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 2725db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 2735db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 2745db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 2755db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 2765db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 2775db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 2785db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 2795db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 2805db4956bSzhanglyGit if (params.hasIQWakeUp) { 2815db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 2825db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 28389740385Ssinsanction cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 2845db4956bSzhanglyGit } 2855db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 2865db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 2875db4956bSzhanglyGit //for mem 2885db4956bSzhanglyGit if (params.isMemAddrIQ) { 2895db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 2905db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 2915db4956bSzhanglyGit } 2922d270511Ssinsanction if (params.isVecMemIQ) { 2932d270511Ssinsanction uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 2942d270511Ssinsanction othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 2952d270511Ssinsanction othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 2962d270511Ssinsanction } 2975db4956bSzhanglyGit } 2985db4956bSzhanglyGit 2995db4956bSzhanglyGit 3005db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 301ea159d42Ssinsanction val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady) 3025db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 3035db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 3045db4956bSzhanglyGit } 3055db4956bSzhanglyGit 3065db4956bSzhanglyGit 3075db4956bSzhanglyGit //transPolicy 3085db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 3095db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 3105db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 3115db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 3125db4956bSzhanglyGit } 3135db4956bSzhanglyGit } 3145db4956bSzhanglyGit 3155db4956bSzhanglyGit //transEntryEnq 3165db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 3175db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 3185db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 3195db4956bSzhanglyGit } 3208d081717Sszw_kaixin if(backendParams.debugEn) { 3215db4956bSzhanglyGit dontTouch(transEntryEnqVec) 3228d081717Sszw_kaixin } 3235db4956bSzhanglyGit 3245db4956bSzhanglyGit //issueRespVec 325887f9c3dSzhanglinjuan if (params.isVecMemIQ) { 326887f9c3dSzhanglinjuan // vector memory IQ 327887f9c3dSzhanglinjuan issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 328887f9c3dSzhanglinjuan val hitRespsVec = VecInit(resps.flatten.map(x => 329887f9c3dSzhanglinjuan x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 330887f9c3dSzhanglinjuan )) 331887f9c3dSzhanglinjuan issueResp.valid := hitRespsVec.reduce(_ | _) 332887f9c3dSzhanglinjuan issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 333887f9c3dSzhanglinjuan } 334887f9c3dSzhanglinjuan } else if (params.isMemAddrIQ) { 335887f9c3dSzhanglinjuan // scalar memory IQ 3365db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 337c838dea1SXuan Hu val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 3385db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 339c838dea1SXuan Hu issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 3405db4956bSzhanglyGit } 3415db4956bSzhanglyGit } 3425db4956bSzhanglyGit else { 3435db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 3445db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 3455db4956bSzhanglyGit issueResp := Resp 3465db4956bSzhanglyGit } 3475db4956bSzhanglyGit } 3485db4956bSzhanglyGit 34940283787Ssinsanction //deq 35040283787Ssinsanction val enqEntryOldest = io.deq.map { deq => 35140283787Ssinsanction Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 35240283787Ssinsanction } 353af4bd265SzhanglyGit val enqEntryOldestCancel = io.deq.map { deq => 354af4bd265SzhanglyGit Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum)) 355af4bd265SzhanglyGit } 35640283787Ssinsanction val othersEntryOldest = io.deq.map { deq => 35740283787Ssinsanction Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 35840283787Ssinsanction } 359af4bd265SzhanglyGit val othersEntryOldestCancel = io.deq.map { deq => 360af4bd265SzhanglyGit Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum)) 361af4bd265SzhanglyGit } 362cf4a131aSsinsanction 363cf4a131aSsinsanction if (params.deqFuSame) { 364cf4a131aSsinsanction val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 365cf4a131aSsinsanction val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 366af4bd265SzhanglyGit val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool())) 367cf4a131aSsinsanction 368cf4a131aSsinsanction subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries) 369cf4a131aSsinsanction subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse) 370cf4a131aSsinsanction subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U 371cf4a131aSsinsanction subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U 372af4bd265SzhanglyGit subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B)))) 373af4bd265SzhanglyGit subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse) 374cf4a131aSsinsanction 3755a6da888Ssinsanction io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1)) 3765a6da888Ssinsanction io.deq(1).deqEntry := subDeqPolicyEntryVec(0) 377af4bd265SzhanglyGit io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1)) 378af4bd265SzhanglyGit io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0) 379cf4a131aSsinsanction 380cf4a131aSsinsanction when (subDeqPolicyValidVec(0)) { 381cf4a131aSsinsanction assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 38240283787Ssinsanction } 383cf4a131aSsinsanction when (subDeqPolicyValidVec(1)) { 384cf4a131aSsinsanction assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 385f7f73727Ssinsanction } 386f7f73727Ssinsanction } 387f7f73727Ssinsanction else { 388f7f73727Ssinsanction io.deq.zipWithIndex.foreach { case (x, i) => 389cf4a131aSsinsanction x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i)) 390af4bd265SzhanglyGit io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i)) 391af4bd265SzhanglyGit } 392af4bd265SzhanglyGit } 393af4bd265SzhanglyGit 394af4bd265SzhanglyGit if (params.hasIQWakeUp) { 395af4bd265SzhanglyGit cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) => 396af4bd265SzhanglyGit cancelByOg0 := l1ExuOH.zip(srcTimer).map { 397af4bd265SzhanglyGit case(exuOH, srcTimer) => 398af4bd265SzhanglyGit (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 399af4bd265SzhanglyGit }.reduce(_ | _) 40040283787Ssinsanction } 40140283787Ssinsanction } 40240283787Ssinsanction 4035db4956bSzhanglyGit io.valid := validVec.asUInt 4045db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 4055db4956bSzhanglyGit io.clear := clearVec.asUInt 4065db4956bSzhanglyGit io.fuType := fuTypeVec 4075db4956bSzhanglyGit io.dataSources := dataSourceVec 4085db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 4095db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 41089740385Ssinsanction io.cancel.foreach(_ := cancelVec.get) 4112d270511Ssinsanction io.robIdx.foreach(_ := robIdxVec) 4122d270511Ssinsanction io.uopIdx.foreach(_ := uopIdxVec.get) 4135db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 4145db4956bSzhanglyGit io.deq.foreach{ x => 415cf4a131aSsinsanction x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec) 4165db4956bSzhanglyGit } 4178d081717Sszw_kaixin if(backendParams.debugEn) { 4185db4956bSzhanglyGit dontTouch(io.deq) 4198d081717Sszw_kaixin } 4205db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 4215db4956bSzhanglyGit sink := source.asUInt 4225db4956bSzhanglyGit } 4235db4956bSzhanglyGit} 424