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