1package xiangshan.backend.fu.wrapper 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import fudian.SignExt 6import xiangshan.RedirectLevel 7import xiangshan.backend.fu.{FuConfig, FuncUnit, JumpDataModule, PipedFuncUnit} 8import xiangshan.backend.datapath.DataConfig.VAddrData 9 10 11class JumpUnit(cfg: FuConfig)(implicit p: Parameters) extends PipedFuncUnit(cfg) { 12 private val jumpDataModule = Module(new JumpDataModule) 13 14 private val flushed = io.in.bits.ctrl.robIdx.needFlush(io.flush) 15 16 // associated with AddrData's position of JmpCfg.srcData 17 private val src = io.in.bits.data.src(0) 18 private val pc = SignExt(io.in.bits.data.pc.get, cfg.destDataBits) 19 private val imm = io.in.bits.data.imm 20 private val func = io.in.bits.ctrl.fuOpType 21 private val isRVC = io.in.bits.ctrl.preDecode.get.isRVC 22 23 jumpDataModule.io.src := src 24 jumpDataModule.io.pc := pc 25 jumpDataModule.io.imm := imm 26 jumpDataModule.io.nextPcOffset := io.in.bits.data.nextPcOffset.get 27 jumpDataModule.io.func := func 28 jumpDataModule.io.isRVC := isRVC 29 30 val jmpTarget = io.in.bits.ctrl.predictInfo.get.target 31 val predTaken = io.in.bits.ctrl.predictInfo.get.taken 32 33 val redirect = io.out.bits.res.redirect.get.bits 34 val redirectValid = io.out.bits.res.redirect.get.valid 35 redirectValid := io.in.valid && !jumpDataModule.io.isAuipc 36 redirect := 0.U.asTypeOf(redirect) 37 redirect.level := RedirectLevel.flushAfter 38 redirect.robIdx := io.in.bits.ctrl.robIdx 39 redirect.ftqIdx := io.in.bits.ctrl.ftqIdx.get 40 redirect.ftqOffset := io.in.bits.ctrl.ftqOffset.get 41 redirect.fullTarget := jumpDataModule.io.target 42 redirect.cfiUpdate.predTaken := true.B 43 redirect.cfiUpdate.taken := true.B 44 redirect.cfiUpdate.target := jumpDataModule.io.target 45 redirect.cfiUpdate.pc := io.in.bits.data.pc.get 46 redirect.cfiUpdate.isMisPred := jumpDataModule.io.target(VAddrData().dataWidth - 1, 0) =/= jmpTarget || !predTaken 47 redirect.cfiUpdate.backendIAF := io.instrAddrTransType.get.checkAccessFault(jumpDataModule.io.target) 48 redirect.cfiUpdate.backendIPF := io.instrAddrTransType.get.checkPageFault(jumpDataModule.io.target) 49 redirect.cfiUpdate.backendIGPF := io.instrAddrTransType.get.checkGuestPageFault(jumpDataModule.io.target) 50// redirect.debug_runahead_checkpoint_id := uop.debugInfo.runahead_checkpoint_id // Todo: assign it 51 52 io.in.ready := io.out.ready 53 io.out.valid := io.in.valid 54 io.out.bits.res.data := jumpDataModule.io.result 55 connect0LatencyCtrlSingal 56} 57