1c2a2229dSlewislzhpackage xiangshan.backend.fu.NewCSR.CSREvents 2c2a2229dSlewislzh 3c2a2229dSlewislzhimport chisel3._ 4c2a2229dSlewislzhimport chisel3.util._ 5c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters 6c2a2229dSlewislzhimport utility.{SignExt, ZeroExt} 7c2a2229dSlewislzhimport xiangshan.ExceptionNO 8c2a2229dSlewislzhimport xiangshan.ExceptionNO._ 9c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState} 10c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN} 11c1b28b66STang Haojinimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, PrivMode, SatpMode, VirtMode} 12c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR._ 13c1b28b66STang Haojinimport xiangshan.AddrTransType 14c2a2229dSlewislzh 15c2a2229dSlewislzh 16c2a2229dSlewislzhclass MNretEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase { 17c2a2229dSlewislzh val mnstatus = ValidIO((new MnstatusBundle).addInEvent(_.MNPP, _.MNPV, _.NMIE)) 186808b803SZehao Liu val mstatus = ValidIO((new MstatusBundle).addInEvent(_.MPRV, _.MDT, _.SDT)) 196808b803SZehao Liu val vsstatus = ValidIO((new SstatusBundle).addInEvent(_.SDT)) 20c1b28b66STang Haojin val targetPc = ValidIO(new TargetPCBundle) 21c2a2229dSlewislzh} 22c2a2229dSlewislzh 23c2a2229dSlewislzhclass MNretEventInput extends Bundle { 24c2a2229dSlewislzh val mnstatus = Input(new MnstatusBundle) 25c2a2229dSlewislzh val mstatus = Input(new MstatusBundle) 26c2a2229dSlewislzh val mnepc = Input(new Epc()) 27c1b28b66STang Haojin val satp = Input(new SatpBundle) 28c1b28b66STang Haojin val vsatp = Input(new SatpBundle) 29c1b28b66STang Haojin val hgatp = Input(new HgatpBundle) 306808b803SZehao Liu val vsstatus = Input(new SstatusBundle) 31c2a2229dSlewislzh} 32c2a2229dSlewislzh 33c1b28b66STang Haojinclass MNretEventModule(implicit p: Parameters) extends Module with CSREventBase { 34c2a2229dSlewislzh val in = IO(new MNretEventInput) 35c2a2229dSlewislzh val out = IO(new MNretEventOutput) 36c2a2229dSlewislzh 37c1b28b66STang Haojin private val satp = in.satp 38c1b28b66STang Haojin private val vsatp = in.vsatp 39c1b28b66STang Haojin private val hgatp = in.hgatp 40c1b28b66STang Haojin private val nextPrivState = out.privState.bits 41c1b28b66STang Haojin 42c1b28b66STang Haojin private val instrAddrTransType = AddrTransType( 43c1b28b66STang Haojin bare = nextPrivState.isModeM || 44c1b28b66STang Haojin (!nextPrivState.isVirtual && satp.MODE === SatpMode.Bare) || 45c1b28b66STang Haojin (nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare), 46c1b28b66STang Haojin sv39 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv39 || 47c1b28b66STang Haojin nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv39, 48c1b28b66STang Haojin sv48 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv48 || 49c1b28b66STang Haojin nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv48, 50c1b28b66STang Haojin sv39x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4, 51c1b28b66STang Haojin sv48x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4 52c1b28b66STang Haojin ) 53c1b28b66STang Haojin 546808b803SZehao Liu val outPrivState = Wire(new PrivState) 556808b803SZehao Liu outPrivState.PRVM := in.mnstatus.MNPP 566808b803SZehao Liu outPrivState.V := Mux(in.mnstatus.MNPP === PrivMode.M, VirtMode.Off.asUInt, in.mnstatus.MNPV.asUInt) 576808b803SZehao Liu 586808b803SZehao Liu val mnretToM = outPrivState.isModeM 596808b803SZehao Liu val mnretToS = outPrivState.isModeHS 606808b803SZehao Liu val mnretToVU = outPrivState.isModeVU 616808b803SZehao Liu 62c2a2229dSlewislzh out := DontCare 63c2a2229dSlewislzh 64c2a2229dSlewislzh out.privState.valid := valid 65c2a2229dSlewislzh out.mnstatus .valid := valid 66*26d03c88SZehao Liu out.mstatus .valid := valid 67*26d03c88SZehao Liu out.vsstatus .valid := valid 68c2a2229dSlewislzh out.targetPc .valid := valid 69c2a2229dSlewislzh 706808b803SZehao Liu out.privState.bits := outPrivState 71c2a2229dSlewislzh out.mnstatus.bits.MNPP := PrivMode.U 72c2a2229dSlewislzh out.mnstatus.bits.MNPV := VirtMode.Off.asUInt 73c2a2229dSlewislzh out.mnstatus.bits.NMIE := 1.U 74c2a2229dSlewislzh out.mstatus.bits.MPRV := Mux(in.mnstatus.MNPP =/= PrivMode.M, 0.U, in.mstatus.MPRV.asUInt) 756808b803SZehao Liu // clear MDT when mnret to below M 766808b803SZehao Liu out.mstatus.bits.MDT := Mux(mnretToM, in.mstatus.MDT.asBool, 0.U) 776808b803SZehao Liu out.mstatus.bits.SDT := Mux(mnretToM || mnretToS, in.mstatus.SDT.asBool, 0.U) 786808b803SZehao Liu out.vsstatus.bits.SDT := Mux(mnretToVU, 0.U, in.vsstatus.SDT.asBool) 79c1b28b66STang Haojin out.targetPc.bits.pc := in.mnepc.asUInt 80c1b28b66STang Haojin out.targetPc.bits.raiseIPF := instrAddrTransType.checkPageFault(in.mnepc.asUInt) 81c1b28b66STang Haojin out.targetPc.bits.raiseIAF := instrAddrTransType.checkAccessFault(in.mnepc.asUInt) 82c1b28b66STang Haojin out.targetPc.bits.raiseIGPF := instrAddrTransType.checkGuestPageFault(in.mnepc.asUInt) 83c2a2229dSlewislzh} 84c2a2229dSlewislzh 85cb36ac0fSXuan Hutrait MNretEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 86c2a2229dSlewislzh val retFromMN = IO(Flipped(new MNretEventOutput)) 87c2a2229dSlewislzh 88cb36ac0fSXuan Hu addUpdateBundleInCSREnumType(retFromMN.getBundleByName(self.modName.toLowerCase())) 89c2a2229dSlewislzh 90cb36ac0fSXuan Hu reconnectReg() 91c2a2229dSlewislzh}