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