1c2a2229dSlewislzhpackage xiangshan.backend.fu.NewCSR.CSREvents 2c2a2229dSlewislzh 3c2a2229dSlewislzhimport chisel3._ 4c2a2229dSlewislzhimport chisel3.util._ 5c2a2229dSlewislzhimport org.chipsalliance.cde.config.Parameters 6c2a2229dSlewislzhimport utility.SignExt 7c2a2229dSlewislzhimport xiangshan.ExceptionNO 8c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState} 9c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN} 10c2a2229dSlewislzhimport xiangshan.backend.fu.NewCSR._ 11c1b28b66STang Haojinimport xiangshan.AddrTransType 12c2a2229dSlewislzh 13c2a2229dSlewislzhclass TrapEntryMNEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase { 14c2a2229dSlewislzh val mnstatus = ValidIO((new MnstatusBundle ).addInEvent(_.MNPP, _.MNPV, _.NMIE)) 15c2a2229dSlewislzh val mnepc = ValidIO((new Epc ).addInEvent(_.epc)) 16c2a2229dSlewislzh val mncause = ValidIO((new CauseBundle ).addInEvent(_.Interrupt, _.ExceptionCode)) 17c1b28b66STang Haojin val targetPc = ValidIO(new TargetPCBundle) 18c2a2229dSlewislzh} 19c2a2229dSlewislzh 20c2a2229dSlewislzhclass TrapEntryMNEventModule(implicit val p: Parameters) extends Module with CSREventBase { 21c2a2229dSlewislzh val in = IO(new TrapEntryEventInput) 22c2a2229dSlewislzh val out = IO(new TrapEntryMNEventOutput) 23c2a2229dSlewislzh 24c2a2229dSlewislzh private val current = in 25c2a2229dSlewislzh private val iMode = current.iMode 26c2a2229dSlewislzh private val satp = current.satp 27c2a2229dSlewislzh private val vsatp = current.vsatp 28c2a2229dSlewislzh private val hgatp = current.hgatp 29c2a2229dSlewislzh 30c2a2229dSlewislzh private val highPrioTrapNO = in.causeNO.ExceptionCode.asUInt 31c2a2229dSlewislzh private val isInterrupt = in.causeNO.Interrupt.asBool 32c2a2229dSlewislzh 33c1b28b66STang Haojin private val isFetchMalAddr = in.isFetchMalAddr 34c1b28b66STang Haojin 35c2a2229dSlewislzh private val trapPC = genTrapVA( 36c2a2229dSlewislzh iMode, 37c2a2229dSlewislzh satp, 38c2a2229dSlewislzh vsatp, 39c2a2229dSlewislzh hgatp, 40c2a2229dSlewislzh in.trapPc, 41c2a2229dSlewislzh ) 42c2a2229dSlewislzh out := DontCare 43c2a2229dSlewislzh 44c2a2229dSlewislzh out.privState.valid := valid 45c2a2229dSlewislzh out.mnstatus.valid := valid 46c2a2229dSlewislzh out.mnepc.valid := valid 47c2a2229dSlewislzh out.mncause.valid := valid 48c2a2229dSlewislzh out.targetPc.valid := valid 49c2a2229dSlewislzh 50c2a2229dSlewislzh out.privState.bits := PrivState.ModeM 51c2a2229dSlewislzh out.mnstatus.bits.MNPP := current.privState.PRVM 52c2a2229dSlewislzh out.mnstatus.bits.MNPV := current.privState.V 53c2a2229dSlewislzh out.mnstatus.bits.NMIE := 0.U 54c1b28b66STang Haojin out.mnepc.bits.epc := Mux(isFetchMalAddr, in.fetchMalTval(63, 1), trapPC(63, 1)) 55c2a2229dSlewislzh out.mncause.bits.Interrupt := isInterrupt 56c2a2229dSlewislzh out.mncause.bits.ExceptionCode := highPrioTrapNO 57c1b28b66STang Haojin out.targetPc.bits.pc := in.pcFromXtvec 58c1b28b66STang Haojin out.targetPc.bits.raiseIPF := false.B 59c1b28b66STang Haojin out.targetPc.bits.raiseIAF := AddrTransType(bare = true).checkAccessFault(in.pcFromXtvec) 60c1b28b66STang Haojin out.targetPc.bits.raiseIGPF := false.B 61c2a2229dSlewislzh 62c2a2229dSlewislzh} 63c2a2229dSlewislzh 64*cb36ac0fSXuan Hutrait TrapEntryMNEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 65c2a2229dSlewislzh val trapToMN = IO(Flipped(new TrapEntryMNEventOutput)) 66c2a2229dSlewislzh 67*cb36ac0fSXuan Hu addUpdateBundleInCSREnumType(trapToMN.getBundleByName(self.modName.toLowerCase())) 68c2a2229dSlewislzh 69*cb36ac0fSXuan Hu reconnectReg() 70c2a2229dSlewislzh} 71