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 EnvPMM extends CSREnum with WARLApply { 190 val Disable = Value("b00".U) 191 val PMLEN7 = Value("b10".U) 192 val PMLEN16 = Value("b11".U) 193 194 override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Disable, PMLEN7, PMLEN16) 195 } 196 197 object ReflectHelper { 198 val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader) 199 200 def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = { 201 val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol 202 .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule 203 204 val methodSymbol = moduleSymbol 205 .info.member(ru.TermName(typeString)).asMethod 206 207 val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance) 208 val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol) 209 210 methodMirror 211 } 212 } 213 214 object CSRWARLField { 215 private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = { 216 val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb) 217 methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType] 218 } 219 220 def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn) 221 222 def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn) 223 224 def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null) 225 226 def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null) 227 } 228 229 object CSRROField { 230 private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = { 231 val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb) 232 methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType] 233 } 234 235 def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn) 236 237 def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn) 238 239 def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null) 240 241 def apply(bit: Int): CSREnumType = this.helper(bit, bit, null) 242 } 243 244 object CSRRWField { 245 private def helper(msb: Int, lsb: Int) : CSREnumType = { 246 val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb) 247 methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType] 248 } 249 250 def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb) 251 252 def apply(bit: Int): CSREnumType = this.helper(bit, bit) 253 } 254 255 object CSRWLRLField { 256 private def helper(msb: Int, lsb: Int) : CSREnumType = { 257 val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb) 258 methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType] 259 } 260 261 def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb) 262 } 263 264 object PrivMode extends CSREnum with RWApply { 265 val U = Value(0.U) 266 val S = Value(1.U) 267 val M = Value(3.U) 268 269 override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(U, S, M) 270 } 271 272 object VirtMode extends CSREnum with RWApply { 273 val Off = Value(0.U) 274 val On = Value(1.U) 275 } 276 277 object DebugverMode extends CSREnum with DebugverModeDef with ROApply 278 279 trait DebugverModeDef { 280 this: CSREnum => 281 val None = Value(0.U) 282 val Spec = Value(4.U) 283 val Custom = Value(15.U) 284 } 285} 286