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 import scala.reflect.runtime.{universe => ru} 58 59 def getBundleByName(name: String): Valid[CSRBundle] = { 60 val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader) 61 val im = mirror.reflect(this) 62 val classSymbol: ru.ClassSymbol = im.symbol.asClass 63 val fieldSymbol = classSymbol.info.decl(ru.TermName(name)).asTerm 64 val fieldMirror: ru.FieldMirror = mirror.reflect(this).reflectField(fieldSymbol) 65 fieldMirror.get.asInstanceOf[Valid[CSRBundle]] 66 } 67} 68 69trait CSREventBase { 70 val valid = IO(Input(Bool())) 71 val in: Bundle 72 val out: Bundle 73 74 def genTrapVA( 75 transMode: PrivState, 76 satp: SatpBundle, 77 vsatp: SatpBundle, 78 hgatp: HgatpBundle, 79 addr: UInt, 80 ) = { 81 require(addr.getWidth >= 50) 82 83 val isBare = 84 transMode.isModeM || 85 transMode.isModeHSorHU && satp.MODE === SatpMode.Bare || 86 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare 87 val isSv39 = 88 transMode.isModeHSorHU && satp.MODE === SatpMode.Sv39 || 89 transMode.isVirtual && vsatp.MODE === SatpMode.Sv39 90 val isSv48 = 91 transMode.isModeHSorHU && satp.MODE === SatpMode.Sv48 || 92 transMode.isVirtual && vsatp.MODE === SatpMode.Sv48 93 val isSv39x4 = 94 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4 95 val isSv48x4 = 96 transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4 97 98 val bareAddr = ZeroExt(addr(PAddrWidth - 1, 0), XLEN) 99 // When enable virtual memory, the higher bit should fill with the msb of address of Sv39/Sv48/Sv57 100 val sv39Addr = SignExt(addr.take(39), XLEN) 101 val sv39x4Addr = ZeroExt(addr.take(39 + 2), XLEN) 102 val sv48Addr = SignExt(addr.take(48), XLEN) 103 val sv48x4Addr = ZeroExt(addr.take(48 + 2), XLEN) 104 105 val trapAddr = Mux1H(Seq( 106 isBare -> bareAddr, 107 isSv39 -> sv39Addr, 108 isSv39x4 -> sv39x4Addr, 109 isSv48 -> sv48Addr, 110 isSv48x4 -> sv48x4Addr, 111 )) 112 113 trapAddr 114 } 115} 116 117class TrapEntryEventInput(implicit val p: Parameters) extends Bundle with HasXSParameter { 118 val causeNO = Input(new CauseBundle) 119 val trapPc = Input(UInt(VaddrMaxWidth.W)) 120 val trapPcGPA = Input(UInt(GPAddrBits.W)) 121 val trapInst = Input(ValidIO(UInt(InstWidth.W))) 122 val fetchMalTval = Input(UInt(XLEN.W)) 123 val isCrossPageIPF = Input(Bool()) 124 val isHls = Input(Bool()) 125 val isFetchMalAddr = Input(Bool()) 126 val isFetchBkpt = Input(Bool()) 127 val trapIsForVSnonLeafPTE = Input(Bool()) 128 val hasDTExcp = Input(Bool()) 129 130 // always current privilege 131 val iMode = Input(new PrivState()) 132 // take MRPV into consideration 133 val dMode = Input(new PrivState()) 134 // status 135 val privState = Input(new PrivState) 136 val mstatus = Input(new MstatusBundle) 137 val hstatus = Input(new HstatusBundle) 138 val sstatus = Input(new SstatusBundle) 139 val vsstatus = Input(new SstatusBundle) 140 // envcfg 141 val menvcfg = Input(new MEnvCfg) 142 val henvcfg = Input(new HEnvCfg) 143 144 val pcFromXtvec = Input(UInt(XLEN.W)) 145 146 val satp = Input(new SatpBundle) 147 val vsatp = Input(new SatpBundle) 148 val hgatp = Input(new HgatpBundle) 149 // from mem 150 val memExceptionVAddr = Input(UInt(XLEN.W)) 151 val memExceptionGPAddr = Input(UInt(XLEN.W)) 152 val memExceptionIsForVSnonLeafPTE = Input(Bool()) 153 val virtualInterruptIsHvictlInject = Input(Bool()) 154 val hvictlIID = Input(UInt(HIIDWidth.W)) 155} 156 157trait EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 158 protected def addUpdateBundleInCSREnumType(updateBundle: ValidIO[CSRBundle]): Unit = { 159 (reg.asInstanceOf[CSRBundle].getFields zip updateBundle.bits.getFields).foreach { case (sink, source) => 160 if (updateBundle.bits.eventFields.contains(source)) { 161 sink.addOtherUpdate(updateBundle.valid, source) 162 } 163 } 164 } 165} 166 167class TargetPCBundle extends Bundle { 168 val pc = UInt(XLEN.W) 169 val raiseIPF = Bool() 170 val raiseIAF = Bool() 171 val raiseIGPF = Bool() 172 173 def raiseFault = raiseIPF || raiseIAF || raiseIGPF 174} 175