xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSREvents/CSREvent.scala (revision 8882eb685de93177da606ee717b5ec8e459a768a)
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