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