1730cfbc0SXuan Hupackage xiangshan.backend.fu.wrapper 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5*a2fa0ad9Sxiaofeibaoimport chisel3.util.log2Up 6730cfbc0SXuan Huimport utility.SignExt 7730cfbc0SXuan Huimport xiangshan.backend.decode.ImmUnion 8c1e19666Sxiaofeibao-xjtuimport xiangshan.backend.fu.{BranchModule, FuConfig, FuncUnit} 9730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.VAddrData 10*a2fa0ad9Sxiaofeibaoimport xiangshan.{RedirectLevel, SelImm, XSModule} 11730cfbc0SXuan Hu 12c1b28b66STang Haojinclass AddrAddModule(implicit p: Parameters) extends XSModule { 13730cfbc0SXuan Hu val io = IO(new Bundle { 14c1b28b66STang Haojin val pc = Input(UInt(VAddrBits.W)) 1554c6d89dSxiaofeibao-xjtu val taken = Input(Bool()) 1654c6d89dSxiaofeibao-xjtu val isRVC = Input(Bool()) 17*a2fa0ad9Sxiaofeibao val imm = Input(UInt(32.W)) // branch inst only support 12 bits immediate num 18c1b28b66STang Haojin val target = Output(UInt(XLEN.W)) 19*a2fa0ad9Sxiaofeibao val nextPcOffset = Input(UInt((log2Up(PredictWidth) + 1).W)) 20730cfbc0SXuan Hu }) 21e6f36bc4Sxiaofeibao val pcExtend = SignExt(io.pc, VAddrBits + 1) 22*a2fa0ad9Sxiaofeibao val immMinWidth = FuConfig.BrhCfg.immType.map(x => SelImm.getImmUnion(x).len).max 23*a2fa0ad9Sxiaofeibao print(s"[Branch]: immMinWidth = $immMinWidth\n") 24e6f36bc4Sxiaofeibao io.target := SignExt(Mux(io.taken, 25*a2fa0ad9Sxiaofeibao pcExtend + SignExt(io.imm(immMinWidth + 2, 0), VAddrBits + 1), 26*a2fa0ad9Sxiaofeibao pcExtend + (io.nextPcOffset << instOffsetBits).asUInt 27c1b28b66STang Haojin ), XLEN) 28730cfbc0SXuan Hu} 29730cfbc0SXuan Hu 30c1e19666Sxiaofeibao-xjtuclass BranchUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) { 31730cfbc0SXuan Hu val dataModule = Module(new BranchModule) 32c1b28b66STang Haojin val addModule = Module(new AddrAddModule) 336a35d972SXuan Hu dataModule.io.src(0) := io.in.bits.data.src(0) // rs1 346a35d972SXuan Hu dataModule.io.src(1) := io.in.bits.data.src(1) // rs2 356a35d972SXuan Hu dataModule.io.func := io.in.bits.ctrl.fuOpType 366a35d972SXuan Hu dataModule.io.pred_taken := io.in.bits.ctrl.predictInfo.get.taken 37730cfbc0SXuan Hu 386a35d972SXuan Hu addModule.io.pc := io.in.bits.data.pc.get // pc 39*a2fa0ad9Sxiaofeibao addModule.io.imm := io.in.bits.data.imm // imm 4054c6d89dSxiaofeibao-xjtu addModule.io.taken := dataModule.io.taken 4154c6d89dSxiaofeibao-xjtu addModule.io.isRVC := io.in.bits.ctrl.preDecode.get.isRVC 42*a2fa0ad9Sxiaofeibao addModule.io.nextPcOffset := io.in.bits.data.nextPcOffset.get 43730cfbc0SXuan Hu 44730cfbc0SXuan Hu io.out.valid := io.in.valid 45730cfbc0SXuan Hu io.in.ready := io.out.ready 46730cfbc0SXuan Hu 476a35d972SXuan Hu io.out.bits.res.data := 0.U 486a35d972SXuan Hu io.out.bits.res.redirect.get match { 496a35d972SXuan Hu case redirect => 506a35d972SXuan Hu redirect.valid := io.out.valid && dataModule.io.mispredict 516a35d972SXuan Hu redirect.bits := 0.U.asTypeOf(io.out.bits.res.redirect.get.bits) 526a35d972SXuan Hu redirect.bits.level := RedirectLevel.flushAfter 536a35d972SXuan Hu redirect.bits.robIdx := io.in.bits.ctrl.robIdx 546a35d972SXuan Hu redirect.bits.ftqIdx := io.in.bits.ctrl.ftqIdx.get 556a35d972SXuan Hu redirect.bits.ftqOffset := io.in.bits.ctrl.ftqOffset.get 56c1b28b66STang Haojin redirect.bits.fullTarget := addModule.io.target 576a35d972SXuan Hu redirect.bits.cfiUpdate.isMisPred := dataModule.io.mispredict 586a35d972SXuan Hu redirect.bits.cfiUpdate.taken := dataModule.io.taken 596a35d972SXuan Hu redirect.bits.cfiUpdate.predTaken := dataModule.io.pred_taken 606a35d972SXuan Hu redirect.bits.cfiUpdate.target := addModule.io.target 6154c6d89dSxiaofeibao-xjtu redirect.bits.cfiUpdate.pc := io.in.bits.data.pc.get 62c1b28b66STang Haojin redirect.bits.cfiUpdate.backendIAF := io.instrAddrTransType.get.checkAccessFault(addModule.io.target) 63c1b28b66STang Haojin redirect.bits.cfiUpdate.backendIPF := io.instrAddrTransType.get.checkPageFault(addModule.io.target) 64c1b28b66STang Haojin redirect.bits.cfiUpdate.backendIGPF := io.instrAddrTransType.get.checkGuestPageFault(addModule.io.target) 656a35d972SXuan Hu } 66c1e19666Sxiaofeibao-xjtu connect0LatencyCtrlSingal 67730cfbc0SXuan Hu} 68