1a7a6d0a6Schengguanghuipackage xiangshan.backend.fu.NewCSR.CSREvents 2a7a6d0a6Schengguanghui 3a7a6d0a6Schengguanghuiimport chisel3._ 47e0f64b0SGuanghui Chengimport chisel3.util._ 5a7a6d0a6Schengguanghuiimport org.chipsalliance.cde.config.Parameters 6a7a6d0a6Schengguanghuiimport utility.{SignExt, ZeroExt} 77e0f64b0SGuanghui Chengimport xiangshan.{ExceptionNO, HasXSParameter, TriggerAction} 8a7a6d0a6Schengguanghuiimport xiangshan.ExceptionNO._ 9a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR 10a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRBundles.{CauseBundle, OneFieldBundle, PrivState} 11a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRConfig.{VaddrMaxWidth, XLEN} 12a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRDefines.SatpMode 13a7a6d0a6Schengguanghuiimport xiangshan.backend.fu.NewCSR._ 14a7a6d0a6Schengguanghui 15a7a6d0a6Schengguanghui 16a7a6d0a6Schengguanghuiclass TrapEntryDEventOutput extends Bundle with EventUpdatePrivStateOutput with EventOutputBase { 171734111cSchengguanghui val dcsr = ValidIO((new DcsrBundle).addInEvent(_.CAUSE, _.V, _.PRV)) 180f9a14c6Schengguanghui val dpc = ValidIO((new Epc ).addInEvent(_.epc)) 19c1b28b66STang Haojin val targetPc = ValidIO(new TargetPCBundle) 20a7a6d0a6Schengguanghui val debugMode = ValidIO(Bool()) 21a7a6d0a6Schengguanghui val debugIntrEnable = ValidIO(Bool()) 22a7a6d0a6Schengguanghui} 23a7a6d0a6Schengguanghui 24a7a6d0a6Schengguanghuiclass TrapEntryDEventInput(implicit override val p: Parameters) extends TrapEntryEventInput{ 25a7a6d0a6Schengguanghui val hasTrap = Input(Bool()) 26a7a6d0a6Schengguanghui val debugMode = Input(Bool()) 27a7a6d0a6Schengguanghui val hasDebugIntr = Input(Bool()) 287e0f64b0SGuanghui Cheng val triggerEnterDebugMode = Input(Bool()) 29a7a6d0a6Schengguanghui val hasDebugEbreakException = Input(Bool()) 30a7a6d0a6Schengguanghui val hasSingleStep = Input(Bool()) 31a7a6d0a6Schengguanghui val breakPoint = Input(Bool()) 32*a751b11aSchengguanghui val criticalErrorStateEnterDebug = Input(Bool()) 33a7a6d0a6Schengguanghui} 34a7a6d0a6Schengguanghui 35a7a6d0a6Schengguanghuiclass TrapEntryDEventModule(implicit val p: Parameters) extends Module with CSREventBase with DebugMMIO { 36a7a6d0a6Schengguanghui val in = IO(new TrapEntryDEventInput) 37a7a6d0a6Schengguanghui val out = IO(new TrapEntryDEventOutput) 38a7a6d0a6Schengguanghui 39a7a6d0a6Schengguanghui private val current = in 400f9a14c6Schengguanghui private val iMode = current.iMode 410f9a14c6Schengguanghui private val satp = current.satp 420f9a14c6Schengguanghui private val vsatp = current.vsatp 430f9a14c6Schengguanghui private val hgatp = current.hgatp 440f9a14c6Schengguanghui 45a7a6d0a6Schengguanghui private val hasTrap = in.hasTrap 46a7a6d0a6Schengguanghui private val debugMode = in.debugMode 47a7a6d0a6Schengguanghui private val hasDebugIntr = in.hasDebugIntr 48a7a6d0a6Schengguanghui private val breakPoint = in.breakPoint 497e0f64b0SGuanghui Cheng private val triggerEnterDebugMode = in.triggerEnterDebugMode 50a7a6d0a6Schengguanghui private val hasDebugEbreakException = in.hasDebugEbreakException 51a7a6d0a6Schengguanghui private val hasSingleStep = in.hasSingleStep 52*a751b11aSchengguanghui private val criticalErrorStateEnterDebug = in.criticalErrorStateEnterDebug 53a7a6d0a6Schengguanghui 54a7a6d0a6Schengguanghui private val hasExceptionInDmode = debugMode && hasTrap 55a7a6d0a6Schengguanghui val causeIntr = DcsrCause.Haltreq.asUInt 56*a751b11aSchengguanghui val causeExp = MuxCase(DcsrCause.None.asUInt, Seq( 57*a751b11aSchengguanghui criticalErrorStateEnterDebug -> DcsrCause.Other.asUInt, 587e0f64b0SGuanghui Cheng triggerEnterDebugMode -> DcsrCause.Trigger.asUInt, 59a7a6d0a6Schengguanghui hasDebugEbreakException -> DcsrCause.Ebreak.asUInt, 60a7a6d0a6Schengguanghui hasSingleStep -> DcsrCause.Step.asUInt 61a7a6d0a6Schengguanghui )) 62a7a6d0a6Schengguanghui 630f9a14c6Schengguanghui private val trapPC = genTrapVA( 640f9a14c6Schengguanghui iMode, 650f9a14c6Schengguanghui satp, 660f9a14c6Schengguanghui vsatp, 670f9a14c6Schengguanghui hgatp, 680f9a14c6Schengguanghui in.trapPc, 690f9a14c6Schengguanghui ) 70a7a6d0a6Schengguanghui 71a7a6d0a6Schengguanghui // ebreak jump debugEntry not debugException in dmode 72a7a6d0a6Schengguanghui // debug rom make hart write 0 to DebugMMIO.EXCEPTION when exception happened in debugMode. 73a7a6d0a6Schengguanghui // let debug module known hart got an exception. 74657432e4Schengguanghui // note: Need't know exception number in debugMode. 75657432e4Schengguanghui // exception(EX_BP) must be ebreak here! 76a7a6d0a6Schengguanghui val debugPc = Mux(hasExceptionInDmode && !breakPoint, DebugException.U, DebugEntry.U) 77a7a6d0a6Schengguanghui 78a7a6d0a6Schengguanghui out := DontCare 79a7a6d0a6Schengguanghui // output 80a7a6d0a6Schengguanghui out.dcsr.valid := valid 81a7a6d0a6Schengguanghui out.dpc.valid := valid 82a7a6d0a6Schengguanghui // !debugMode trap || debugMode hasExp 83a7a6d0a6Schengguanghui out.targetPc.valid := valid || hasExceptionInDmode 84a7a6d0a6Schengguanghui out.debugMode.valid := valid 85a7a6d0a6Schengguanghui out.privState.valid := valid 86a7a6d0a6Schengguanghui out.debugIntrEnable.valid := valid 87a7a6d0a6Schengguanghui 881734111cSchengguanghui out.dcsr.bits.V := current.privState.V.asUInt 89a7a6d0a6Schengguanghui out.dcsr.bits.PRV := current.privState.PRVM.asUInt 90a7a6d0a6Schengguanghui out.dcsr.bits.CAUSE := Mux(hasDebugIntr, causeIntr, causeExp) 913e8a0170SXuan Hu out.dpc.bits.epc := trapPC(63, 1) 92a7a6d0a6Schengguanghui 93c1b28b66STang Haojin out.targetPc.bits.pc := debugPc 94c1b28b66STang Haojin out.targetPc.bits.raiseIPF := false.B 95c1b28b66STang Haojin out.targetPc.bits.raiseIAF := false.B 96c1b28b66STang Haojin out.targetPc.bits.raiseIGPF := false.B 97a7a6d0a6Schengguanghui out.debugMode.bits := true.B 98a7a6d0a6Schengguanghui out.privState.bits := PrivState.ModeM 99a7a6d0a6Schengguanghui out.debugIntrEnable.bits := false.B 100a7a6d0a6Schengguanghui 101a7a6d0a6Schengguanghui} 102a7a6d0a6Schengguanghui 103cb36ac0fSXuan Hutrait TrapEntryDEventSinkBundle extends EventSinkBundle { self: CSRModule[_ <: CSRBundle] => 104a7a6d0a6Schengguanghui val trapToD = IO(Flipped(new TrapEntryDEventOutput)) 105a7a6d0a6Schengguanghui 106cb36ac0fSXuan Hu addUpdateBundleInCSREnumType(trapToD.getBundleByName(self.modName.toLowerCase())) 107a7a6d0a6Schengguanghui 108cb36ac0fSXuan Hu reconnectReg() 109a7a6d0a6Schengguanghui} 110