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