18921b337SYinan Xupackage xiangshan.backend 28921b337SYinan Xu 38921b337SYinan Xuimport chisel3._ 48921b337SYinan Xuimport chisel3.util._ 521732575SYinan Xuimport utils._ 68921b337SYinan Xuimport xiangshan._ 72b8b2e7aSWilliam Wangimport xiangshan.backend.decode.{DecodeStage, ImmUnion, WaitTableParameters} 88926ac22SLinJiaweiimport xiangshan.backend.rename.{BusyTable, Rename} 98921b337SYinan Xuimport xiangshan.backend.dispatch.Dispatch 108921b337SYinan Xuimport xiangshan.backend.exu._ 11694b0180SLinJiaweiimport xiangshan.backend.exu.Exu.exuConfigs 12884dbb3bSLinJiaweiimport xiangshan.backend.ftq.{Ftq, FtqRead, GetPcByFtq} 138921b337SYinan Xuimport xiangshan.backend.regfile.RfReadPort 143a474d38SYinan Xuimport xiangshan.backend.roq.{Roq, RoqCSRIO, RoqLsqIO, RoqPtr} 15780ade3fSYinan Xuimport xiangshan.mem.LsqEnqIO 168921b337SYinan Xu 178921b337SYinan Xuclass CtrlToIntBlockIO extends XSBundle { 188921b337SYinan Xu val enqIqCtrl = Vec(exuParameters.IntExuCnt, DecoupledIO(new MicroOp)) 198af95560SYinan Xu val readRf = Vec(NRIntReadPorts, Output(UInt(PhyRegIdxWidth.W))) 208926ac22SLinJiawei val jumpPc = Output(UInt(VAddrBits.W)) 21cde9280dSLinJiawei val jalr_target = Output(UInt(VAddrBits.W)) 2282f87dffSYikeZhou // int block only uses port 0~7 2382f87dffSYikeZhou val readPortIndex = Vec(exuParameters.IntExuCnt, Output(UInt(log2Ceil(8 / 2).W))) // TODO parameterize 8 here 2466bcc42fSYinan Xu val redirect = ValidIO(new Redirect) 252d7c7105SYinan Xu val flush = Output(Bool()) 268921b337SYinan Xu} 278921b337SYinan Xu 288921b337SYinan Xuclass CtrlToFpBlockIO extends XSBundle { 298921b337SYinan Xu val enqIqCtrl = Vec(exuParameters.FpExuCnt, DecoupledIO(new MicroOp)) 308af95560SYinan Xu val readRf = Vec(NRFpReadPorts, Output(UInt(PhyRegIdxWidth.W))) 3182f87dffSYikeZhou // fp block uses port 0~11 3282f87dffSYikeZhou val readPortIndex = Vec(exuParameters.FpExuCnt, Output(UInt(log2Ceil((NRFpReadPorts - exuParameters.StuCnt) / 3).W))) 3366bcc42fSYinan Xu val redirect = ValidIO(new Redirect) 342d7c7105SYinan Xu val flush = Output(Bool()) 358921b337SYinan Xu} 368921b337SYinan Xu 378921b337SYinan Xuclass CtrlToLsBlockIO extends XSBundle { 388921b337SYinan Xu val enqIqCtrl = Vec(exuParameters.LsExuCnt, DecoupledIO(new MicroOp)) 39780ade3fSYinan Xu val enqLsq = Flipped(new LsqEnqIO) 402b8b2e7aSWilliam Wang val waitTableUpdate = Vec(StorePipelineWidth, Input(new WaitTableUpdateReq)) 4166bcc42fSYinan Xu val redirect = ValidIO(new Redirect) 422d7c7105SYinan Xu val flush = Output(Bool()) 438921b337SYinan Xu} 448921b337SYinan Xu 452b8b2e7aSWilliam Wangclass RedirectGenerator extends XSModule with HasCircularQueuePtrHelper with WaitTableParameters { 46*dfde261eSljw val numRedirect = exuParameters.JmpCnt + exuParameters.AluCnt 47884dbb3bSLinJiawei val io = IO(new Bundle() { 48*dfde261eSljw val exuMispredict = Vec(numRedirect, Flipped(ValidIO(new ExuOutput))) 496c0bbf39Sljw val loadReplay = Flipped(ValidIO(new Redirect)) 509ed972adSLinJiawei val flush = Input(Bool()) 51*dfde261eSljw val stage1FtqRead = Vec(numRedirect + 1, new FtqRead) 5236d7aed5SLinJiawei val stage2FtqRead = new FtqRead 53884dbb3bSLinJiawei val stage2Redirect = ValidIO(new Redirect) 54faf3cfa9SLinJiawei val stage3Redirect = ValidIO(new Redirect) 55*dfde261eSljw val waitTableUpdate = Output(new WaitTableUpdateReq) 56884dbb3bSLinJiawei }) 57884dbb3bSLinJiawei /* 58884dbb3bSLinJiawei LoadQueue Jump ALU0 ALU1 ALU2 ALU3 exception Stage1 59884dbb3bSLinJiawei | | | | | | | 60faf3cfa9SLinJiawei |============= reg & compare =====| | ======== 6136d7aed5SLinJiawei | | 6236d7aed5SLinJiawei | | 6336d7aed5SLinJiawei | | Stage2 64884dbb3bSLinJiawei | | 65884dbb3bSLinJiawei redirect (flush backend) | 66884dbb3bSLinJiawei | | 67884dbb3bSLinJiawei === reg === | ======== 68884dbb3bSLinJiawei | | 69884dbb3bSLinJiawei |----- mux (exception first) -----| Stage3 70884dbb3bSLinJiawei | 71884dbb3bSLinJiawei redirect (send to frontend) 72884dbb3bSLinJiawei */ 73*dfde261eSljw private class Wrapper(val n: Int) extends Bundle { 74*dfde261eSljw val redirect = new Redirect 75*dfde261eSljw val valid = Bool() 76*dfde261eSljw val idx = UInt(log2Up(n).W) 77*dfde261eSljw } 78*dfde261eSljw def selectOldestRedirect(xs: Seq[Valid[Redirect]]): (Valid[Redirect], UInt) = { 79*dfde261eSljw val wrappers = for((r, i) <- xs.zipWithIndex) yield { 80*dfde261eSljw val wrap = Wire(new Wrapper(xs.size)) 81*dfde261eSljw wrap.redirect := r.bits 82*dfde261eSljw wrap.valid := r.valid 83*dfde261eSljw wrap.idx := i.U 84*dfde261eSljw wrap 85*dfde261eSljw } 86*dfde261eSljw val oldest = ParallelOperation[Wrapper](wrappers, (x, y) => { 876060732cSLinJiawei Mux(x.valid, 88*dfde261eSljw Mux(y.valid, Mux(isAfter(x.redirect.roqIdx, y.redirect.roqIdx), y, x), x), y 896060732cSLinJiawei ) 90faf3cfa9SLinJiawei }) 91*dfde261eSljw val result = Wire(Valid(new Redirect)) 92*dfde261eSljw result.valid := oldest.valid 93*dfde261eSljw result.bits := oldest.redirect 94*dfde261eSljw (result, oldest.idx) 95*dfde261eSljw } 96faf3cfa9SLinJiawei 97*dfde261eSljw for((ptr, redirect) <- io.stage1FtqRead.map(_.ptr).zip( 98*dfde261eSljw io.exuMispredict.map(_.bits.redirect) :+ io.loadReplay.bits 99*dfde261eSljw )){ ptr := redirect.ftqIdx } 100f7f707b0SLinJiawei 101*dfde261eSljw def getRedirect(exuOut: Valid[ExuOutput]): ValidIO[Redirect] = { 102*dfde261eSljw val redirect = Wire(Valid(new Redirect)) 103*dfde261eSljw redirect.valid := exuOut.valid && exuOut.bits.redirect.cfiUpdate.isMisPred 104*dfde261eSljw redirect.bits := exuOut.bits.redirect 105*dfde261eSljw redirect 106*dfde261eSljw } 107*dfde261eSljw 108*dfde261eSljw val jumpOut = io.exuMispredict.head 109*dfde261eSljw val aluOut = VecInit(io.exuMispredict.tail) 110*dfde261eSljw val (oldestAluRedirect, oldestAluIdx) = selectOldestRedirect(aluOut.map(getRedirect)) 111*dfde261eSljw val (oldestExuRedirect, jumpIsOlder) = selectOldestRedirect(Seq( 112*dfde261eSljw oldestAluRedirect, getRedirect(jumpOut) 113*dfde261eSljw )) 114*dfde261eSljw val oldestExuOutput = Mux(jumpIsOlder.asBool(), jumpOut, aluOut(oldestAluIdx)) 115*dfde261eSljw val (oldestRedirect, _) = selectOldestRedirect(Seq(io.loadReplay, oldestExuRedirect)) 116*dfde261eSljw 117*dfde261eSljw val s1_isJump = RegNext(jumpIsOlder.asBool(), init = false.B) 1186060732cSLinJiawei val s1_jumpTarget = RegEnable(jumpOut.bits.redirect.cfiUpdate.target, jumpOut.valid) 119*dfde261eSljw val s1_imm12_reg = RegEnable(oldestExuOutput.bits.uop.ctrl.imm(11, 0), oldestExuOutput.valid) 120*dfde261eSljw val s1_pd = RegEnable(oldestExuOutput.bits.uop.cf.pd, oldestExuOutput.valid) 121faf3cfa9SLinJiawei val s1_redirect_bits_reg = Reg(new Redirect) 122faf3cfa9SLinJiawei val s1_redirect_valid_reg = RegInit(false.B) 123*dfde261eSljw val s1_aluIdx = RegEnable(oldestAluIdx, oldestAluRedirect.valid) 124faf3cfa9SLinJiawei 125faf3cfa9SLinJiawei // stage1 -> stage2 126*dfde261eSljw when(oldestRedirect.valid && !oldestRedirect.bits.roqIdx.needFlush(io.stage2Redirect, io.flush)){ 127*dfde261eSljw s1_redirect_bits_reg := oldestRedirect.bits 128faf3cfa9SLinJiawei s1_redirect_valid_reg := true.B 129faf3cfa9SLinJiawei }.otherwise({ 130faf3cfa9SLinJiawei s1_redirect_valid_reg := false.B 131faf3cfa9SLinJiawei }) 13227c1214eSLinJiawei io.stage2Redirect.valid := s1_redirect_valid_reg && !io.flush 133faf3cfa9SLinJiawei io.stage2Redirect.bits := s1_redirect_bits_reg 134faf3cfa9SLinJiawei io.stage2Redirect.bits.cfiUpdate := DontCare 135faf3cfa9SLinJiawei // at stage2, we read ftq to get pc 136faf3cfa9SLinJiawei io.stage2FtqRead.ptr := s1_redirect_bits_reg.ftqIdx 137faf3cfa9SLinJiawei 138*dfde261eSljw val isReplay = RedirectLevel.flushItself(s1_redirect_bits_reg.level) 139*dfde261eSljw val ftqRead = Mux(isReplay, 140*dfde261eSljw io.stage1FtqRead.last.entry, 141*dfde261eSljw Mux( 142*dfde261eSljw s1_isJump, 143*dfde261eSljw io.stage1FtqRead.head.entry, 144*dfde261eSljw VecInit(io.stage1FtqRead.tail.take(exuParameters.AluCnt).map(_.entry))(s1_aluIdx) 145*dfde261eSljw ) 146*dfde261eSljw ) 147*dfde261eSljw val cfiUpdate_pc = Cat( 148*dfde261eSljw ftqRead.ftqPC.head(VAddrBits - s1_redirect_bits_reg.ftqOffset.getWidth - instOffsetBits), 149*dfde261eSljw s1_redirect_bits_reg.ftqOffset, 150*dfde261eSljw 0.U(instOffsetBits.W) 151*dfde261eSljw ) 152*dfde261eSljw val real_pc = GetPcByFtq(ftqRead.ftqPC, s1_redirect_bits_reg.ftqOffset, 15301f25297SLingrui98 ftqRead.lastPacketPC.valid, 154*dfde261eSljw ftqRead.lastPacketPC.bits 155*dfde261eSljw ) 156*dfde261eSljw val brTarget = real_pc + SignExt(ImmUnion.B.toImm32(s1_imm12_reg), XLEN) 157*dfde261eSljw val snpc = real_pc + Mux(s1_pd.isRVC, 2.U, 4.U) 158faf3cfa9SLinJiawei val target = Mux(isReplay, 15901f25297SLingrui98 real_pc, // repaly from itself 160*dfde261eSljw Mux(s1_redirect_bits_reg.cfiUpdate.taken, 161*dfde261eSljw Mux(s1_isJump, s1_jumpTarget, brTarget), 1626060732cSLinJiawei snpc 163faf3cfa9SLinJiawei ) 164faf3cfa9SLinJiawei ) 1652b8b2e7aSWilliam Wang 1662b8b2e7aSWilliam Wang // update waittable if load violation redirect triggered 167*dfde261eSljw io.waitTableUpdate.valid := RegNext(isReplay && s1_redirect_valid_reg, init = false.B) 168*dfde261eSljw io.waitTableUpdate.waddr := RegNext(XORFold(real_pc(VAddrBits-1, 1), WaitTableAddrWidth)) 1692b8b2e7aSWilliam Wang io.waitTableUpdate.wdata := true.B 1702b8b2e7aSWilliam Wang 171*dfde261eSljw io.stage2FtqRead.ptr := s1_redirect_bits_reg.ftqIdx 172*dfde261eSljw 173*dfde261eSljw val s2_target = RegEnable(target, enable = s1_redirect_valid_reg) 174*dfde261eSljw val s2_pd = RegEnable(s1_pd, enable = s1_redirect_valid_reg) 175*dfde261eSljw val s2_cfiUpdata_pc = RegEnable(cfiUpdate_pc, enable = s1_redirect_valid_reg) 176*dfde261eSljw val s2_redirect_bits_reg = RegEnable(s1_redirect_bits_reg, enable = s1_redirect_valid_reg) 177*dfde261eSljw val s2_redirect_valid_reg = RegNext(s1_redirect_valid_reg && !io.flush, init = false.B) 178*dfde261eSljw val s2_ftqRead = io.stage2FtqRead.entry 179*dfde261eSljw 180faf3cfa9SLinJiawei io.stage3Redirect.valid := s2_redirect_valid_reg 181faf3cfa9SLinJiawei io.stage3Redirect.bits := s2_redirect_bits_reg 182faf3cfa9SLinJiawei val stage3CfiUpdate = io.stage3Redirect.bits.cfiUpdate 183*dfde261eSljw stage3CfiUpdate.pc := s2_cfiUpdata_pc 184faf3cfa9SLinJiawei stage3CfiUpdate.pd := s2_pd 185*dfde261eSljw stage3CfiUpdate.rasSp := s2_ftqRead.rasSp 186*dfde261eSljw stage3CfiUpdate.rasEntry := s2_ftqRead.rasTop 187*dfde261eSljw stage3CfiUpdate.predHist := s2_ftqRead.predHist 188*dfde261eSljw stage3CfiUpdate.specCnt := s2_ftqRead.specCnt 189*dfde261eSljw stage3CfiUpdate.hist := s2_ftqRead.hist 190cde9280dSLinJiawei stage3CfiUpdate.predTaken := s2_redirect_bits_reg.cfiUpdate.predTaken 191faf3cfa9SLinJiawei stage3CfiUpdate.sawNotTakenBranch := VecInit((0 until PredictWidth).map{ i => 192*dfde261eSljw if(i == 0) false.B else Cat(s2_ftqRead.br_mask.take(i)).orR() 193faf3cfa9SLinJiawei })(s2_redirect_bits_reg.ftqOffset) 194*dfde261eSljw stage3CfiUpdate.target := s2_target 195faf3cfa9SLinJiawei stage3CfiUpdate.taken := s2_redirect_bits_reg.cfiUpdate.taken 196faf3cfa9SLinJiawei stage3CfiUpdate.isMisPred := s2_redirect_bits_reg.cfiUpdate.isMisPred 197884dbb3bSLinJiawei} 198884dbb3bSLinJiawei 19921732575SYinan Xuclass CtrlBlock extends XSModule with HasCircularQueuePtrHelper { 2008921b337SYinan Xu val io = IO(new Bundle { 2018921b337SYinan Xu val frontend = Flipped(new FrontendToBackendIO) 2028921b337SYinan Xu val fromIntBlock = Flipped(new IntBlockToCtrlIO) 2038921b337SYinan Xu val fromFpBlock = Flipped(new FpBlockToCtrlIO) 2048921b337SYinan Xu val fromLsBlock = Flipped(new LsBlockToCtrlIO) 2058921b337SYinan Xu val toIntBlock = new CtrlToIntBlockIO 2068921b337SYinan Xu val toFpBlock = new CtrlToFpBlockIO 2078921b337SYinan Xu val toLsBlock = new CtrlToLsBlockIO 2081c2588aaSYinan Xu val roqio = new Bundle { 2091c2588aaSYinan Xu // to int block 2101c2588aaSYinan Xu val toCSR = new RoqCSRIO 2113a474d38SYinan Xu val exception = ValidIO(new ExceptionInfo) 2121c2588aaSYinan Xu // to mem block 21310aac6e7SWilliam Wang val lsq = new RoqLsqIO 2141c2588aaSYinan Xu } 2152b8b2e7aSWilliam Wang val csrCtrl = Input(new CustomCSRCtrlIO) 2168921b337SYinan Xu }) 2178921b337SYinan Xu 218a165bd69Swangkaifan val difftestIO = IO(new Bundle() { 219a165bd69Swangkaifan val fromRoq = new Bundle() { 220a165bd69Swangkaifan val commit = Output(UInt(32.W)) 221a165bd69Swangkaifan val thisPC = Output(UInt(XLEN.W)) 222a165bd69Swangkaifan val thisINST = Output(UInt(32.W)) 223a165bd69Swangkaifan val skip = Output(UInt(32.W)) 224a165bd69Swangkaifan val wen = Output(UInt(32.W)) 225a165bd69Swangkaifan val wdata = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6 226a165bd69Swangkaifan val wdst = Output(Vec(CommitWidth, UInt(32.W))) // set difftest width to 6 227a165bd69Swangkaifan val wpc = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6 228a165bd69Swangkaifan val isRVC = Output(UInt(32.W)) 229a165bd69Swangkaifan val scFailed = Output(Bool()) 23007635e87Swangkaifan val lpaddr = Output(Vec(CommitWidth, UInt(64.W))) 23107635e87Swangkaifan val ltype = Output(Vec(CommitWidth, UInt(32.W))) 23207635e87Swangkaifan val lfu = Output(Vec(CommitWidth, UInt(4.W))) 233a165bd69Swangkaifan } 234a165bd69Swangkaifan }) 235a165bd69Swangkaifan difftestIO <> DontCare 236a165bd69Swangkaifan 237884dbb3bSLinJiawei val ftq = Module(new Ftq) 23854bc08adSwangkaifan val trapIO = IO(new TrapIO()) 23954bc08adSwangkaifan trapIO <> DontCare 24054bc08adSwangkaifan 2418921b337SYinan Xu val decode = Module(new DecodeStage) 2428921b337SYinan Xu val rename = Module(new Rename) 243694b0180SLinJiawei val dispatch = Module(new Dispatch) 2443fae98acSYinan Xu val intBusyTable = Module(new BusyTable(NRIntReadPorts, NRIntWritePorts)) 2453fae98acSYinan Xu val fpBusyTable = Module(new BusyTable(NRFpReadPorts, NRFpWritePorts)) 246884dbb3bSLinJiawei val redirectGen = Module(new RedirectGenerator) 2478921b337SYinan Xu 248884dbb3bSLinJiawei val roqWbSize = NRIntWritePorts + NRFpWritePorts + exuParameters.StuCnt 249694b0180SLinJiawei val roq = Module(new Roq(roqWbSize)) 2508921b337SYinan Xu 251884dbb3bSLinJiawei val backendRedirect = redirectGen.io.stage2Redirect 252faf3cfa9SLinJiawei val frontendRedirect = redirectGen.io.stage3Redirect 2532d7c7105SYinan Xu val flush = roq.io.flushOut.valid 254bbd262adSLinJiawei val flushReg = RegNext(flush) 255faf3cfa9SLinJiawei 256*dfde261eSljw val exuRedirect = io.fromIntBlock.exuRedirect.map(x => { 257*dfde261eSljw val valid = x.valid && x.bits.redirectValid 258*dfde261eSljw val killedByOlder = x.bits.uop.roqIdx.needFlush(backendRedirect, flushReg) 259*dfde261eSljw val delayed = Wire(Valid(new ExuOutput)) 260*dfde261eSljw delayed.valid := RegNext(valid && !killedByOlder, init = false.B) 261*dfde261eSljw delayed.bits := RegEnable(x.bits, x.valid) 262*dfde261eSljw delayed 263faf3cfa9SLinJiawei }) 264*dfde261eSljw VecInit(ftq.io.ftqRead.tail.dropRight(1)) <> redirectGen.io.stage1FtqRead 265*dfde261eSljw ftq.io.cfiRead <> redirectGen.io.stage2FtqRead 266*dfde261eSljw redirectGen.io.exuMispredict <> exuRedirect 2676c0bbf39Sljw redirectGen.io.loadReplay := io.fromLsBlock.replay 268bbd262adSLinJiawei redirectGen.io.flush := flushReg 2698921b337SYinan Xu 270884dbb3bSLinJiawei ftq.io.enq <> io.frontend.fetchInfo 271884dbb3bSLinJiawei for(i <- 0 until CommitWidth){ 2726060732cSLinJiawei ftq.io.roq_commits(i).valid := roq.io.commits.valid(i) && !roq.io.commits.isWalk 273884dbb3bSLinJiawei ftq.io.roq_commits(i).bits := roq.io.commits.info(i) 274884dbb3bSLinJiawei } 275884dbb3bSLinJiawei ftq.io.redirect <> backendRedirect 276bbd262adSLinJiawei ftq.io.flush := flushReg 277bbd262adSLinJiawei ftq.io.flushIdx := RegNext(roq.io.flushOut.bits.ftqIdx) 278bbd262adSLinJiawei ftq.io.flushOffset := RegNext(roq.io.flushOut.bits.ftqOffset) 279faf3cfa9SLinJiawei ftq.io.frontendRedirect <> frontendRedirect 280*dfde261eSljw ftq.io.exuWriteback <> exuRedirect 281884dbb3bSLinJiawei 282*dfde261eSljw ftq.io.ftqRead.last.ptr := roq.io.flushOut.bits.ftqIdx 2839ed972adSLinJiawei val flushPC = GetPcByFtq( 284*dfde261eSljw ftq.io.ftqRead.last.entry.ftqPC, 2859ed972adSLinJiawei RegEnable(roq.io.flushOut.bits.ftqOffset, roq.io.flushOut.valid), 286*dfde261eSljw ftq.io.ftqRead.last.entry.lastPacketPC.valid, 287*dfde261eSljw ftq.io.ftqRead.last.entry.lastPacketPC.bits 2889ed972adSLinJiawei ) 289884dbb3bSLinJiawei 2909ed972adSLinJiawei val flushRedirect = Wire(Valid(new Redirect)) 291bbd262adSLinJiawei flushRedirect.valid := flushReg 2929ed972adSLinJiawei flushRedirect.bits := DontCare 2939ed972adSLinJiawei flushRedirect.bits.ftqIdx := RegEnable(roq.io.flushOut.bits.ftqIdx, flush) 2949ed972adSLinJiawei flushRedirect.bits.interrupt := true.B 295ac5a5d53SLinJiawei flushRedirect.bits.cfiUpdate.target := Mux(io.roqio.toCSR.isXRet || roq.io.exception.valid, 296ac5a5d53SLinJiawei io.roqio.toCSR.trapTarget, 297ac5a5d53SLinJiawei flushPC + 4.U // flush pipe 2989ed972adSLinJiawei ) 2999ed972adSLinJiawei 3009ed972adSLinJiawei io.frontend.redirect_cfiUpdate := Mux(flushRedirect.valid, flushRedirect, frontendRedirect) 30103380706SLinJiawei io.frontend.commit_cfiUpdate := ftq.io.commit_ftqEntry 302fc4776e4SLinJiawei io.frontend.ftqEnqPtr := ftq.io.enqPtr 303fc4776e4SLinJiawei io.frontend.ftqLeftOne := ftq.io.leftOne 30466bcc42fSYinan Xu 3058921b337SYinan Xu decode.io.in <> io.frontend.cfVec 3062b8b2e7aSWilliam Wang // currently, we only update wait table when isReplay 3072b8b2e7aSWilliam Wang decode.io.waitTableUpdate(0) <> RegNext(redirectGen.io.waitTableUpdate) 3082b8b2e7aSWilliam Wang decode.io.waitTableUpdate(1) := DontCare 3092b8b2e7aSWilliam Wang decode.io.waitTableUpdate(1).valid := false.B 3102b8b2e7aSWilliam Wang // decode.io.waitTableUpdate <> io.toLsBlock.waitTableUpdate 3112b8b2e7aSWilliam Wang decode.io.csrCtrl := RegNext(io.csrCtrl) 3122b8b2e7aSWilliam Wang 3138921b337SYinan Xu 314884dbb3bSLinJiawei val jumpInst = dispatch.io.enqIQCtrl(0).bits 3156060732cSLinJiawei val ftqOffsetReg = Reg(UInt(log2Up(PredictWidth).W)) 3166060732cSLinJiawei ftqOffsetReg := jumpInst.cf.ftqOffset 317884dbb3bSLinJiawei ftq.io.ftqRead(0).ptr := jumpInst.cf.ftqPtr // jump 3187aa94463SLinJiawei io.toIntBlock.jumpPc := GetPcByFtq( 3191670d147SLingrui98 ftq.io.ftqRead(0).entry.ftqPC, ftqOffsetReg, 3201670d147SLingrui98 ftq.io.ftqRead(0).entry.lastPacketPC.valid, 3211670d147SLingrui98 ftq.io.ftqRead(0).entry.lastPacketPC.bits 3227aa94463SLinJiawei ) 323148ba860SLinJiawei io.toIntBlock.jalr_target := ftq.io.ftqRead(0).entry.target 3240412e00dSLinJiawei 325b424051cSYinan Xu // pipeline between decode and dispatch 326b424051cSYinan Xu for (i <- 0 until RenameWidth) { 327884dbb3bSLinJiawei PipelineConnect(decode.io.out(i), rename.io.in(i), rename.io.in(i).ready, 328bbd262adSLinJiawei io.frontend.redirect_cfiUpdate.valid) 329b424051cSYinan Xu } 3308921b337SYinan Xu 331884dbb3bSLinJiawei rename.io.redirect <> backendRedirect 332bbd262adSLinJiawei rename.io.flush := flushReg 3338921b337SYinan Xu rename.io.roqCommits <> roq.io.commits 3348921b337SYinan Xu rename.io.out <> dispatch.io.fromRename 33599b8dc2cSYinan Xu rename.io.renameBypass <> dispatch.io.renameBypass 336049559e7SYinan Xu rename.io.dispatchInfo <> dispatch.io.preDpInfo 3378921b337SYinan Xu 338884dbb3bSLinJiawei dispatch.io.redirect <> backendRedirect 339bbd262adSLinJiawei dispatch.io.flush := flushReg 34021b47d38SYinan Xu dispatch.io.enqRoq <> roq.io.enq 34108fafef0SYinan Xu dispatch.io.enqLsq <> io.toLsBlock.enqLsq 3422bb6eba1SYinan Xu dispatch.io.readIntRf <> io.toIntBlock.readRf 3432bb6eba1SYinan Xu dispatch.io.readFpRf <> io.toFpBlock.readRf 3443fae98acSYinan Xu dispatch.io.allocPregs.zipWithIndex.foreach { case (preg, i) => 3453fae98acSYinan Xu intBusyTable.io.allocPregs(i).valid := preg.isInt 3461c931a03SYinan Xu fpBusyTable.io.allocPregs(i).valid := preg.isFp 3473fae98acSYinan Xu intBusyTable.io.allocPregs(i).bits := preg.preg 3483fae98acSYinan Xu fpBusyTable.io.allocPregs(i).bits := preg.preg 3493fae98acSYinan Xu } 3508921b337SYinan Xu dispatch.io.numExist <> io.fromIntBlock.numExist ++ io.fromFpBlock.numExist ++ io.fromLsBlock.numExist 3512bb6eba1SYinan Xu dispatch.io.enqIQCtrl <> io.toIntBlock.enqIqCtrl ++ io.toFpBlock.enqIqCtrl ++ io.toLsBlock.enqIqCtrl 35276e1d2a4SYikeZhou// dispatch.io.enqIQData <> io.toIntBlock.enqIqData ++ io.toFpBlock.enqIqData ++ io.toLsBlock.enqIqData 3538921b337SYinan Xu 3540412e00dSLinJiawei 355bbd262adSLinJiawei fpBusyTable.io.flush := flushReg 356bbd262adSLinJiawei intBusyTable.io.flush := flushReg 3573fae98acSYinan Xu for((wb, setPhyRegRdy) <- io.fromIntBlock.wbRegs.zip(intBusyTable.io.wbPregs)){ 3581e2ad30cSYinan Xu setPhyRegRdy.valid := wb.valid && wb.bits.uop.ctrl.rfWen 3593fae98acSYinan Xu setPhyRegRdy.bits := wb.bits.uop.pdest 3603fae98acSYinan Xu } 3613fae98acSYinan Xu for((wb, setPhyRegRdy) <- io.fromFpBlock.wbRegs.zip(fpBusyTable.io.wbPregs)){ 3623fae98acSYinan Xu setPhyRegRdy.valid := wb.valid && wb.bits.uop.ctrl.fpWen 3633fae98acSYinan Xu setPhyRegRdy.bits := wb.bits.uop.pdest 3643fae98acSYinan Xu } 3658af95560SYinan Xu intBusyTable.io.read <> dispatch.io.readIntState 3668af95560SYinan Xu fpBusyTable.io.read <> dispatch.io.readFpState 3673fae98acSYinan Xu 368884dbb3bSLinJiawei roq.io.redirect <> backendRedirect 369fc8a3b3fSljw roq.io.exeWbResults <> (io.fromIntBlock.wbRegs ++ io.fromFpBlock.wbRegs ++ io.fromLsBlock.stOut) 3700412e00dSLinJiawei 371884dbb3bSLinJiawei // TODO: is 'backendRedirect' necesscary? 372884dbb3bSLinJiawei io.toIntBlock.redirect <> backendRedirect 373bbd262adSLinJiawei io.toIntBlock.flush <> flushReg 374884dbb3bSLinJiawei io.toFpBlock.redirect <> backendRedirect 375bbd262adSLinJiawei io.toFpBlock.flush <> flushReg 376884dbb3bSLinJiawei io.toLsBlock.redirect <> backendRedirect 377bbd262adSLinJiawei io.toLsBlock.flush <> flushReg 3780412e00dSLinJiawei 3793d499721Swangkaifan if (!env.FPGAPlatform) { 380a165bd69Swangkaifan difftestIO.fromRoq <> roq.difftestIO 38154bc08adSwangkaifan trapIO <> roq.trapIO 382a165bd69Swangkaifan } 383a165bd69Swangkaifan 3849916fbd7SYikeZhou dispatch.io.readPortIndex.intIndex <> io.toIntBlock.readPortIndex 3859916fbd7SYikeZhou dispatch.io.readPortIndex.fpIndex <> io.toFpBlock.readPortIndex 3869916fbd7SYikeZhou 3871c2588aaSYinan Xu // roq to int block 3881c2588aaSYinan Xu io.roqio.toCSR <> roq.io.csr 3892d7c7105SYinan Xu io.roqio.exception := roq.io.exception 3909ed972adSLinJiawei io.roqio.exception.bits.uop.cf.pc := flushPC 3911c2588aaSYinan Xu // roq to mem block 39210aac6e7SWilliam Wang io.roqio.lsq <> roq.io.lsq 3938921b337SYinan Xu} 394