xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRDefines.scala (revision 6639e9a467468f4e1b05a25a5de4500772aedeb1)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import xiangshan.backend.fu.NewCSR.CSRFunc._
5
6import scala.language.experimental.macros
7import scala.reflect.runtime.{universe => ru}
8
9object CSRDefines {
10  object CSRField1Bits extends CSREnum with CSRMacroApply
11
12  object CSRField2Bits extends CSREnum with CSRMacroApply
13
14  object CSRField3Bits extends CSREnum with CSRMacroApply
15
16  object CSRField4Bits extends CSREnum with CSRMacroApply
17
18  object CSRField5Bits extends CSREnum with CSRMacroApply
19
20  object CSRField6Bits extends CSREnum with CSRMacroApply
21
22  object CSRField7Bits extends CSREnum with CSRMacroApply
23
24  object CSRField8Bits extends CSREnum with CSRMacroApply
25
26  object CSRField9Bits extends CSREnum with CSRMacroApply
27
28  object CSRField10Bits extends CSREnum with CSRMacroApply
29
30  object CSRField11Bits extends CSREnum with CSRMacroApply
31
32  object CSRField12Bits extends CSREnum with CSRMacroApply
33
34  object CSRField13Bits extends CSREnum with CSRMacroApply
35
36  object CSRField14Bits extends CSREnum with CSRMacroApply
37
38  object CSRField15Bits extends CSREnum with CSRMacroApply
39
40  object CSRField16Bits extends CSREnum with CSRMacroApply
41
42  object CSRField17Bits extends CSREnum with CSRMacroApply
43
44  object CSRField18Bits extends CSREnum with CSRMacroApply
45
46  object CSRField19Bits extends CSREnum with CSRMacroApply
47
48  object CSRField20Bits extends CSREnum with CSRMacroApply
49
50  object CSRField21Bits extends CSREnum with CSRMacroApply
51
52  object CSRField22Bits extends CSREnum with CSRMacroApply
53
54  object CSRField23Bits extends CSREnum with CSRMacroApply
55
56  object CSRField24Bits extends CSREnum with CSRMacroApply
57
58  object CSRField25Bits extends CSREnum with CSRMacroApply
59
60  object CSRField26Bits extends CSREnum with CSRMacroApply
61
62  object CSRField27Bits extends CSREnum with CSRMacroApply
63
64  object CSRField28Bits extends CSREnum with CSRMacroApply
65
66  object CSRField29Bits extends CSREnum with CSRMacroApply
67
68  object CSRField30Bits extends CSREnum with CSRMacroApply
69
70  object CSRField31Bits extends CSREnum with CSRMacroApply
71
72  object CSRField32Bits extends CSREnum with CSRMacroApply
73
74  object CSRField33Bits extends CSREnum with CSRMacroApply
75
76  object CSRField34Bits extends CSREnum with CSRMacroApply
77
78  object CSRField35Bits extends CSREnum with CSRMacroApply
79
80  object CSRField36Bits extends CSREnum with CSRMacroApply
81
82  object CSRField37Bits extends CSREnum with CSRMacroApply
83
84  object CSRField38Bits extends CSREnum with CSRMacroApply
85
86  object CSRField39Bits extends CSREnum with CSRMacroApply
87
88  object CSRField40Bits extends CSREnum with CSRMacroApply
89
90  object CSRField41Bits extends CSREnum with CSRMacroApply
91
92  object CSRField42Bits extends CSREnum with CSRMacroApply
93
94  object CSRField43Bits extends CSREnum with CSRMacroApply
95
96  object CSRField44Bits extends CSREnum with CSRMacroApply
97
98  object CSRField45Bits extends CSREnum with CSRMacroApply
99
100  object CSRField46Bits extends CSREnum with CSRMacroApply
101
102  object CSRField47Bits extends CSREnum with CSRMacroApply
103
104  object CSRField48Bits extends CSREnum with CSRMacroApply
105
106  object CSRField49Bits extends CSREnum with CSRMacroApply
107
108  object CSRField50Bits extends CSREnum with CSRMacroApply
109
110  object CSRField51Bits extends CSREnum with CSRMacroApply
111
112  object CSRField52Bits extends CSREnum with CSRMacroApply
113
114  object CSRField53Bits extends CSREnum with CSRMacroApply
115
116  object CSRField54Bits extends CSREnum with CSRMacroApply
117
118  object CSRField55Bits extends CSREnum with CSRMacroApply
119
120  object CSRField56Bits extends CSREnum with CSRMacroApply
121
122  object CSRField57Bits extends CSREnum with CSRMacroApply
123
124  object CSRField58Bits extends CSREnum with CSRMacroApply
125
126  object CSRField59Bits extends CSREnum with CSRMacroApply
127
128  object CSRField60Bits extends CSREnum with CSRMacroApply
129
130  object CSRField61Bits extends CSREnum with CSRMacroApply
131
132  object CSRField62Bits extends CSREnum with CSRMacroApply
133
134  object CSRField63Bits extends CSREnum with CSRMacroApply
135
136  object CSRField64Bits extends CSREnum with CSRMacroApply
137
138  object ContextStatus extends CSREnum with ContextStatusDef with RWApply
139  object ContextStatusRO extends CSREnum with ContextStatusDef with ROApply
140  trait ContextStatusDef { this: CSREnum =>
141    val Off = Value(0.U)
142    val Initial = Value(1.U)
143    val Clean = Value(2.U)
144    val Dirty = Value(3.U)
145  }
146
147  object XLENField extends CSREnum with ROApply {
148    val XLEN32 = Value(1.U)
149    val XLEN64 = Value(2.U)
150    val XLEN128 = Value(3.U)
151  }
152
153  object XtvecMode extends CSREnum with WARLApply {
154    val Direct = Value(0.U)
155    val Vectored = Value(1.U)
156
157    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Direct, Vectored)
158  }
159
160  object SatpMode extends CSREnum with WARLApply {
161    val Bare = Value(0.U)
162    val Sv39 = Value(8.U)
163    val Sv48 = Value(9.U)
164    val Sv57 = Value(10.U)
165    val Sv64 = Value(11.U) // Reserved for page-based 64-bit virtual addressing
166
167    // XiangShan only support Sv39 & Sv48 Page
168    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39, Sv48)
169  }
170
171  object HgatpMode extends CSREnum with WARLApply {
172    val Bare   = Value(0.U)
173    val Sv39x4 = Value(8.U)
174    val Sv48x4 = Value(9.U)
175    val Sv57x4 = Value(10.U)
176
177    // XiangShan only support Sv39 & Sv48 Page
178    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39x4, Sv48x4)
179  }
180
181  object EnvCBIE extends CSREnum with WARLApply {
182    val Off   = Value("b00".U)
183    val Flush = Value("b01".U)
184    val Inval = Value("b11".U)
185
186    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Off, Flush, Inval)
187  }
188
189  object ReflectHelper {
190    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
191
192    def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = {
193      val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol
194        .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule
195
196      val methodSymbol = moduleSymbol
197        .info.member(ru.TermName(typeString)).asMethod
198
199      val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance)
200      val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol)
201
202      methodMirror
203    }
204  }
205
206  object CSRWARLField {
207    private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = {
208      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb)
209      methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType]
210    }
211
212    def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn)
213
214    def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn)
215
216    def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null)
217
218    def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null)
219  }
220
221  object CSRROField {
222    private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = {
223      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb)
224      methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType]
225    }
226
227    def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn)
228
229    def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn)
230
231    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null)
232
233    def apply(bit: Int): CSREnumType = this.helper(bit, bit, null)
234  }
235
236  object CSRRWField {
237    private def helper(msb: Int, lsb: Int) : CSREnumType = {
238      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb)
239      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
240    }
241
242    def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb)
243
244    def apply(bit: Int): CSREnumType = this.helper(bit, bit)
245  }
246
247  object CSRWLRLField {
248    private def helper(msb: Int, lsb: Int) : CSREnumType = {
249      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb)
250      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
251    }
252
253    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb)
254  }
255
256  object PrivMode extends CSREnum with RWApply {
257    val U = Value(0.U)
258    val S = Value(1.U)
259    val M = Value(3.U)
260
261    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(U, S, M)
262  }
263
264  object VirtMode extends CSREnum with RWApply {
265    val Off = Value(0.U)
266    val On  = Value(1.U)
267  }
268
269  object DebugverMode extends CSREnum with DebugverModeDef with ROApply
270
271  trait DebugverModeDef {
272    this: CSREnum =>
273    val None = Value(0.U)
274    val Spec = Value(4.U)
275    val Custom = Value(15.U)
276  }
277}
278