11e7040baSsinceforYypackage xiangshan.backend.fu.NewCSR.CSREvents 21e7040baSsinceforYy 31e7040baSsinceforYyimport chisel3._ 41e7040baSsinceforYyimport chisel3.util._ 5c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters 61e7040baSsinceforYyimport xiangshan.backend.fu.NewCSR.CSRConfig.VaddrMaxWidth 7b6cec436SGuanghui Chengimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, PrivMode, SatpMode, VirtMode} 81e7040baSsinceforYyimport xiangshan.backend.fu.NewCSR._ 9c1b28b66STang Haojinimport xiangshan.AddrTransType 101e7040baSsinceforYy 111e7040baSsinceforYy 121e7040baSsinceforYyclass DretEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase { 131e7040baSsinceforYy val dcsr = ValidIO((new DcsrBundle).addInEvent(_.V, _.PRV)) 14*e50a46eaSGuanghui Cheng val mstatus = ValidIO((new MstatusBundle).addInEvent(_.MPRV, _.MDT, _.SDT)) 15*e50a46eaSGuanghui Cheng val vsstatus = ValidIO((new SstatusBundle).addInEvent(_.SDT)) 166057352aSXuan Hu val debugMode = ValidIO(Bool()) 17a7a6d0a6Schengguanghui val debugIntrEnable = ValidIO(Bool()) 18c1b28b66STang Haojin val targetPc = ValidIO(new TargetPCBundle) 191e7040baSsinceforYy} 201e7040baSsinceforYy 211e7040baSsinceforYyclass DretEventInput extends Bundle { 221e7040baSsinceforYy val dcsr = Input(new DcsrBundle) 230f9a14c6Schengguanghui val dpc = Input(new Epc) 241e7040baSsinceforYy val mstatus = Input(new MstatusBundle) 25*e50a46eaSGuanghui Cheng val vsstatus = Input(new SstatusBundle) 26c1b28b66STang Haojin val satp = Input(new SatpBundle) 27c1b28b66STang Haojin val vsatp = Input(new SatpBundle) 28c1b28b66STang Haojin val hgatp = Input(new HgatpBundle) 291e7040baSsinceforYy} 301e7040baSsinceforYy 31c1b28b66STang Haojinclass DretEventModule(implicit p: Parameters) extends Module with CSREventBase { 321e7040baSsinceforYy val in = IO(new DretEventInput) 331e7040baSsinceforYy val out = IO(new DretEventOutput) 341e7040baSsinceforYy 35c1b28b66STang Haojin private val satp = in.satp 36c1b28b66STang Haojin private val vsatp = in.vsatp 37c1b28b66STang Haojin private val hgatp = in.hgatp 38c1b28b66STang Haojin private val nextPrivState = out.privState.bits 39c1b28b66STang Haojin 40c1b28b66STang Haojin private val instrAddrTransType = AddrTransType( 41c1b28b66STang Haojin bare = nextPrivState.isModeM || 42c1b28b66STang Haojin (!nextPrivState.isVirtual && satp.MODE === SatpMode.Bare) || 43c1b28b66STang Haojin (nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare), 44c1b28b66STang Haojin sv39 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv39 || 45c1b28b66STang Haojin nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv39, 46c1b28b66STang Haojin sv48 = !nextPrivState.isModeM && !nextPrivState.isVirtual && satp.MODE === SatpMode.Sv48 || 47c1b28b66STang Haojin nextPrivState.isVirtual && vsatp.MODE === SatpMode.Sv48, 48c1b28b66STang Haojin sv39x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4, 49c1b28b66STang Haojin sv48x4 = nextPrivState.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4 50c1b28b66STang Haojin ) 51c1b28b66STang Haojin 521e7040baSsinceforYy out := DontCare 531e7040baSsinceforYy 546057352aSXuan Hu out.debugMode.valid := valid 551e7040baSsinceforYy out.privState.valid := valid 561e7040baSsinceforYy out.dcsr.valid := valid 571e7040baSsinceforYy out.mstatus.valid := valid 58*e50a46eaSGuanghui Cheng out.vsstatus.valid := valid 59a7a6d0a6Schengguanghui out.debugIntrEnable.valid := valid 601e7040baSsinceforYy out.targetPc.valid := valid 611e7040baSsinceforYy 6294c2cc17SsinceforYy out.privState.bits.PRVM := in.dcsr.PRV.asUInt 63b6cec436SGuanghui Cheng out.privState.bits.V := Mux(in.dcsr.PRV === PrivMode.M, VirtMode.Off.asUInt, in.dcsr.V.asUInt) 641734111cSchengguanghui out.mstatus.bits.MPRV := Mux(!out.privState.bits.isModeM, 0.U, in.mstatus.MPRV.asUInt) 65*e50a46eaSGuanghui Cheng out.mstatus.bits.MDT := Mux(!out.privState.bits.isModeM, 0.U, in.mstatus.MDT.asBool) 66*e50a46eaSGuanghui Cheng out.mstatus.bits.SDT := Mux(out.privState.bits.isVirtual || out.privState.bits.isModeHU, 0.U, in.mstatus.SDT.asBool) 67*e50a46eaSGuanghui Cheng out.vsstatus.bits.SDT := Mux(out.privState.bits.isModeVU, 0.U, in.vsstatus.SDT.asBool) 688419d406SXuan Hu out.debugMode.bits := false.B 69a7a6d0a6Schengguanghui out.debugIntrEnable.bits := true.B 70c1b28b66STang Haojin out.targetPc.bits.pc := in.dpc.asUInt 71c1b28b66STang Haojin out.targetPc.bits.raiseIPF := instrAddrTransType.checkPageFault(in.dpc.asUInt) 72c1b28b66STang Haojin out.targetPc.bits.raiseIAF := instrAddrTransType.checkAccessFault(in.dpc.asUInt) 73c1b28b66STang Haojin out.targetPc.bits.raiseIGPF := instrAddrTransType.checkGuestPageFault(in.dpc.asUInt) 741e7040baSsinceforYy} 751e7040baSsinceforYy 76cb36ac0fSXuan Hutrait DretEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 771e7040baSsinceforYy val retFromD = IO(Flipped(new DretEventOutput)) 781e7040baSsinceforYy 79cb36ac0fSXuan Hu addUpdateBundleInCSREnumType(retFromD.getBundleByName(self.modName.toLowerCase())) 801e7040baSsinceforYy 81cb36ac0fSXuan Hu reconnectReg() 821e7040baSsinceforYy} 83