1package xiangshan.backend.issue 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import utility.HasCircularQueuePtrHelper 7import utils.{MathUtils, OptionWrapper, XSError} 8import xiangshan._ 9import xiangshan.backend.Bundles._ 10import xiangshan.backend.datapath.DataConfig.VAddrData 11import xiangshan.backend.datapath.DataSource 12import xiangshan.backend.fu.FuType 13import xiangshan.backend.fu.vector.Utils.NOnes 14import xiangshan.backend.rob.RobPtr 15import xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr} 16 17class StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 18 val waitForSqIdx = new SqPtr // generated by store data valid check 19 val waitForRobIdx = new RobPtr // generated by store set 20 val waitForStd = Bool() 21 val strictWait = Bool() 22 val sqIdx = new SqPtr 23} 24 25class StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 26 val sqIdx = new SqPtr 27 val lqIdx = new LqPtr 28} 29 30class Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 31 val srcState = Vec(params.numRegSrc, SrcState()) 32 33 val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W)) 34 val srcType = Vec(params.numRegSrc, SrcType()) 35 val fuType = FuType() 36 val robIdx = new RobPtr 37 val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx()) 38 val issued = Bool() // for predict issue 39 val firstIssue = Bool() 40 val blocked = Bool() // for some block reason 41 // read reg or get data from bypass network 42 val dataSources = Vec(params.numRegSrc, DataSource()) 43 // if waked up by iq, set when waked up by iq 44 val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuOH())) 45 // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued. 46 val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W))) 47 val issueTimer = UInt(2.W) 48 val deqPortIdx = UInt(1.W) 49 val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))) 50 51 52 // mem only 53 val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None 54 55 // vector mem only 56 val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None 57 58 // need pc 59 val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None 60 61 def srcReady: Bool = { 62 VecInit(srcState.map(SrcState.isReady)).asUInt.andR 63 } 64 65 def canIssue: Bool = { 66 srcReady && !issued && !blocked 67 } 68 69 def mergedLoadDependency = { 70 srcLoadDependency.map(_.map(_.toSeq).reduce({ 71 case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2)) 72 }: (Vec[UInt], Vec[UInt]) => Vec[UInt])) 73 } 74} 75 76class EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 77 val robIdx = new RobPtr 78 val uopIdx = UopIdx() 79 val respType = RSFeedbackType() // update credit if needs replay 80 val dataInvalidSqIdx = new SqPtr 81 val rfWen = Bool() 82 val fuType = FuType() 83} 84 85class EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 86 val status = new Status() 87 val imm = UInt(XLEN.W) 88 val payload = new DynInst() 89} 90 91class DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 92 //input 93 val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W))) 94 val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))) 95 val subDeqPolicyRequest = Input(UInt(params.numEntries.W)) 96 val subDeqSelOH = Vec(params.numDeq, Input(UInt(params.numEntries.W))) 97 val finalDeqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 98 //output 99 val isFirstIssue = Output(Bool()) 100 val deqEntry = ValidIO(new EntryBundle) 101} 102 103class EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 104 val flush = Flipped(ValidIO(new Redirect)) 105 // status 106 val valid = Output(UInt(params.numEntries.W)) 107 val canIssue = Output(UInt(params.numEntries.W)) 108 val clear = Output(UInt(params.numEntries.W)) 109 val fuType = Output(Vec(params.numEntries, FuType())) 110 val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 111 val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 112 val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 113 val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 114 val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 115 //enq 116 val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 117 // wakeup 118 val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 119 val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 120 val og0Cancel = Input(ExuOH(backendParams.numExu)) 121 val og1Cancel = Input(ExuOH(backendParams.numExu)) 122 val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 123 //deq 124 val deq = Vec(params.numDeq, new DeqBundle) 125 val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 126 val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 127 val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 128 val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 129 val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 130 val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 131 val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 132 133 134 val rsFeedback = Output(Vec(5, Bool())) 135 // mem only 136 val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 137 val stIssuePtr = Input(new SqPtr) 138 val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 139 val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 140 val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 141 }) else None 142 143 // vector mem only 144 val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 145 val sqDeqPtr = Input(new SqPtr) 146 val lqDeqPtr = Input(new LqPtr) 147 }) 148 149 // debug 150 val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 151 152 def wakeup = wakeUpFromWB ++ wakeUpFromIQ 153} 154 155class Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 156 private val EnqEntryNum = params.numEnq 157 private val OthersEntryNum = params.numEntries - params.numEnq 158 val io = IO(new EntriesIO) 159 160 // only memAddrIQ use it 161 val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 162 if (params.isLdAddrIQ && !params.isStAddrIQ) 163 MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 164 else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 165 MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 166 else if (params.isMemAddrIQ) 167 MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 168 else MixedVecInit(Seq()) 169 } 170 171 val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp)) 172 173 //Module 174 val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 175 val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 176 val transPolicy = Module(new EnqPolicy) 177 178 //Wire 179 val deqSelVec = Wire(Vec(params.numEntries, Bool())) 180 val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 181 val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 182 val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 183 val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 184 val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 185 186 val validVec = Wire(Vec(params.numEntries, Bool())) 187 val canIssueVec = Wire(Vec(params.numEntries, Bool())) 188 val clearVec = Wire(Vec(params.numEntries, Bool())) 189 val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 190 val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 191 val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 192 val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 193 val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 194 val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 195 val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 196 val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 197 val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 198 val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 199 val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 200 201 io.transEntryDeqVec := transEntryDeqVec 202 203 //enqEntries 204 enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 205 enqEntry.io.enq := io.enq(entryIdx) 206 enqEntry.io.flush := io.flush 207 enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 208 enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 209 enqEntry.io.og0Cancel := io.og0Cancel 210 enqEntry.io.og1Cancel := io.og1Cancel 211 enqEntry.io.ldCancel := io.ldCancel 212 enqEntry.io.deqSel := deqSelVec(entryIdx) 213 enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 214 enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR 215 enqEntry.io.issueResp := issueRespVec(entryIdx) 216 validVec(entryIdx) := enqEntry.io.valid 217 canIssueVec(entryIdx) := enqEntry.io.canIssue 218 clearVec(entryIdx) := enqEntry.io.clear 219 fuTypeVec(entryIdx) := enqEntry.io.fuType 220 dataSourceVec(entryIdx) := enqEntry.io.dataSource 221 robIdxVec(entryIdx) := enqEntry.io.robIdx 222 issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 223 deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 224 if (params.hasIQWakeUp) { 225 srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 226 srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 227 cancelVec.get(entryIdx) := enqEntry.io.cancel.get 228 } 229 transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 230 isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 231 entries(entryIdx) := enqEntry.io.entry 232 //for mem 233 if (params.isMemAddrIQ) { 234 enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 235 enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 236 } 237 if (params.isVecMemIQ) { 238 uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 239 enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 240 enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 241 } 242 } 243 //othersEntries 244 othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 245 othersEntry.io.enq := transEntryEnqVec(entryIdx) 246 othersEntry.io.flush := io.flush 247 othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 248 othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 249 othersEntry.io.og0Cancel := io.og0Cancel 250 othersEntry.io.og1Cancel := io.og1Cancel 251 othersEntry.io.ldCancel := io.ldCancel 252 othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 253 othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 254 othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 255 othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 256 validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 257 canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 258 clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 259 fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 260 dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 261 robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 262 issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 263 deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 264 if (params.hasIQWakeUp) { 265 srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 266 srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 267 cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 268 } 269 isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 270 entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 271 //for mem 272 if (params.isMemAddrIQ) { 273 othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 274 othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 275 } 276 if (params.isVecMemIQ) { 277 uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 278 othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 279 othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 280 } 281 } 282 283 284 deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 285 val deqVec = io.deq.map(x => x.finalDeqSelOH.valid && x.finalDeqSelOH.bits(i)) 286 deqPortIdxWrite := OHToUInt(deqVec) 287 deqSel := deqVec.reduce(_ | _) 288 } 289 290 291 //transPolicy 292 transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt 293 transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) => 294 selBools.zipWithIndex.foreach { case (selBool, i) => 295 selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i) 296 } 297 } 298 299 //transEntryEnq 300 transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 301 val transEnqHit = transSelVec.map(x => x(othersIdx)) 302 transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 303 } 304 if(backendParams.debugEn) { 305 dontTouch(transEntryEnqVec) 306 } 307 308 //issueRespVec 309 if (params.isVecMemIQ) { 310 // vector memory IQ 311 issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 312 val hitRespsVec = VecInit(resps.flatten.map(x => 313 x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 314 )) 315 issueResp.valid := hitRespsVec.reduce(_ | _) 316 issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 317 } 318 } else if (params.isMemAddrIQ) { 319 // scalar memory IQ 320 issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 321 val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 322 issueResp.valid := hitRespsVec.reduce(_ | _) 323 issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 324 } 325 } 326 else { 327 issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 328 val Resp = resps(issueTimer)(deqPortIdx) 329 issueResp := Resp 330 } 331 } 332 333 //deq 334 val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, Vec(params.numDeq, ValidIO(new EntryBundle)))) 335 val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Vec(params.numDeq, Bool()))) 336 val deqSelEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 337 338 val enqEntryOldest = io.deq.map { deq => 339 Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 340 } 341 val othersEntryOldest = io.deq.map { deq => 342 Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 343 } 344 subDeqPolicyEntryVec.zip(subDeqPolicyValidVec).zipWithIndex.foreach { case ((entry, valid), i) => 345 entry(0) := PriorityMux(io.deq(i).subDeqPolicyRequest, entries) 346 valid(0) := PopCount(io.deq(i).subDeqPolicyRequest) >= 1.U 347 if (params.numDeq == 2) { 348 entry(1) := PriorityMux(Reverse(io.deq(i).subDeqPolicyRequest), entries.reverse) 349 valid(1) := PopCount(io.deq(i).subDeqPolicyRequest) >= 2.U 350 } 351 } 352 353 deqSelEntryVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), 354 Mux(io.deq(0).enqEntryOldestSel.valid, enqEntryOldest(0), subDeqPolicyEntryVec(0)(0))) 355 io.deq(0).deqEntry.valid := (io.deq(0).othersEntryOldestSel.valid || io.deq(0).enqEntryOldestSel.valid || subDeqPolicyValidVec(0)(0)) && deqSelEntryVec(0).valid 356 io.deq(0).deqEntry.bits := deqSelEntryVec(0).bits 357 358 if (params.numDeq == 2) { 359 val chooseOthersOldest = io.deq(1).othersEntryOldestSel.valid && Cat(io.deq(1).othersEntryOldestSel.bits, 0.U((params.numEnq).W)) =/= io.deq(0).finalDeqSelOH.bits 360 val chooseEnqOldest = io.deq(1).enqEntryOldestSel.valid && Cat(0.U((params.numEntries-params.numEnq).W), io.deq(1).enqEntryOldestSel.bits) =/= io.deq(0).finalDeqSelOH.bits 361 val choose1stSub = io.deq(1).subDeqSelOH(0) =/= io.deq(0).finalDeqSelOH.bits 362 363 when (subDeqPolicyValidVec(0)(0)) { 364 assert(Mux1H(io.deq(0).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0)(0).bits.status.robIdx, "subDeqSelOH isnot the same 0 0\n") 365 } 366 when (subDeqPolicyValidVec(1)(0)) { 367 assert(Mux1H(io.deq(1).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(0).bits.status.robIdx, "subDeqSelOH isnot the same 1 0\n") 368 } 369 when (subDeqPolicyValidVec(1)(1)) { 370 assert(Mux1H(io.deq(1).subDeqSelOH(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(1).bits.status.robIdx, "subDeqSelOH isnot the same 1 1\n") 371 } 372 373 deqSelEntryVec(1) := Mux(chooseOthersOldest, othersEntryOldest(1), 374 Mux(chooseEnqOldest, enqEntryOldest(1), 375 Mux(choose1stSub, subDeqPolicyEntryVec(1)(0), subDeqPolicyEntryVec(1)(1)))) 376 io.deq(1).deqEntry.valid := io.deq(1).finalDeqSelOH.valid && deqSelEntryVec(1).valid 377 io.deq(1).deqEntry.bits := deqSelEntryVec(1).bits 378 } 379 380 io.valid := validVec.asUInt 381 io.canIssue := canIssueVec.asUInt 382 io.clear := clearVec.asUInt 383 io.fuType := fuTypeVec 384 io.dataSources := dataSourceVec 385 io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 386 io.srcTimer.foreach(_ := srcTimerVec.get) 387 io.cancel.foreach(_ := cancelVec.get) 388 io.robIdx.foreach(_ := robIdxVec) 389 io.uopIdx.foreach(_ := uopIdxVec.get) 390 io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 391 io.deq.foreach{ x => 392 x.isFirstIssue := x.finalDeqSelOH.valid && Mux1H(x.finalDeqSelOH.bits, isFirstIssueVec) 393 } 394 if(backendParams.debugEn) { 395 dontTouch(io.deq) 396 } 397 io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 398 sink := source.asUInt 399 } 400} 401