1237d4cfdSXuan Hupackage xiangshan.backend.fu.NewCSR.CSREvents 2237d4cfdSXuan Hu 3237d4cfdSXuan Huimport chisel3._ 4237d4cfdSXuan Huimport chisel3.util._ 5237d4cfdSXuan Huimport org.chipsalliance.cde.config.Parameters 6237d4cfdSXuan Huimport utility.{SignExt, ZeroExt} 7260a087dSXuan Huimport xiangshan.HasXSParameter 80c2ba7aeSXuan Huimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, PrivState} 9237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig._ 10260a087dSXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{HgatpMode, SatpMode} 11237d4cfdSXuan Huimport xiangshan.backend.fu.NewCSR._ 12237d4cfdSXuan Hu 13237d4cfdSXuan Hutrait CSREvents { self: NewCSR => 14a7a6d0a6Schengguanghui val trapEntryDEvent = Module(new TrapEntryDEventModule) 15a7a6d0a6Schengguanghui 16237d4cfdSXuan Hu val trapEntryMEvent = Module(new TrapEntryMEventModule) 17237d4cfdSXuan Hu 18c2a2229dSlewislzh val trapEntryMNEvent = Module(new TrapEntryMNEventModule()) 19c2a2229dSlewislzh 20237d4cfdSXuan Hu val trapEntryHSEvent = Module(new TrapEntryHSEventModule) 21237d4cfdSXuan Hu 22237d4cfdSXuan Hu val trapEntryVSEvent = Module(new TrapEntryVSEventModule) 23237d4cfdSXuan Hu 24237d4cfdSXuan Hu val mretEvent = Module(new MretEventModule) 25237d4cfdSXuan Hu 26c2a2229dSlewislzh val mnretEvent = Module(new MNretEventModule) 27c2a2229dSlewislzh 28237d4cfdSXuan Hu val sretEvent = Module(new SretEventModule) 29237d4cfdSXuan Hu 301e7040baSsinceforYy val dretEvent = Module(new DretEventModule) 311e7040baSsinceforYy 32237d4cfdSXuan Hu val events: Seq[Module with CSREventBase] = Seq( 33a7a6d0a6Schengguanghui trapEntryDEvent, 34237d4cfdSXuan Hu trapEntryMEvent, 35237d4cfdSXuan Hu trapEntryHSEvent, 36237d4cfdSXuan Hu trapEntryVSEvent, 3726d03c88SZehao Liu trapEntryMNEvent, 38237d4cfdSXuan Hu mretEvent, 39237d4cfdSXuan Hu sretEvent, 401e7040baSsinceforYy dretEvent, 4126d03c88SZehao Liu mnretEvent, 42237d4cfdSXuan Hu ) 43237d4cfdSXuan Hu 44237d4cfdSXuan Hu events.foreach(x => dontTouch(x.out)) 45237d4cfdSXuan Hu 46237d4cfdSXuan Hu val trapEntryEvents: Seq[Module with CSREventBase] = Seq( 47a7a6d0a6Schengguanghui trapEntryDEvent, 48237d4cfdSXuan Hu trapEntryMEvent, 49237d4cfdSXuan Hu trapEntryHSEvent, 50237d4cfdSXuan Hu trapEntryVSEvent, 51237d4cfdSXuan Hu ) 52237d4cfdSXuan Hu} 53237d4cfdSXuan Hu 54237d4cfdSXuan Hutrait EventUpdatePrivStateOutput { 55237d4cfdSXuan Hu val privState = ValidIO(new PrivState) 56237d4cfdSXuan Hu} 57237d4cfdSXuan Hu 58237d4cfdSXuan Hutrait EventOutputBase { 59cb36ac0fSXuan Hu import scala.reflect.runtime.{universe => ru} 60cb36ac0fSXuan Hu 61cb36ac0fSXuan Hu def getBundleByName(name: String): Valid[CSRBundle] = { 62cb36ac0fSXuan Hu val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader) 63cb36ac0fSXuan Hu val im = mirror.reflect(this) 64cb36ac0fSXuan Hu val classSymbol: ru.ClassSymbol = im.symbol.asClass 65cb36ac0fSXuan Hu val fieldSymbol = classSymbol.info.decl(ru.TermName(name)).asTerm 66cb36ac0fSXuan Hu val fieldMirror: ru.FieldMirror = mirror.reflect(this).reflectField(fieldSymbol) 67cb36ac0fSXuan Hu fieldMirror.get.asInstanceOf[Valid[CSRBundle]] 68cb36ac0fSXuan Hu } 69237d4cfdSXuan Hu} 70237d4cfdSXuan Hu 71237d4cfdSXuan Hutrait CSREventBase { 72237d4cfdSXuan Hu val valid = IO(Input(Bool())) 73237d4cfdSXuan Hu val in: Bundle 74237d4cfdSXuan Hu val out: Bundle 75260a087dSXuan Hu 76260a087dSXuan Hu def genTrapVA( 77260a087dSXuan Hu transMode: PrivState, 78260a087dSXuan Hu satp: SatpBundle, 79260a087dSXuan Hu vsatp: SatpBundle, 80260a087dSXuan Hu hgatp: HgatpBundle, 81260a087dSXuan Hu addr: UInt, 82260a087dSXuan Hu ) = { 833ea4388cSHaoyuan Feng require(addr.getWidth >= 50) 84260a087dSXuan Hu 85260a087dSXuan Hu val isBare = 86260a087dSXuan Hu transMode.isModeM || 87260a087dSXuan Hu transMode.isModeHSorHU && satp.MODE === SatpMode.Bare || 88260a087dSXuan Hu transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Bare 89260a087dSXuan Hu val isSv39 = 90260a087dSXuan Hu transMode.isModeHSorHU && satp.MODE === SatpMode.Sv39 || 91260a087dSXuan Hu transMode.isVirtual && vsatp.MODE === SatpMode.Sv39 92260a087dSXuan Hu val isSv48 = 93260a087dSXuan Hu transMode.isModeHSorHU && satp.MODE === SatpMode.Sv48 || 94260a087dSXuan Hu transMode.isVirtual && vsatp.MODE === SatpMode.Sv48 95260a087dSXuan Hu val isSv39x4 = 96260a087dSXuan Hu transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv39x4 97260a087dSXuan Hu val isSv48x4 = 98260a087dSXuan Hu transMode.isVirtual && vsatp.MODE === SatpMode.Bare && hgatp.MODE === HgatpMode.Sv48x4 99260a087dSXuan Hu 100260a087dSXuan Hu val bareAddr = ZeroExt(addr(PAddrWidth - 1, 0), XLEN) 101260a087dSXuan Hu // When enable virtual memory, the higher bit should fill with the msb of address of Sv39/Sv48/Sv57 1023ea4388cSHaoyuan Feng val sv39Addr = SignExt(addr.take(39), XLEN) 1033ea4388cSHaoyuan Feng val sv39x4Addr = ZeroExt(addr.take(39 + 2), XLEN) 1043ea4388cSHaoyuan Feng val sv48Addr = SignExt(addr.take(48), XLEN) 1053ea4388cSHaoyuan Feng val sv48x4Addr = ZeroExt(addr.take(48 + 2), XLEN) 106260a087dSXuan Hu 107260a087dSXuan Hu val trapAddr = Mux1H(Seq( 108260a087dSXuan Hu isBare -> bareAddr, 109260a087dSXuan Hu isSv39 -> sv39Addr, 110260a087dSXuan Hu isSv39x4 -> sv39x4Addr, 1113ea4388cSHaoyuan Feng isSv48 -> sv48Addr, 1123ea4388cSHaoyuan Feng isSv48x4 -> sv48x4Addr, 113260a087dSXuan Hu )) 114260a087dSXuan Hu 115260a087dSXuan Hu trapAddr 116260a087dSXuan Hu } 117237d4cfdSXuan Hu} 118237d4cfdSXuan Hu 119237d4cfdSXuan Huclass TrapEntryEventInput(implicit val p: Parameters) extends Bundle with HasXSParameter { 120237d4cfdSXuan Hu val causeNO = Input(new CauseBundle) 121237d4cfdSXuan Hu val trapPc = Input(UInt(VaddrMaxWidth.W)) 122dd980d61SXu, Zefan val trapPcGPA = Input(UInt(PAddrBitsMax.W)) 12392c61038SXuan Hu val trapInst = Input(ValidIO(UInt(InstWidth.W))) 124c1b28b66STang Haojin val fetchMalTval = Input(UInt(XLEN.W)) 125237d4cfdSXuan Hu val isCrossPageIPF = Input(Bool()) 126f60da58cSXuan Hu val isHls = Input(Bool()) 127c1b28b66STang Haojin val isFetchMalAddr = Input(Bool()) 128fe52823cSXuan Hu val isFetchBkpt = Input(Bool()) 129ad415ae0SXiaokun-Pei val trapIsForVSnonLeafPTE = Input(Bool()) 1306808b803SZehao Liu val hasDTExcp = Input(Bool()) 131237d4cfdSXuan Hu 132237d4cfdSXuan Hu // always current privilege 133237d4cfdSXuan Hu val iMode = Input(new PrivState()) 134237d4cfdSXuan Hu // take MRPV into consideration 135237d4cfdSXuan Hu val dMode = Input(new PrivState()) 136237d4cfdSXuan Hu // status 137237d4cfdSXuan Hu val privState = Input(new PrivState) 138237d4cfdSXuan Hu val mstatus = Input(new MstatusBundle) 139237d4cfdSXuan Hu val hstatus = Input(new HstatusBundle) 140237d4cfdSXuan Hu val sstatus = Input(new SstatusBundle) 141237d4cfdSXuan Hu val vsstatus = Input(new SstatusBundle) 1426808b803SZehao Liu // envcfg 1436808b803SZehao Liu val menvcfg = Input(new MEnvCfg) 1446808b803SZehao Liu val henvcfg = Input(new HEnvCfg) 1450c2ba7aeSXuan Hu 146c1b28b66STang Haojin val pcFromXtvec = Input(UInt(XLEN.W)) 1470c2ba7aeSXuan Hu 148237d4cfdSXuan Hu val satp = Input(new SatpBundle) 149237d4cfdSXuan Hu val vsatp = Input(new SatpBundle) 150260a087dSXuan Hu val hgatp = Input(new HgatpBundle) 151*8882eb68SXin Tian val mbmc = Input(new MbmcBundle) 152237d4cfdSXuan Hu // from mem 153db6cfb5aSHaoyuan Feng val memExceptionVAddr = Input(UInt(XLEN.W)) 154db6cfb5aSHaoyuan Feng val memExceptionGPAddr = Input(UInt(XLEN.W)) 155ad415ae0SXiaokun-Pei val memExceptionIsForVSnonLeafPTE = Input(Bool()) 1569205730dSsinceforYy val virtualInterruptIsHvictlInject = Input(Bool()) 1579205730dSsinceforYy val hvictlIID = Input(UInt(HIIDWidth.W)) 158237d4cfdSXuan Hu} 159c1b28b66STang Haojin 160cb36ac0fSXuan Hutrait EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 161cb36ac0fSXuan Hu protected def addUpdateBundleInCSREnumType(updateBundle: ValidIO[CSRBundle]): Unit = { 162cb36ac0fSXuan Hu (reg.asInstanceOf[CSRBundle].getFields zip updateBundle.bits.getFields).foreach { case (sink, source) => 163cb36ac0fSXuan Hu if (updateBundle.bits.eventFields.contains(source)) { 164cb36ac0fSXuan Hu sink.addOtherUpdate(updateBundle.valid, source) 165cb36ac0fSXuan Hu } 166cb36ac0fSXuan Hu } 167cb36ac0fSXuan Hu } 168cb36ac0fSXuan Hu} 169cb36ac0fSXuan Hu 170c1b28b66STang Haojinclass TargetPCBundle extends Bundle { 171c1b28b66STang Haojin val pc = UInt(XLEN.W) 172c1b28b66STang Haojin val raiseIPF = Bool() 173c1b28b66STang Haojin val raiseIAF = Bool() 174c1b28b66STang Haojin val raiseIGPF = Bool() 175c1b28b66STang Haojin 176c1b28b66STang Haojin def raiseFault = raiseIPF || raiseIAF || raiseIGPF 177c1b28b66STang Haojin} 178