xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRDefines.scala (revision 8882eb685de93177da606ee717b5ec8e459a768a)
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 BMAField extends CSREnum with WARLApply {
148    val ResetBMA = Value(0.U)
149    val TestBMA = Value("h4000000".U)
150  }
151
152  object XLENField extends CSREnum with ROApply {
153    val XLEN32 = Value(1.U)
154    val XLEN64 = Value(2.U)
155    val XLEN128 = Value(3.U)
156  }
157
158  object XtvecMode extends CSREnum with WARLApply {
159    val Direct = Value(0.U)
160    val Vectored = Value(1.U)
161
162    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Direct, Vectored)
163  }
164
165  object SatpMode extends CSREnum with WARLApply {
166    val Bare = Value(0.U)
167    val Sv39 = Value(8.U)
168    val Sv48 = Value(9.U)
169    val Sv57 = Value(10.U)
170    val Sv64 = Value(11.U) // Reserved for page-based 64-bit virtual addressing
171
172    // XiangShan only support Sv39 & Sv48 Page
173    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39, Sv48)
174  }
175
176  object HgatpMode extends CSREnum with WARLApply {
177    val Bare   = Value(0.U)
178    val Sv39x4 = Value(8.U)
179    val Sv48x4 = Value(9.U)
180    val Sv57x4 = Value(10.U)
181
182    // XiangShan only support Sv39 & Sv48 Page
183    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39x4, Sv48x4)
184  }
185
186  object EnvCBIE extends CSREnum with WARLApply {
187    val Off   = Value("b00".U)
188    val Flush = Value("b01".U)
189    val Inval = Value("b11".U)
190
191    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Off, Flush, Inval)
192  }
193
194  object EnvPMM extends CSREnum with WARLApply {
195    val Disable  = Value("b00".U)
196    val PMLEN7   = Value("b10".U)
197    val PMLEN16  = Value("b11".U)
198
199    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Disable, PMLEN7, PMLEN16)
200  }
201
202  object ReflectHelper {
203    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
204
205    def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = {
206      val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol
207        .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule
208
209      val methodSymbol = moduleSymbol
210        .info.member(ru.TermName(typeString)).asMethod
211
212      val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance)
213      val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol)
214
215      methodMirror
216    }
217  }
218
219  object CSRWARLField {
220    private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = {
221      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb)
222      methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType]
223    }
224
225    def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn)
226
227    def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn)
228
229    def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null)
230
231    def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null)
232  }
233
234  object CSRROField {
235    private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = {
236      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb)
237      methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType]
238    }
239
240    def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn)
241
242    def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn)
243
244    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null)
245
246    def apply(bit: Int): CSREnumType = this.helper(bit, bit, null)
247  }
248
249  object CSRRWField {
250    private def helper(msb: Int, lsb: Int) : CSREnumType = {
251      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb)
252      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
253    }
254
255    def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb)
256
257    def apply(bit: Int): CSREnumType = this.helper(bit, bit)
258  }
259
260  object CSRWLRLField {
261    private def helper(msb: Int, lsb: Int) : CSREnumType = {
262      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb)
263      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
264    }
265
266    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb)
267  }
268
269  object PrivMode extends CSREnum with RWApply {
270    val U = Value(0.U)
271    val S = Value(1.U)
272    val M = Value(3.U)
273
274    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(U, S, M)
275  }
276
277  object VirtMode extends CSREnum with RWApply {
278    val Off = Value(0.U)
279    val On  = Value(1.U)
280  }
281
282  object DebugverMode extends CSREnum with DebugverModeDef with ROApply
283
284  trait DebugverModeDef {
285    this: CSREnum =>
286    val None = Value(0.U)
287    val Spec = Value(4.U)
288    val Custom = Value(15.U)
289  }
290}
291