18921b337SYinan Xupackage xiangshan.backend 28921b337SYinan Xu 38921b337SYinan Xuimport chisel3._ 48921b337SYinan Xuimport chisel3.util._ 521732575SYinan Xuimport utils._ 68921b337SYinan Xuimport xiangshan._ 737e3a7b0SLinJiaweiimport xiangshan.backend.decode.{DecodeStage, ImmUnion} 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 148f77f081SYinan Xuimport xiangshan.backend.roq.{Roq, RoqCSRIO, RoqLsqIO, RoqPtr, RoqExceptionInfo} 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) 4066bcc42fSYinan Xu val redirect = ValidIO(new Redirect) 412d7c7105SYinan Xu val flush = Output(Bool()) 428921b337SYinan Xu} 438921b337SYinan Xu 44faf3cfa9SLinJiaweiclass RedirectGenerator extends XSModule with HasCircularQueuePtrHelper { 45884dbb3bSLinJiawei val io = IO(new Bundle() { 46884dbb3bSLinJiawei val loadRelay = Flipped(ValidIO(new Redirect)) 47884dbb3bSLinJiawei val exuMispredict = Vec(exuParameters.JmpCnt + exuParameters.AluCnt, Flipped(ValidIO(new ExuOutput))) 489ed972adSLinJiawei val flush = Input(Bool()) 4936d7aed5SLinJiawei val stage2FtqRead = new FtqRead 50884dbb3bSLinJiawei val stage2Redirect = ValidIO(new Redirect) 51faf3cfa9SLinJiawei val stage3Redirect = ValidIO(new Redirect) 52884dbb3bSLinJiawei }) 53884dbb3bSLinJiawei /* 54884dbb3bSLinJiawei LoadQueue Jump ALU0 ALU1 ALU2 ALU3 exception Stage1 55884dbb3bSLinJiawei | | | | | | | 56faf3cfa9SLinJiawei |============= reg & compare =====| | ======== 5736d7aed5SLinJiawei | | 5836d7aed5SLinJiawei | | 5936d7aed5SLinJiawei | | Stage2 60884dbb3bSLinJiawei | | 61884dbb3bSLinJiawei redirect (flush backend) | 62884dbb3bSLinJiawei | | 63884dbb3bSLinJiawei === reg === | ======== 64884dbb3bSLinJiawei | | 65884dbb3bSLinJiawei |----- mux (exception first) -----| Stage3 66884dbb3bSLinJiawei | 67884dbb3bSLinJiawei redirect (send to frontend) 68884dbb3bSLinJiawei */ 69faf3cfa9SLinJiawei def selectOlderRedirect(x: Valid[Redirect], y: Valid[Redirect]): Valid[Redirect] = { 706060732cSLinJiawei Mux(x.valid, 716060732cSLinJiawei Mux(y.valid, 726060732cSLinJiawei Mux(isAfter(x.bits.roqIdx, y.bits.roqIdx), y, x), 736060732cSLinJiawei x 746060732cSLinJiawei ), 756060732cSLinJiawei y 766060732cSLinJiawei ) 77faf3cfa9SLinJiawei } 78aa0e2ba9SLinJiawei def selectOlderExuOutWithFlag(x: Valid[ExuOutput], y: Valid[ExuOutput]): (Valid[ExuOutput], Bool) = { 79aa0e2ba9SLinJiawei val yIsOlder = Mux(x.valid, 806060732cSLinJiawei Mux(y.valid, 81aa0e2ba9SLinJiawei Mux(isAfter(x.bits.redirect.roqIdx, y.bits.redirect.roqIdx), true.B, false.B), 82aa0e2ba9SLinJiawei false.B 836060732cSLinJiawei ), 84aa0e2ba9SLinJiawei true.B 856060732cSLinJiawei ) 86aa0e2ba9SLinJiawei val sel = Mux(yIsOlder, y, x) 87aa0e2ba9SLinJiawei (sel, yIsOlder) 88aa0e2ba9SLinJiawei } 89aa0e2ba9SLinJiawei def selectOlderExuOut(x: Valid[ExuOutput], y: Valid[ExuOutput]): Valid[ExuOutput] = { 90aa0e2ba9SLinJiawei selectOlderExuOutWithFlag(x, y)._1 91faf3cfa9SLinJiawei } 92faf3cfa9SLinJiawei val jumpOut = io.exuMispredict.head 93faf3cfa9SLinJiawei val oldestAluOut = ParallelOperation(io.exuMispredict.tail, selectOlderExuOut) 94aa0e2ba9SLinJiawei val (oldestExuOut, jumpIsOlder) = selectOlderExuOutWithFlag(oldestAluOut, jumpOut) // select between jump and alu 95faf3cfa9SLinJiawei 96faf3cfa9SLinJiawei val oldestMispredict = selectOlderRedirect(io.loadRelay, { 97faf3cfa9SLinJiawei val redirect = Wire(Valid(new Redirect)) 98faf3cfa9SLinJiawei redirect.valid := oldestExuOut.valid 99faf3cfa9SLinJiawei redirect.bits := oldestExuOut.bits.redirect 100faf3cfa9SLinJiawei redirect 101faf3cfa9SLinJiawei }) 102faf3cfa9SLinJiawei 103f7f707b0SLinJiawei XSDebug(oldestExuOut.valid, p"exuMispredict: ${Binary(Cat(io.exuMispredict.map(_.valid)))}\n") 104f7f707b0SLinJiawei 105aa0e2ba9SLinJiawei val s1_isJump = RegNext(jumpIsOlder, init = false.B) 1066060732cSLinJiawei val s1_jumpTarget = RegEnable(jumpOut.bits.redirect.cfiUpdate.target, jumpOut.valid) 107faf3cfa9SLinJiawei val s1_imm12_reg = RegEnable(oldestExuOut.bits.uop.ctrl.imm(11, 0), oldestExuOut.valid) 108faf3cfa9SLinJiawei val s1_pd = RegEnable(oldestExuOut.bits.uop.cf.pd, oldestExuOut.valid) 109faf3cfa9SLinJiawei val s1_redirect_bits_reg = Reg(new Redirect) 110faf3cfa9SLinJiawei val s1_redirect_valid_reg = RegInit(false.B) 111faf3cfa9SLinJiawei 112faf3cfa9SLinJiawei // stage1 -> stage2 1139ed972adSLinJiawei when(oldestMispredict.valid && !oldestMispredict.bits.roqIdx.needFlush(io.stage2Redirect, io.flush)){ 114faf3cfa9SLinJiawei s1_redirect_bits_reg := oldestMispredict.bits 115faf3cfa9SLinJiawei s1_redirect_valid_reg := true.B 116faf3cfa9SLinJiawei }.otherwise({ 117faf3cfa9SLinJiawei s1_redirect_valid_reg := false.B 118faf3cfa9SLinJiawei }) 119faf3cfa9SLinJiawei io.stage2Redirect.valid := s1_redirect_valid_reg 120faf3cfa9SLinJiawei io.stage2Redirect.bits := s1_redirect_bits_reg 121faf3cfa9SLinJiawei io.stage2Redirect.bits.cfiUpdate := DontCare 122faf3cfa9SLinJiawei // at stage2, we read ftq to get pc 123faf3cfa9SLinJiawei io.stage2FtqRead.ptr := s1_redirect_bits_reg.ftqIdx 124faf3cfa9SLinJiawei 125faf3cfa9SLinJiawei // stage3, calculate redirect target 1266060732cSLinJiawei val s2_isJump = RegNext(s1_isJump) 1276060732cSLinJiawei val s2_jumpTarget = RegEnable(s1_jumpTarget, s1_redirect_valid_reg) 128faf3cfa9SLinJiawei val s2_imm12_reg = RegEnable(s1_imm12_reg, s1_redirect_valid_reg) 129faf3cfa9SLinJiawei val s2_pd = RegEnable(s1_pd, s1_redirect_valid_reg) 1306060732cSLinJiawei val s2_redirect_bits_reg = RegEnable(s1_redirect_bits_reg, enable = s1_redirect_valid_reg) 1319ed972adSLinJiawei val s2_redirect_valid_reg = RegNext(s1_redirect_valid_reg && !io.flush, init = false.B) 132faf3cfa9SLinJiawei 133faf3cfa9SLinJiawei val ftqRead = io.stage2FtqRead.entry 134*1670d147SLingrui98 val pc = Cat(ftqRead.ftqPC.head(VAddrBits - s2_redirect_bits_reg.ftqOffset.getWidth - instOffsetBits), 135*1670d147SLingrui98 s2_redirect_bits_reg.ftqOffset, 136*1670d147SLingrui98 0.U(instOffsetBits.W)) 13737e3a7b0SLinJiawei val brTarget = pc + SignExt(ImmUnion.B.toImm32(s2_imm12_reg), XLEN) 1386060732cSLinJiawei val snpc = pc + Mux(s2_pd.isRVC, 2.U, 4.U) 139faf3cfa9SLinJiawei val isReplay = RedirectLevel.flushItself(s2_redirect_bits_reg.level) 140faf3cfa9SLinJiawei val target = Mux(isReplay, 141faf3cfa9SLinJiawei pc, // repaly from itself 1426060732cSLinJiawei Mux(s2_redirect_bits_reg.cfiUpdate.taken, 1436060732cSLinJiawei Mux(s2_isJump, s2_jumpTarget, brTarget), 1446060732cSLinJiawei snpc 145faf3cfa9SLinJiawei ) 146faf3cfa9SLinJiawei ) 147faf3cfa9SLinJiawei io.stage3Redirect.valid := s2_redirect_valid_reg 148faf3cfa9SLinJiawei io.stage3Redirect.bits := s2_redirect_bits_reg 149faf3cfa9SLinJiawei val stage3CfiUpdate = io.stage3Redirect.bits.cfiUpdate 150faf3cfa9SLinJiawei stage3CfiUpdate.pc := pc 151faf3cfa9SLinJiawei stage3CfiUpdate.pd := s2_pd 152faf3cfa9SLinJiawei stage3CfiUpdate.rasSp := ftqRead.rasSp 153faf3cfa9SLinJiawei stage3CfiUpdate.rasEntry := ftqRead.rasTop 154faf3cfa9SLinJiawei stage3CfiUpdate.hist := ftqRead.hist 155faf3cfa9SLinJiawei stage3CfiUpdate.predHist := ftqRead.predHist 156744c623cSLingrui98 stage3CfiUpdate.specCnt := ftqRead.specCnt(s2_redirect_bits_reg.ftqOffset) 157cde9280dSLinJiawei stage3CfiUpdate.predTaken := s2_redirect_bits_reg.cfiUpdate.predTaken 158faf3cfa9SLinJiawei stage3CfiUpdate.sawNotTakenBranch := VecInit((0 until PredictWidth).map{ i => 159744c623cSLingrui98 if(i == 0) false.B else Cat(ftqRead.br_mask.take(i)).orR() 160faf3cfa9SLinJiawei })(s2_redirect_bits_reg.ftqOffset) 161faf3cfa9SLinJiawei stage3CfiUpdate.target := target 162faf3cfa9SLinJiawei stage3CfiUpdate.taken := s2_redirect_bits_reg.cfiUpdate.taken 163faf3cfa9SLinJiawei stage3CfiUpdate.isMisPred := s2_redirect_bits_reg.cfiUpdate.isMisPred 164884dbb3bSLinJiawei} 165884dbb3bSLinJiawei 16621732575SYinan Xuclass CtrlBlock extends XSModule with HasCircularQueuePtrHelper { 1678921b337SYinan Xu val io = IO(new Bundle { 1688921b337SYinan Xu val frontend = Flipped(new FrontendToBackendIO) 1698921b337SYinan Xu val fromIntBlock = Flipped(new IntBlockToCtrlIO) 1708921b337SYinan Xu val fromFpBlock = Flipped(new FpBlockToCtrlIO) 1718921b337SYinan Xu val fromLsBlock = Flipped(new LsBlockToCtrlIO) 1728921b337SYinan Xu val toIntBlock = new CtrlToIntBlockIO 1738921b337SYinan Xu val toFpBlock = new CtrlToFpBlockIO 1748921b337SYinan Xu val toLsBlock = new CtrlToLsBlockIO 1751c2588aaSYinan Xu val roqio = new Bundle { 1761c2588aaSYinan Xu // to int block 1771c2588aaSYinan Xu val toCSR = new RoqCSRIO 1782d7c7105SYinan Xu val exception = ValidIO(new RoqExceptionInfo) 1791c2588aaSYinan Xu // to mem block 18010aac6e7SWilliam Wang val lsq = new RoqLsqIO 1811c2588aaSYinan Xu } 1828921b337SYinan Xu }) 1838921b337SYinan Xu 184a165bd69Swangkaifan val difftestIO = IO(new Bundle() { 185a165bd69Swangkaifan val fromRoq = new Bundle() { 186a165bd69Swangkaifan val commit = Output(UInt(32.W)) 187a165bd69Swangkaifan val thisPC = Output(UInt(XLEN.W)) 188a165bd69Swangkaifan val thisINST = Output(UInt(32.W)) 189a165bd69Swangkaifan val skip = Output(UInt(32.W)) 190a165bd69Swangkaifan val wen = Output(UInt(32.W)) 191a165bd69Swangkaifan val wdata = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6 192a165bd69Swangkaifan val wdst = Output(Vec(CommitWidth, UInt(32.W))) // set difftest width to 6 193a165bd69Swangkaifan val wpc = Output(Vec(CommitWidth, UInt(XLEN.W))) // set difftest width to 6 194a165bd69Swangkaifan val isRVC = Output(UInt(32.W)) 195a165bd69Swangkaifan val scFailed = Output(Bool()) 196a165bd69Swangkaifan } 197a165bd69Swangkaifan }) 198a165bd69Swangkaifan difftestIO <> DontCare 199a165bd69Swangkaifan 200884dbb3bSLinJiawei val ftq = Module(new Ftq) 20154bc08adSwangkaifan val trapIO = IO(new TrapIO()) 20254bc08adSwangkaifan trapIO <> DontCare 20354bc08adSwangkaifan 2048921b337SYinan Xu val decode = Module(new DecodeStage) 2058921b337SYinan Xu val rename = Module(new Rename) 206694b0180SLinJiawei val dispatch = Module(new Dispatch) 2073fae98acSYinan Xu val intBusyTable = Module(new BusyTable(NRIntReadPorts, NRIntWritePorts)) 2083fae98acSYinan Xu val fpBusyTable = Module(new BusyTable(NRFpReadPorts, NRFpWritePorts)) 209884dbb3bSLinJiawei val redirectGen = Module(new RedirectGenerator) 2108921b337SYinan Xu 211884dbb3bSLinJiawei val roqWbSize = NRIntWritePorts + NRFpWritePorts + exuParameters.StuCnt 212694b0180SLinJiawei 213694b0180SLinJiawei val roq = Module(new Roq(roqWbSize)) 2148921b337SYinan Xu 215884dbb3bSLinJiawei val backendRedirect = redirectGen.io.stage2Redirect 216faf3cfa9SLinJiawei val frontendRedirect = redirectGen.io.stage3Redirect 2172d7c7105SYinan Xu val flush = roq.io.flushOut.valid 218faf3cfa9SLinJiawei 219faf3cfa9SLinJiawei redirectGen.io.exuMispredict.zip(io.fromIntBlock.exuRedirect).map({case (x, y) => 220faf3cfa9SLinJiawei x.valid := y.valid && y.bits.redirect.cfiUpdate.isMisPred 221faf3cfa9SLinJiawei x.bits := y.bits 222faf3cfa9SLinJiawei }) 223faf3cfa9SLinJiawei redirectGen.io.loadRelay := io.fromLsBlock.replay 2249ed972adSLinJiawei redirectGen.io.flush := flush 2258921b337SYinan Xu 226884dbb3bSLinJiawei ftq.io.enq <> io.frontend.fetchInfo 227884dbb3bSLinJiawei for(i <- 0 until CommitWidth){ 2286060732cSLinJiawei ftq.io.roq_commits(i).valid := roq.io.commits.valid(i) && !roq.io.commits.isWalk 229884dbb3bSLinJiawei ftq.io.roq_commits(i).bits := roq.io.commits.info(i) 230884dbb3bSLinJiawei } 231884dbb3bSLinJiawei ftq.io.redirect <> backendRedirect 23237459b99SLinJiawei ftq.io.flush := flush 233282a07b1SLinJiawei ftq.io.flushIdx := roq.io.flushOut.bits.ftqIdx 234282a07b1SLinJiawei ftq.io.flushOffset := roq.io.flushOut.bits.ftqOffset 235faf3cfa9SLinJiawei ftq.io.frontendRedirect <> frontendRedirect 236884dbb3bSLinJiawei ftq.io.exuWriteback <> io.fromIntBlock.exuRedirect 237884dbb3bSLinJiawei 23836d7aed5SLinJiawei ftq.io.ftqRead(1) <> redirectGen.io.stage2FtqRead 2399ed972adSLinJiawei ftq.io.ftqRead(2).ptr := roq.io.flushOut.bits.ftqIdx 2409ed972adSLinJiawei val flushPC = GetPcByFtq( 2419ed972adSLinJiawei ftq.io.ftqRead(2).entry.ftqPC, 2429ed972adSLinJiawei RegEnable(roq.io.flushOut.bits.ftqOffset, roq.io.flushOut.valid), 243*1670d147SLingrui98 ftq.io.ftqRead(2).entry.lastPacketPC.valid, 244*1670d147SLingrui98 ftq.io.ftqRead(2).entry.lastPacketPC.bits 2459ed972adSLinJiawei ) 246884dbb3bSLinJiawei 2479ed972adSLinJiawei val flushRedirect = Wire(Valid(new Redirect)) 2489ed972adSLinJiawei flushRedirect.valid := RegNext(flush) 2499ed972adSLinJiawei flushRedirect.bits := DontCare 2509ed972adSLinJiawei flushRedirect.bits.ftqIdx := RegEnable(roq.io.flushOut.bits.ftqIdx, flush) 2519ed972adSLinJiawei flushRedirect.bits.interrupt := true.B 252ac5a5d53SLinJiawei flushRedirect.bits.cfiUpdate.target := Mux(io.roqio.toCSR.isXRet || roq.io.exception.valid, 253ac5a5d53SLinJiawei io.roqio.toCSR.trapTarget, 254ac5a5d53SLinJiawei flushPC + 4.U // flush pipe 2559ed972adSLinJiawei ) 2569ed972adSLinJiawei 2579ed972adSLinJiawei io.frontend.redirect_cfiUpdate := Mux(flushRedirect.valid, flushRedirect, frontendRedirect) 25803380706SLinJiawei io.frontend.commit_cfiUpdate := ftq.io.commit_ftqEntry 259fc4776e4SLinJiawei io.frontend.ftqEnqPtr := ftq.io.enqPtr 260fc4776e4SLinJiawei io.frontend.ftqLeftOne := ftq.io.leftOne 26166bcc42fSYinan Xu 2628921b337SYinan Xu decode.io.in <> io.frontend.cfVec 2638921b337SYinan Xu 264884dbb3bSLinJiawei val jumpInst = dispatch.io.enqIQCtrl(0).bits 2656060732cSLinJiawei val ftqOffsetReg = Reg(UInt(log2Up(PredictWidth).W)) 2666060732cSLinJiawei ftqOffsetReg := jumpInst.cf.ftqOffset 267884dbb3bSLinJiawei ftq.io.ftqRead(0).ptr := jumpInst.cf.ftqPtr // jump 2687aa94463SLinJiawei io.toIntBlock.jumpPc := GetPcByFtq( 269*1670d147SLingrui98 ftq.io.ftqRead(0).entry.ftqPC, ftqOffsetReg, 270*1670d147SLingrui98 ftq.io.ftqRead(0).entry.lastPacketPC.valid, 271*1670d147SLingrui98 ftq.io.ftqRead(0).entry.lastPacketPC.bits 2727aa94463SLinJiawei ) 273148ba860SLinJiawei io.toIntBlock.jalr_target := ftq.io.ftqRead(0).entry.target 2740412e00dSLinJiawei 275b424051cSYinan Xu // pipeline between decode and dispatch 276b424051cSYinan Xu for (i <- 0 until RenameWidth) { 277884dbb3bSLinJiawei PipelineConnect(decode.io.out(i), rename.io.in(i), rename.io.in(i).ready, 278282a07b1SLinJiawei backendRedirect.valid || flush || io.frontend.redirect_cfiUpdate.valid) 279b424051cSYinan Xu } 2808921b337SYinan Xu 281884dbb3bSLinJiawei rename.io.redirect <> backendRedirect 2822d7c7105SYinan Xu rename.io.flush := flush 2838921b337SYinan Xu rename.io.roqCommits <> roq.io.commits 2848921b337SYinan Xu rename.io.out <> dispatch.io.fromRename 28599b8dc2cSYinan Xu rename.io.renameBypass <> dispatch.io.renameBypass 2868921b337SYinan Xu 287884dbb3bSLinJiawei dispatch.io.redirect <> backendRedirect 2882d7c7105SYinan Xu dispatch.io.flush := flush 28921b47d38SYinan Xu dispatch.io.enqRoq <> roq.io.enq 29008fafef0SYinan Xu dispatch.io.enqLsq <> io.toLsBlock.enqLsq 2912bb6eba1SYinan Xu dispatch.io.readIntRf <> io.toIntBlock.readRf 2922bb6eba1SYinan Xu dispatch.io.readFpRf <> io.toFpBlock.readRf 2933fae98acSYinan Xu dispatch.io.allocPregs.zipWithIndex.foreach { case (preg, i) => 2943fae98acSYinan Xu intBusyTable.io.allocPregs(i).valid := preg.isInt 2951c931a03SYinan Xu fpBusyTable.io.allocPregs(i).valid := preg.isFp 2963fae98acSYinan Xu intBusyTable.io.allocPregs(i).bits := preg.preg 2973fae98acSYinan Xu fpBusyTable.io.allocPregs(i).bits := preg.preg 2983fae98acSYinan Xu } 2998921b337SYinan Xu dispatch.io.numExist <> io.fromIntBlock.numExist ++ io.fromFpBlock.numExist ++ io.fromLsBlock.numExist 3002bb6eba1SYinan Xu dispatch.io.enqIQCtrl <> io.toIntBlock.enqIqCtrl ++ io.toFpBlock.enqIqCtrl ++ io.toLsBlock.enqIqCtrl 30176e1d2a4SYikeZhou// dispatch.io.enqIQData <> io.toIntBlock.enqIqData ++ io.toFpBlock.enqIqData ++ io.toLsBlock.enqIqData 3028921b337SYinan Xu 3030412e00dSLinJiawei 3043fae98acSYinan Xu fpBusyTable.io.flush := flush 3053fae98acSYinan Xu intBusyTable.io.flush := flush 3063fae98acSYinan Xu for((wb, setPhyRegRdy) <- io.fromIntBlock.wbRegs.zip(intBusyTable.io.wbPregs)){ 3071e2ad30cSYinan Xu setPhyRegRdy.valid := wb.valid && wb.bits.uop.ctrl.rfWen 3083fae98acSYinan Xu setPhyRegRdy.bits := wb.bits.uop.pdest 3093fae98acSYinan Xu } 3103fae98acSYinan Xu for((wb, setPhyRegRdy) <- io.fromFpBlock.wbRegs.zip(fpBusyTable.io.wbPregs)){ 3113fae98acSYinan Xu setPhyRegRdy.valid := wb.valid && wb.bits.uop.ctrl.fpWen 3123fae98acSYinan Xu setPhyRegRdy.bits := wb.bits.uop.pdest 3133fae98acSYinan Xu } 3148af95560SYinan Xu intBusyTable.io.read <> dispatch.io.readIntState 3158af95560SYinan Xu fpBusyTable.io.read <> dispatch.io.readFpState 3163fae98acSYinan Xu 317884dbb3bSLinJiawei roq.io.redirect <> backendRedirect 318c778d2afSLinJiawei roq.io.exeWbResults.zip( 3190412e00dSLinJiawei io.fromIntBlock.wbRegs ++ io.fromFpBlock.wbRegs ++ io.fromLsBlock.stOut 3200412e00dSLinJiawei ).foreach{ 3210412e00dSLinJiawei case(x, y) => 3220412e00dSLinJiawei x.bits := y.bits 323884dbb3bSLinJiawei x.valid := y.valid 3240412e00dSLinJiawei } 3250412e00dSLinJiawei 326884dbb3bSLinJiawei // TODO: is 'backendRedirect' necesscary? 327884dbb3bSLinJiawei io.toIntBlock.redirect <> backendRedirect 32837459b99SLinJiawei io.toIntBlock.flush <> flush 329884dbb3bSLinJiawei io.toFpBlock.redirect <> backendRedirect 33037459b99SLinJiawei io.toFpBlock.flush <> flush 331884dbb3bSLinJiawei io.toLsBlock.redirect <> backendRedirect 33237459b99SLinJiawei io.toLsBlock.flush <> flush 3330412e00dSLinJiawei 334a165bd69Swangkaifan if (env.DualCoreDifftest) { 335a165bd69Swangkaifan difftestIO.fromRoq <> roq.difftestIO 33654bc08adSwangkaifan trapIO <> roq.trapIO 337a165bd69Swangkaifan } 338a165bd69Swangkaifan 3399916fbd7SYikeZhou dispatch.io.readPortIndex.intIndex <> io.toIntBlock.readPortIndex 3409916fbd7SYikeZhou dispatch.io.readPortIndex.fpIndex <> io.toFpBlock.readPortIndex 3419916fbd7SYikeZhou 3421c2588aaSYinan Xu // roq to int block 3431c2588aaSYinan Xu io.roqio.toCSR <> roq.io.csr 3442d7c7105SYinan Xu io.roqio.exception := roq.io.exception 3459ed972adSLinJiawei io.roqio.exception.bits.uop.cf.pc := flushPC 3461c2588aaSYinan Xu // roq to mem block 34710aac6e7SWilliam Wang io.roqio.lsq <> roq.io.lsq 3488921b337SYinan Xu} 349