1*5db4956bSzhanglyGitpackage xiangshan.backend.issue 2*5db4956bSzhanglyGit 3*5db4956bSzhanglyGitimport chipsalliance.rocketchip.config.Parameters 4*5db4956bSzhanglyGitimport chisel3._ 5*5db4956bSzhanglyGitimport chisel3.util._ 6*5db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper 7*5db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper, XSError} 8*5db4956bSzhanglyGitimport xiangshan._ 9*5db4956bSzhanglyGitimport xiangshan.backend.Bundles._ 10*5db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData 11*5db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource 12*5db4956bSzhanglyGitimport xiangshan.backend.fu.FuType 13*5db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes 14*5db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr 15*5db4956bSzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr} 16*5db4956bSzhanglyGit 17*5db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 18*5db4956bSzhanglyGit val waitForSqIdx = new SqPtr // generated by store data valid check 19*5db4956bSzhanglyGit val waitForRobIdx = new RobPtr // generated by store set 20*5db4956bSzhanglyGit val waitForStd = Bool() 21*5db4956bSzhanglyGit val strictWait = Bool() 22*5db4956bSzhanglyGit val sqIdx = new SqPtr 23*5db4956bSzhanglyGit} 24*5db4956bSzhanglyGit 25*5db4956bSzhanglyGitclass Status(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 26*5db4956bSzhanglyGit val srcState = Vec(params.numRegSrc, SrcState()) 27*5db4956bSzhanglyGit 28*5db4956bSzhanglyGit val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W)) 29*5db4956bSzhanglyGit val srcType = Vec(params.numRegSrc, SrcType()) 30*5db4956bSzhanglyGit val fuType = FuType() 31*5db4956bSzhanglyGit val robIdx = new RobPtr 32*5db4956bSzhanglyGit val issued = Bool() // for predict issue 33*5db4956bSzhanglyGit val firstIssue = Bool() 34*5db4956bSzhanglyGit val blocked = Bool() // for some block reason 35*5db4956bSzhanglyGit // read reg or get data from bypass network 36*5db4956bSzhanglyGit val dataSources = Vec(params.numRegSrc, DataSource()) 37*5db4956bSzhanglyGit // if waked up by iq, set when waked up by iq 38*5db4956bSzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec())) 39*5db4956bSzhanglyGit // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued. 40*5db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W))) 41*5db4956bSzhanglyGit val issueTimer = UInt(2.W) 42*5db4956bSzhanglyGit val deqPortIdx = UInt(1.W) 43*5db4956bSzhanglyGit 44*5db4956bSzhanglyGit 45*5db4956bSzhanglyGit // mem only 46*5db4956bSzhanglyGit val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None 47*5db4956bSzhanglyGit 48*5db4956bSzhanglyGit // need pc 49*5db4956bSzhanglyGit val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None 50*5db4956bSzhanglyGit val target = if(params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None 51*5db4956bSzhanglyGit 52*5db4956bSzhanglyGit def srcReady: Bool = { 53*5db4956bSzhanglyGit VecInit(srcState.map(SrcState.isReady)).asUInt.andR 54*5db4956bSzhanglyGit } 55*5db4956bSzhanglyGit 56*5db4956bSzhanglyGit def canIssue: Bool = { 57*5db4956bSzhanglyGit srcReady && !issued && !blocked 58*5db4956bSzhanglyGit } 59*5db4956bSzhanglyGit} 60*5db4956bSzhanglyGit 61*5db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 62*5db4956bSzhanglyGit val robIdx = new RobPtr 63*5db4956bSzhanglyGit val respType = RSFeedbackType() // update credit if needs replay 64*5db4956bSzhanglyGit val dataInvalidSqIdx = new SqPtr 65*5db4956bSzhanglyGit val rfWen = Bool() 66*5db4956bSzhanglyGit val fuType = FuType() 67*5db4956bSzhanglyGit} 68*5db4956bSzhanglyGit 69*5db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 70*5db4956bSzhanglyGit val status = new Status() 71*5db4956bSzhanglyGit val imm = UInt(XLEN.W) 72*5db4956bSzhanglyGit val payload = new DynInst() 73*5db4956bSzhanglyGit} 74*5db4956bSzhanglyGit 75*5db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 76*5db4956bSzhanglyGit val isFirstIssue = Output(Bool()) 77*5db4956bSzhanglyGit val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 78*5db4956bSzhanglyGit} 79*5db4956bSzhanglyGit 80*5db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 81*5db4956bSzhanglyGit val flush = Flipped(ValidIO(new Redirect)) 82*5db4956bSzhanglyGit // status 83*5db4956bSzhanglyGit val valid = Output(UInt(params.numEntries.W)) 84*5db4956bSzhanglyGit val canIssue = Output(UInt(params.numEntries.W)) 85*5db4956bSzhanglyGit val clear = Output(UInt(params.numEntries.W)) 86*5db4956bSzhanglyGit val fuType = Output(Vec(params.numEntries, FuType())) 87*5db4956bSzhanglyGit val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 88*5db4956bSzhanglyGit val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 89*5db4956bSzhanglyGit val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 90*5db4956bSzhanglyGit //enq 91*5db4956bSzhanglyGit val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 92*5db4956bSzhanglyGit // wakeup 93*5db4956bSzhanglyGit val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 94*5db4956bSzhanglyGit val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 95*5db4956bSzhanglyGit val og0Cancel = Input(ExuVec(backendParams.numExu)) 96*5db4956bSzhanglyGit val og1Cancel = Input(ExuVec(backendParams.numExu)) 97*5db4956bSzhanglyGit //deq 98*5db4956bSzhanglyGit val deq = Vec(params.numDeq, new DeqBundle) 99*5db4956bSzhanglyGit val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 100*5db4956bSzhanglyGit val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 101*5db4956bSzhanglyGit val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 102*5db4956bSzhanglyGit val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 103*5db4956bSzhanglyGit val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle)) 104*5db4956bSzhanglyGit val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 105*5db4956bSzhanglyGit 106*5db4956bSzhanglyGit 107*5db4956bSzhanglyGit val rsFeedback = Output(Vec(5, Bool())) 108*5db4956bSzhanglyGit // mem only 109*5db4956bSzhanglyGit val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 110*5db4956bSzhanglyGit val stIssuePtr = Input(new SqPtr) 111*5db4956bSzhanglyGit val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 112*5db4956bSzhanglyGit val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 113*5db4956bSzhanglyGit val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 114*5db4956bSzhanglyGit }) else None 115*5db4956bSzhanglyGit 116*5db4956bSzhanglyGit def wakeup = wakeUpFromWB ++ wakeUpFromIQ 117*5db4956bSzhanglyGit} 118*5db4956bSzhanglyGit 119*5db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 120*5db4956bSzhanglyGit private val EnqEntryNum = params.numEnq 121*5db4956bSzhanglyGit private val OthersEntryNum = params.numEntries - params.numEnq 122*5db4956bSzhanglyGit val io = IO(new EntriesIO) 123*5db4956bSzhanglyGit 124*5db4956bSzhanglyGit val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = if(params.isMemAddrIQ) VecInit(io.deqResp, io.og0Resp, io.og1Resp, io.fromMem.get.fastResp, io.fromMem.get.slowResp) 125*5db4956bSzhanglyGit else VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp)) 126*5db4956bSzhanglyGit 127*5db4956bSzhanglyGit //Module 128*5db4956bSzhanglyGit val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 129*5db4956bSzhanglyGit val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 130*5db4956bSzhanglyGit val transPolicy = Module(new EnqPolicy) 131*5db4956bSzhanglyGit 132*5db4956bSzhanglyGit //Wire 133*5db4956bSzhanglyGit val deqSelVec = Wire(Vec(params.numEntries, Bool())) 134*5db4956bSzhanglyGit val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 135*5db4956bSzhanglyGit val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 136*5db4956bSzhanglyGit val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 137*5db4956bSzhanglyGit val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 138*5db4956bSzhanglyGit val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 139*5db4956bSzhanglyGit 140*5db4956bSzhanglyGit val validVec = Wire(Vec(params.numEntries, Bool())) 141*5db4956bSzhanglyGit val canIssueVec = Wire(Vec(params.numEntries, Bool())) 142*5db4956bSzhanglyGit val clearVec = Wire(Vec(params.numEntries, Bool())) 143*5db4956bSzhanglyGit val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 144*5db4956bSzhanglyGit val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 145*5db4956bSzhanglyGit val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec())))) 146*5db4956bSzhanglyGit val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 147*5db4956bSzhanglyGit val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 148*5db4956bSzhanglyGit val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 149*5db4956bSzhanglyGit val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 150*5db4956bSzhanglyGit val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 151*5db4956bSzhanglyGit val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 152*5db4956bSzhanglyGit 153*5db4956bSzhanglyGit io.transEntryDeqVec := transEntryDeqVec 154*5db4956bSzhanglyGit 155*5db4956bSzhanglyGit //enqEntries 156*5db4956bSzhanglyGit enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 157*5db4956bSzhanglyGit enqEntry.io.enq := io.enq(entryIdx) 158*5db4956bSzhanglyGit enqEntry.io.flush := io.flush 159*5db4956bSzhanglyGit enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 160*5db4956bSzhanglyGit enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 161*5db4956bSzhanglyGit enqEntry.io.og0Cancel := io.og0Cancel 162*5db4956bSzhanglyGit enqEntry.io.og1Cancel := io.og1Cancel 163*5db4956bSzhanglyGit enqEntry.io.deqSel := deqSelVec(entryIdx) 164*5db4956bSzhanglyGit enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 165*5db4956bSzhanglyGit enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 166*5db4956bSzhanglyGit enqEntry.io.issueResp := issueRespVec(entryIdx) 167*5db4956bSzhanglyGit validVec(entryIdx) := enqEntry.io.valid 168*5db4956bSzhanglyGit canIssueVec(entryIdx) := enqEntry.io.canIssue 169*5db4956bSzhanglyGit clearVec(entryIdx) := enqEntry.io.clear 170*5db4956bSzhanglyGit fuTypeVec(entryIdx) := enqEntry.io.fuType 171*5db4956bSzhanglyGit dataSourceVec(entryIdx) := enqEntry.io.dataSource 172*5db4956bSzhanglyGit robIdxVec(entryIdx) := enqEntry.io.robIdx 173*5db4956bSzhanglyGit issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 174*5db4956bSzhanglyGit deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 175*5db4956bSzhanglyGit if(params.hasIQWakeUp){ 176*5db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 177*5db4956bSzhanglyGit srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 178*5db4956bSzhanglyGit } 179*5db4956bSzhanglyGit transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 180*5db4956bSzhanglyGit isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 181*5db4956bSzhanglyGit entries(entryIdx) := enqEntry.io.entry 182*5db4956bSzhanglyGit //for mem 183*5db4956bSzhanglyGit if(params.isMemAddrIQ) { 184*5db4956bSzhanglyGit enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 185*5db4956bSzhanglyGit enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 186*5db4956bSzhanglyGit } 187*5db4956bSzhanglyGit 188*5db4956bSzhanglyGit } 189*5db4956bSzhanglyGit //othersEntries 190*5db4956bSzhanglyGit othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 191*5db4956bSzhanglyGit othersEntry.io.enq := transEntryEnqVec(entryIdx) 192*5db4956bSzhanglyGit othersEntry.io.flush := io.flush 193*5db4956bSzhanglyGit othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 194*5db4956bSzhanglyGit othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 195*5db4956bSzhanglyGit othersEntry.io.og0Cancel := io.og0Cancel 196*5db4956bSzhanglyGit othersEntry.io.og1Cancel := io.og1Cancel 197*5db4956bSzhanglyGit othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 198*5db4956bSzhanglyGit othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 199*5db4956bSzhanglyGit othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 200*5db4956bSzhanglyGit othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 201*5db4956bSzhanglyGit validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 202*5db4956bSzhanglyGit canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 203*5db4956bSzhanglyGit clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 204*5db4956bSzhanglyGit fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 205*5db4956bSzhanglyGit dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 206*5db4956bSzhanglyGit robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 207*5db4956bSzhanglyGit issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 208*5db4956bSzhanglyGit deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 209*5db4956bSzhanglyGit if (params.hasIQWakeUp) { 210*5db4956bSzhanglyGit srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 211*5db4956bSzhanglyGit srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 212*5db4956bSzhanglyGit } 213*5db4956bSzhanglyGit isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 214*5db4956bSzhanglyGit entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 215*5db4956bSzhanglyGit //for mem 216*5db4956bSzhanglyGit if (params.isMemAddrIQ) { 217*5db4956bSzhanglyGit othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 218*5db4956bSzhanglyGit othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 219*5db4956bSzhanglyGit } 220*5db4956bSzhanglyGit 221*5db4956bSzhanglyGit } 222*5db4956bSzhanglyGit 223*5db4956bSzhanglyGit 224*5db4956bSzhanglyGit deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 225*5db4956bSzhanglyGit val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i)) 226*5db4956bSzhanglyGit deqPortIdxWrite := OHToUInt(deqVec) 227*5db4956bSzhanglyGit deqSel := deqVec.reduce(_ | _) 228*5db4956bSzhanglyGit } 229*5db4956bSzhanglyGit 230*5db4956bSzhanglyGit 231*5db4956bSzhanglyGit //transPolicy 232*5db4956bSzhanglyGit transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 233*5db4956bSzhanglyGit transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 234*5db4956bSzhanglyGit selBools.zipWithIndex.foreach { case (selBool, i) => 235*5db4956bSzhanglyGit selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 236*5db4956bSzhanglyGit } 237*5db4956bSzhanglyGit } 238*5db4956bSzhanglyGit 239*5db4956bSzhanglyGit //transEntryEnq 240*5db4956bSzhanglyGit transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 241*5db4956bSzhanglyGit val transEnqHit = transSelVec.map(x => x(othersIdx)) 242*5db4956bSzhanglyGit transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 243*5db4956bSzhanglyGit } 244*5db4956bSzhanglyGit dontTouch(transEntryEnqVec) 245*5db4956bSzhanglyGit 246*5db4956bSzhanglyGit //issueRespVec 247*5db4956bSzhanglyGit if(params.isMemAddrIQ){ 248*5db4956bSzhanglyGit issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 249*5db4956bSzhanglyGit val hitRespsVec = VecInit(resps.flatten.map(x => x.valid && (x.bits.robIdx === robIdx))) 250*5db4956bSzhanglyGit issueResp.valid := hitRespsVec.reduce(_ | _) 251*5db4956bSzhanglyGit issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 252*5db4956bSzhanglyGit } 253*5db4956bSzhanglyGit } 254*5db4956bSzhanglyGit else { 255*5db4956bSzhanglyGit issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 256*5db4956bSzhanglyGit val Resp = resps(issueTimer)(deqPortIdx) 257*5db4956bSzhanglyGit issueResp := Resp 258*5db4956bSzhanglyGit } 259*5db4956bSzhanglyGit } 260*5db4956bSzhanglyGit 261*5db4956bSzhanglyGit io.valid := validVec.asUInt 262*5db4956bSzhanglyGit io.canIssue := canIssueVec.asUInt 263*5db4956bSzhanglyGit io.clear := clearVec.asUInt 264*5db4956bSzhanglyGit io.fuType := fuTypeVec 265*5db4956bSzhanglyGit io.dataSources := dataSourceVec 266*5db4956bSzhanglyGit io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 267*5db4956bSzhanglyGit io.srcTimer.foreach(_ := srcTimerVec.get) 268*5db4956bSzhanglyGit io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 269*5db4956bSzhanglyGit io.deq.foreach{ x => 270*5db4956bSzhanglyGit x.isFirstIssue := Mux(x.deqSelOH.valid, Mux1H(x.deqSelOH.bits, isFirstIssueVec), false.B) 271*5db4956bSzhanglyGit } 272*5db4956bSzhanglyGit dontTouch(io.deq) 273*5db4956bSzhanglyGit io.deqEntry.zip(io.deq.map(_.deqSelOH)).foreach{ case (deqEntry, deqSelOH) => 274*5db4956bSzhanglyGit deqEntry.valid := deqSelOH.valid && entries(OHToUInt(deqSelOH.bits)).valid 275*5db4956bSzhanglyGit deqEntry.bits := entries(OHToUInt(deqSelOH.bits)).bits 276*5db4956bSzhanglyGit } 277*5db4956bSzhanglyGit io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 278*5db4956bSzhanglyGit sink := source.asUInt 279*5db4956bSzhanglyGit } 280*5db4956bSzhanglyGit}