1package xiangshan.backend.fu.NewCSR.CSREvents 2 3import chisel3._ 4import chisel3.util._ 5import org.chipsalliance.cde.config.Parameters 6import utility.{SignExt, ZeroExt} 7import xiangshan.HasXSParameter 8import xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, PrivState} 9import xiangshan.backend.fu.NewCSR.CSRConfig._ 10import xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, SatpMode} 11import xiangshan.backend.fu.NewCSR._ 12 13trait CSREvents { self: NewCSR => 14 val trapEntryDEvent = Module(new TrapEntryDEventModule) 15 16 val trapEntryMEvent = Module(new TrapEntryMEventModule) 17 18 val trapEntryHSEvent = Module(new TrapEntryHSEventModule) 19 20 val trapEntryVSEvent = Module(new TrapEntryVSEventModule) 21 22 val mretEvent = Module(new MretEventModule) 23 24 val sretEvent = Module(new SretEventModule) 25 26 val dretEvent = Module(new DretEventModule) 27 28 val events: Seq[Module with CSREventBase] = Seq( 29 trapEntryDEvent, 30 trapEntryMEvent, 31 trapEntryHSEvent, 32 trapEntryVSEvent, 33 mretEvent, 34 sretEvent, 35 dretEvent, 36 ) 37 38 events.foreach(x => dontTouch(x.out)) 39 40 val trapEntryEvents: Seq[Module with CSREventBase] = Seq( 41 trapEntryDEvent, 42 trapEntryMEvent, 43 trapEntryHSEvent, 44 trapEntryVSEvent, 45 ) 46} 47 48trait EventUpdatePrivStateOutput { 49 val privState = ValidIO(new PrivState) 50} 51 52trait EventOutputBase { 53 def getBundleByName(name: String): Valid[CSRBundle] 54} 55 56trait CSREventBase { 57 val valid = IO(Input(Bool())) 58 val in: Bundle 59 val out: Bundle 60 61 def genTrapVA( 62 transMode: PrivState, 63 satp: SatpBundle, 64 vsatp: SatpBundle, 65 hgatp: HgatpBundle, 66 addr: UInt, 67 ) = { 68 require(addr.getWidth >= 41) 69 70 val isBare = 71 transMode.isModeM || 72 transMode.isModeHSorHU && satp.MODE === SatpMode.Bare || 73 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare 74 val isSv39 = 75 transMode.isModeHSorHU && satp.MODE === SatpMode.Sv39 || 76 transMode.isVirtual && vsatp.MODE === SatpMode.Sv39 77 val isSv48 = 78 transMode.isModeHSorHU && satp.MODE === SatpMode.Sv48 || 79 transMode.isVirtual && vsatp.MODE === SatpMode.Sv48 80 val isSv39x4 = 81 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4 82 val isSv48x4 = 83 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4 84 85 val bareAddr = ZeroExt(addr(PAddrWidth - 1, 0), XLEN) 86 // When enable virtual memory, the higher bit should fill with the msb of address of Sv39/Sv48/Sv57 87 val sv39Addr = SignExt(addr(38, 0), XLEN) 88 val sv39x4Addr = SignExt(addr(40, 0), XLEN) 89 90 val trapAddr = Mux1H(Seq( 91 isBare -> bareAddr, 92 isSv39 -> sv39Addr, 93 isSv39x4 -> sv39x4Addr, 94 )) 95 96 trapAddr 97 } 98} 99 100class TrapEntryEventInput(implicit val p: Parameters) extends Bundle with HasXSParameter { 101 val causeNO = Input(new CauseBundle) 102 val trapPc = Input(UInt(VaddrMaxWidth.W)) 103 val trapPcGPA = Input(UInt(GPAddrBits.W)) 104 val isCrossPageIPF = Input(Bool()) 105 val isHls = Input(Bool()) 106 107 // always current privilege 108 val iMode = Input(new PrivState()) 109 // take MRPV into consideration 110 val dMode = Input(new PrivState()) 111 // status 112 val privState = Input(new PrivState) 113 val mstatus = Input(new MstatusBundle) 114 val hstatus = Input(new HstatusBundle) 115 val sstatus = Input(new SstatusBundle) 116 val vsstatus = Input(new SstatusBundle) 117 118 val tcontrol = Input(new TcontrolBundle) 119 120 val pcFromXtvec = Input(UInt(VaddrMaxWidth.W)) 121 122 val satp = Input(new SatpBundle) 123 val vsatp = Input(new SatpBundle) 124 val hgatp = Input(new HgatpBundle) 125 // from mem 126 val memExceptionVAddr = Input(UInt(VAddrBits.W)) 127 val memExceptionGPAddr = Input(UInt(GPAddrBits.W)) 128} 129