xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRDefines.scala (revision 8882eb685de93177da606ee717b5ec8e459a768a)
1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR
2039cdc35SXuan Hu
3039cdc35SXuan Huimport chisel3._
4039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRFunc._
5039cdc35SXuan Hu
6039cdc35SXuan Huimport scala.language.experimental.macros
7d0b87b97SXuan Huimport scala.reflect.runtime.{universe => ru}
8039cdc35SXuan Hu
9039cdc35SXuan Huobject CSRDefines {
10039cdc35SXuan Hu  object CSRField1Bits extends CSREnum with CSRMacroApply
11039cdc35SXuan Hu
12039cdc35SXuan Hu  object CSRField2Bits extends CSREnum with CSRMacroApply
13039cdc35SXuan Hu
14039cdc35SXuan Hu  object CSRField3Bits extends CSREnum with CSRMacroApply
15039cdc35SXuan Hu
16039cdc35SXuan Hu  object CSRField4Bits extends CSREnum with CSRMacroApply
17039cdc35SXuan Hu
18039cdc35SXuan Hu  object CSRField5Bits extends CSREnum with CSRMacroApply
19039cdc35SXuan Hu
20039cdc35SXuan Hu  object CSRField6Bits extends CSREnum with CSRMacroApply
21039cdc35SXuan Hu
22039cdc35SXuan Hu  object CSRField7Bits extends CSREnum with CSRMacroApply
23039cdc35SXuan Hu
24039cdc35SXuan Hu  object CSRField8Bits extends CSREnum with CSRMacroApply
25039cdc35SXuan Hu
26039cdc35SXuan Hu  object CSRField9Bits extends CSREnum with CSRMacroApply
27039cdc35SXuan Hu
28039cdc35SXuan Hu  object CSRField10Bits extends CSREnum with CSRMacroApply
29039cdc35SXuan Hu
30039cdc35SXuan Hu  object CSRField11Bits extends CSREnum with CSRMacroApply
31039cdc35SXuan Hu
32039cdc35SXuan Hu  object CSRField12Bits extends CSREnum with CSRMacroApply
33039cdc35SXuan Hu
34039cdc35SXuan Hu  object CSRField13Bits extends CSREnum with CSRMacroApply
35039cdc35SXuan Hu
36039cdc35SXuan Hu  object CSRField14Bits extends CSREnum with CSRMacroApply
37039cdc35SXuan Hu
38039cdc35SXuan Hu  object CSRField15Bits extends CSREnum with CSRMacroApply
39039cdc35SXuan Hu
40039cdc35SXuan Hu  object CSRField16Bits extends CSREnum with CSRMacroApply
41039cdc35SXuan Hu
42039cdc35SXuan Hu  object CSRField17Bits extends CSREnum with CSRMacroApply
43039cdc35SXuan Hu
44039cdc35SXuan Hu  object CSRField18Bits extends CSREnum with CSRMacroApply
45039cdc35SXuan Hu
46039cdc35SXuan Hu  object CSRField19Bits extends CSREnum with CSRMacroApply
47039cdc35SXuan Hu
48039cdc35SXuan Hu  object CSRField20Bits extends CSREnum with CSRMacroApply
49039cdc35SXuan Hu
50039cdc35SXuan Hu  object CSRField21Bits extends CSREnum with CSRMacroApply
51039cdc35SXuan Hu
52039cdc35SXuan Hu  object CSRField22Bits extends CSREnum with CSRMacroApply
53039cdc35SXuan Hu
54039cdc35SXuan Hu  object CSRField23Bits extends CSREnum with CSRMacroApply
55039cdc35SXuan Hu
56039cdc35SXuan Hu  object CSRField24Bits extends CSREnum with CSRMacroApply
57039cdc35SXuan Hu
58039cdc35SXuan Hu  object CSRField25Bits extends CSREnum with CSRMacroApply
59039cdc35SXuan Hu
60039cdc35SXuan Hu  object CSRField26Bits extends CSREnum with CSRMacroApply
61039cdc35SXuan Hu
62039cdc35SXuan Hu  object CSRField27Bits extends CSREnum with CSRMacroApply
63039cdc35SXuan Hu
64039cdc35SXuan Hu  object CSRField28Bits extends CSREnum with CSRMacroApply
65039cdc35SXuan Hu
66039cdc35SXuan Hu  object CSRField29Bits extends CSREnum with CSRMacroApply
67039cdc35SXuan Hu
68039cdc35SXuan Hu  object CSRField30Bits extends CSREnum with CSRMacroApply
69039cdc35SXuan Hu
70039cdc35SXuan Hu  object CSRField31Bits extends CSREnum with CSRMacroApply
71039cdc35SXuan Hu
72039cdc35SXuan Hu  object CSRField32Bits extends CSREnum with CSRMacroApply
73039cdc35SXuan Hu
74039cdc35SXuan Hu  object CSRField33Bits extends CSREnum with CSRMacroApply
75039cdc35SXuan Hu
76039cdc35SXuan Hu  object CSRField34Bits extends CSREnum with CSRMacroApply
77039cdc35SXuan Hu
78039cdc35SXuan Hu  object CSRField35Bits extends CSREnum with CSRMacroApply
79039cdc35SXuan Hu
80039cdc35SXuan Hu  object CSRField36Bits extends CSREnum with CSRMacroApply
81039cdc35SXuan Hu
82039cdc35SXuan Hu  object CSRField37Bits extends CSREnum with CSRMacroApply
83039cdc35SXuan Hu
84039cdc35SXuan Hu  object CSRField38Bits extends CSREnum with CSRMacroApply
85039cdc35SXuan Hu
86039cdc35SXuan Hu  object CSRField39Bits extends CSREnum with CSRMacroApply
87039cdc35SXuan Hu
88039cdc35SXuan Hu  object CSRField40Bits extends CSREnum with CSRMacroApply
89039cdc35SXuan Hu
90039cdc35SXuan Hu  object CSRField41Bits extends CSREnum with CSRMacroApply
91039cdc35SXuan Hu
92039cdc35SXuan Hu  object CSRField42Bits extends CSREnum with CSRMacroApply
93039cdc35SXuan Hu
94039cdc35SXuan Hu  object CSRField43Bits extends CSREnum with CSRMacroApply
95039cdc35SXuan Hu
96039cdc35SXuan Hu  object CSRField44Bits extends CSREnum with CSRMacroApply
97039cdc35SXuan Hu
98039cdc35SXuan Hu  object CSRField45Bits extends CSREnum with CSRMacroApply
99039cdc35SXuan Hu
100039cdc35SXuan Hu  object CSRField46Bits extends CSREnum with CSRMacroApply
101039cdc35SXuan Hu
102039cdc35SXuan Hu  object CSRField47Bits extends CSREnum with CSRMacroApply
103039cdc35SXuan Hu
104039cdc35SXuan Hu  object CSRField48Bits extends CSREnum with CSRMacroApply
105039cdc35SXuan Hu
106039cdc35SXuan Hu  object CSRField49Bits extends CSREnum with CSRMacroApply
107039cdc35SXuan Hu
108039cdc35SXuan Hu  object CSRField50Bits extends CSREnum with CSRMacroApply
109039cdc35SXuan Hu
110039cdc35SXuan Hu  object CSRField51Bits extends CSREnum with CSRMacroApply
111039cdc35SXuan Hu
112039cdc35SXuan Hu  object CSRField52Bits extends CSREnum with CSRMacroApply
113039cdc35SXuan Hu
114039cdc35SXuan Hu  object CSRField53Bits extends CSREnum with CSRMacroApply
115039cdc35SXuan Hu
116039cdc35SXuan Hu  object CSRField54Bits extends CSREnum with CSRMacroApply
117039cdc35SXuan Hu
118039cdc35SXuan Hu  object CSRField55Bits extends CSREnum with CSRMacroApply
119039cdc35SXuan Hu
120039cdc35SXuan Hu  object CSRField56Bits extends CSREnum with CSRMacroApply
121039cdc35SXuan Hu
122039cdc35SXuan Hu  object CSRField57Bits extends CSREnum with CSRMacroApply
123039cdc35SXuan Hu
124039cdc35SXuan Hu  object CSRField58Bits extends CSREnum with CSRMacroApply
125039cdc35SXuan Hu
126039cdc35SXuan Hu  object CSRField59Bits extends CSREnum with CSRMacroApply
127039cdc35SXuan Hu
128039cdc35SXuan Hu  object CSRField60Bits extends CSREnum with CSRMacroApply
129039cdc35SXuan Hu
130039cdc35SXuan Hu  object CSRField61Bits extends CSREnum with CSRMacroApply
131039cdc35SXuan Hu
132039cdc35SXuan Hu  object CSRField62Bits extends CSREnum with CSRMacroApply
133039cdc35SXuan Hu
134039cdc35SXuan Hu  object CSRField63Bits extends CSREnum with CSRMacroApply
135039cdc35SXuan Hu
136039cdc35SXuan Hu  object CSRField64Bits extends CSREnum with CSRMacroApply
137039cdc35SXuan Hu
138436f48ccSXuan Hu  object ContextStatus extends CSREnum with ContextStatusDef with RWApply
139436f48ccSXuan Hu  object ContextStatusRO extends CSREnum with ContextStatusDef with ROApply
140039cdc35SXuan Hu  trait ContextStatusDef { this: CSREnum =>
141039cdc35SXuan Hu    val Off = Value(0.U)
142039cdc35SXuan Hu    val Initial = Value(1.U)
143039cdc35SXuan Hu    val Clean = Value(2.U)
144039cdc35SXuan Hu    val Dirty = Value(3.U)
145039cdc35SXuan Hu  }
146039cdc35SXuan Hu
147*8882eb68SXin Tian  object BMAField extends CSREnum with WARLApply {
148*8882eb68SXin Tian    val ResetBMA = Value(0.U)
149*8882eb68SXin Tian    val TestBMA = Value("h4000000".U)
150*8882eb68SXin Tian  }
151*8882eb68SXin Tian
152436f48ccSXuan Hu  object XLENField extends CSREnum with ROApply {
153039cdc35SXuan Hu    val XLEN32 = Value(1.U)
154039cdc35SXuan Hu    val XLEN64 = Value(2.U)
155039cdc35SXuan Hu    val XLEN128 = Value(3.U)
156039cdc35SXuan Hu  }
157039cdc35SXuan Hu
158436f48ccSXuan Hu  object XtvecMode extends CSREnum with WARLApply {
159039cdc35SXuan Hu    val Direct = Value(0.U)
160039cdc35SXuan Hu    val Vectored = Value(1.U)
161039cdc35SXuan Hu
162e3da8badSTang Haojin    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Direct, Vectored)
163039cdc35SXuan Hu  }
164039cdc35SXuan Hu
165436f48ccSXuan Hu  object SatpMode extends CSREnum with WARLApply {
166039cdc35SXuan Hu    val Bare = Value(0.U)
167039cdc35SXuan Hu    val Sv39 = Value(8.U)
168039cdc35SXuan Hu    val Sv48 = Value(9.U)
169039cdc35SXuan Hu    val Sv57 = Value(10.U)
170039cdc35SXuan Hu    val Sv64 = Value(11.U) // Reserved for page-based 64-bit virtual addressing
171039cdc35SXuan Hu
1723ea4388cSHaoyuan Feng    // XiangShan only support Sv39 & Sv48 Page
1733ea4388cSHaoyuan Feng    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39, Sv48)
174039cdc35SXuan Hu  }
175039cdc35SXuan Hu
176436f48ccSXuan Hu  object HgatpMode extends CSREnum with WARLApply {
177039cdc35SXuan Hu    val Bare   = Value(0.U)
178039cdc35SXuan Hu    val Sv39x4 = Value(8.U)
179039cdc35SXuan Hu    val Sv48x4 = Value(9.U)
180039cdc35SXuan Hu    val Sv57x4 = Value(10.U)
181039cdc35SXuan Hu
1823ea4388cSHaoyuan Feng    // XiangShan only support Sv39 & Sv48 Page
1833ea4388cSHaoyuan Feng    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39x4, Sv48x4)
184039cdc35SXuan Hu  }
185039cdc35SXuan Hu
186e9f7c490SXuan Hu  object EnvCBIE extends CSREnum with WARLApply {
187e9f7c490SXuan Hu    val Off   = Value("b00".U)
188e9f7c490SXuan Hu    val Flush = Value("b01".U)
189e9f7c490SXuan Hu    val Inval = Value("b11".U)
190e9f7c490SXuan Hu
191e9f7c490SXuan Hu    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Off, Flush, Inval)
192e9f7c490SXuan Hu  }
193e9f7c490SXuan Hu
194189833a1SHaoyuan Feng  object EnvPMM extends CSREnum with WARLApply {
195189833a1SHaoyuan Feng    val Disable  = Value("b00".U)
196189833a1SHaoyuan Feng    val PMLEN7   = Value("b10".U)
197189833a1SHaoyuan Feng    val PMLEN16  = Value("b11".U)
198189833a1SHaoyuan Feng
199189833a1SHaoyuan Feng    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Disable, PMLEN7, PMLEN16)
200189833a1SHaoyuan Feng  }
201189833a1SHaoyuan Feng
202d0b87b97SXuan Hu  object ReflectHelper {
203d0b87b97SXuan Hu    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
204d0b87b97SXuan Hu
205d0b87b97SXuan Hu    def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = {
206d0b87b97SXuan Hu      val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol
207d0b87b97SXuan Hu        .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule
208d0b87b97SXuan Hu
209d0b87b97SXuan Hu      val methodSymbol = moduleSymbol
210d0b87b97SXuan Hu        .info.member(ru.TermName(typeString)).asMethod
211d0b87b97SXuan Hu
212d0b87b97SXuan Hu      val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance)
213d0b87b97SXuan Hu      val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol)
214d0b87b97SXuan Hu
215d0b87b97SXuan Hu      methodMirror
216d0b87b97SXuan Hu    }
217d0b87b97SXuan Hu  }
218d0b87b97SXuan Hu
219039cdc35SXuan Hu  object CSRWARLField {
220d0b87b97SXuan Hu    private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = {
221d0b87b97SXuan Hu      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb)
222d0b87b97SXuan Hu      methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType]
223d0b87b97SXuan Hu    }
224039cdc35SXuan Hu
225d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn)
226039cdc35SXuan Hu
227d0b87b97SXuan Hu    def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn)
228039cdc35SXuan Hu
229d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null)
230d0b87b97SXuan Hu
231d0b87b97SXuan Hu    def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null)
232039cdc35SXuan Hu  }
233039cdc35SXuan Hu
234039cdc35SXuan Hu  object CSRROField {
235d0b87b97SXuan Hu    private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = {
236d0b87b97SXuan Hu      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb)
237d0b87b97SXuan Hu      methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType]
238d0b87b97SXuan Hu    }
239039cdc35SXuan Hu
240d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn)
241039cdc35SXuan Hu
242d0b87b97SXuan Hu    def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn)
243039cdc35SXuan Hu
244d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null)
24501cdded8SXuan Hu
246d0b87b97SXuan Hu    def apply(bit: Int): CSREnumType = this.helper(bit, bit, null)
247039cdc35SXuan Hu  }
248039cdc35SXuan Hu
249039cdc35SXuan Hu  object CSRRWField {
250d0b87b97SXuan Hu    private def helper(msb: Int, lsb: Int) : CSREnumType = {
251d0b87b97SXuan Hu      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb)
252d0b87b97SXuan Hu      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
253039cdc35SXuan Hu    }
254039cdc35SXuan Hu
255d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb)
256039cdc35SXuan Hu
257d0b87b97SXuan Hu    def apply(bit: Int): CSREnumType = this.helper(bit, bit)
258039cdc35SXuan Hu  }
259039cdc35SXuan Hu
260039cdc35SXuan Hu  object CSRWLRLField {
261d0b87b97SXuan Hu    private def helper(msb: Int, lsb: Int) : CSREnumType = {
262d0b87b97SXuan Hu      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb)
263d0b87b97SXuan Hu      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
264d0b87b97SXuan Hu    }
265d0b87b97SXuan Hu
266d0b87b97SXuan Hu    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb)
267039cdc35SXuan Hu  }
268039cdc35SXuan Hu
269436f48ccSXuan Hu  object PrivMode extends CSREnum with RWApply {
270039cdc35SXuan Hu    val U = Value(0.U)
271039cdc35SXuan Hu    val S = Value(1.U)
272039cdc35SXuan Hu    val M = Value(3.U)
273cb36ac0fSXuan Hu
274cb36ac0fSXuan Hu    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(U, S, M)
275039cdc35SXuan Hu  }
276039cdc35SXuan Hu
277436f48ccSXuan Hu  object VirtMode extends CSREnum with RWApply {
278039cdc35SXuan Hu    val Off = Value(0.U)
279039cdc35SXuan Hu    val On  = Value(1.U)
280039cdc35SXuan Hu  }
28194c2cc17SsinceforYy
28294c2cc17SsinceforYy  object DebugverMode extends CSREnum with DebugverModeDef with ROApply
28394c2cc17SsinceforYy
28494c2cc17SsinceforYy  trait DebugverModeDef {
28594c2cc17SsinceforYy    this: CSREnum =>
28694c2cc17SsinceforYy    val None = Value(0.U)
28794c2cc17SsinceforYy    val Spec = Value(4.U)
28894c2cc17SsinceforYy    val Custom = Value(15.U)
28994c2cc17SsinceforYy  }
290039cdc35SXuan Hu}
291