1package xiangshan.backend.fu.util 2 3import chisel3._ 4import chisel3.ExcitingUtils.{ConnectionType, Debug} 5import chisel3.util._ 6import utils._ 7import xiangshan._ 8import xiangshan.backend._ 9import utils.XSDebug 10 11trait HasCSRConst { 12 13 // User Trap Setup 14 val Ustatus = 0x000 15 val Uie = 0x004 16 val Utvec = 0x005 17 18 // User Trap Handling 19 val Uscratch = 0x040 20 val Uepc = 0x041 21 val Ucause = 0x042 22 val Utval = 0x043 23 val Uip = 0x044 24 25 // User Floating-Point CSRs (not implemented) 26 val Fflags = 0x001 27 val Frm = 0x002 28 val Fcsr = 0x003 29 30 // User Counter/Timers 31 val Cycle = 0xC00 32 val Time = 0xC01 33 val Instret = 0xC02 34 35 // Supervisor Trap Setup 36 val Sstatus = 0x100 37 val Sedeleg = 0x102 38 val Sideleg = 0x103 39 val Sie = 0x104 40 val Stvec = 0x105 41 val Scounteren = 0x106 42 43 // Supervisor Trap Handling 44 val Sscratch = 0x140 45 val Sepc = 0x141 46 val Scause = 0x142 47 val Stval = 0x143 48 val Sip = 0x144 49 50 // Supervisor Protection and Translation 51 val Satp = 0x180 52 53 // Supervisor Custom Read/Write 54 val Sbpctl = 0x5C0 55 val Spfctl = 0x5C1 56 val Slvpredctl = 0x5C2 57 val Smblockctl = 0x5C3 58 val Srnctl = 0x5C4 59 60 val Sdsid = 0x9C0 61 62 // Machine Information Registers 63 val Mvendorid = 0xF11 64 val Marchid = 0xF12 65 val Mimpid = 0xF13 66 val Mhartid = 0xF14 67 68 // Machine Trap Setup 69 val Mstatus = 0x300 70 val Misa = 0x301 71 val Medeleg = 0x302 72 val Mideleg = 0x303 73 val Mie = 0x304 74 val Mtvec = 0x305 75 val Mcounteren = 0x306 76 77 // Machine Trap Handling 78 val Mscratch = 0x340 79 val Mepc = 0x341 80 val Mcause = 0x342 81 val Mtval = 0x343 82 val Mip = 0x344 83 84 // Machine Memory Protection 85 // TBD 86 val Pmpcfg0 = 0x3A0 87 val Pmpcfg1 = 0x3A1 88 val Pmpcfg2 = 0x3A2 89 val Pmpcfg3 = 0x3A3 90 val PmpaddrBase = 0x3B0 91 92 // Machine Counter/Timers 93 // Currently, we uses perfcnt csr set instead of standard Machine Counter/Timers 94 // 0xB80 - 0x89F are also used as perfcnt csr 95 val Mcycle = 0xb00 96 val Minstret = 0xb02 97 98 val Mhpmcounter3 = 0xB03 99 val Mhpmcounter4 = 0xB04 100 val Mhpmcounter5 = 0xB05 101 val Mhpmcounter6 = 0xB06 102 val Mhpmcounter7 = 0xB07 103 val Mhpmcounter8 = 0xB08 104 val Mhpmcounter9 = 0xB09 105 val Mhpmcounter10 = 0xB0A 106 val Mhpmcounter11 = 0xB0B 107 val Mhpmcounter12 = 0xB0C 108 val Mhpmcounter13 = 0xB0D 109 val Mhpmcounter14 = 0xB0E 110 val Mhpmcounter15 = 0xB0F 111 val Mhpmcounter16 = 0xB10 112 val Mhpmcounter17 = 0xB11 113 val Mhpmcounter18 = 0xB12 114 val Mhpmcounter19 = 0xB13 115 val Mhpmcounter20 = 0xB14 116 val Mhpmcounter21 = 0xB15 117 val Mhpmcounter22 = 0xB16 118 val Mhpmcounter23 = 0xB17 119 val Mhpmcounter24 = 0xB18 120 val Mhpmcounter25 = 0xB19 121 val Mhpmcounter26 = 0xB1A 122 val Mhpmcounter27 = 0xB1B 123 val Mhpmcounter28 = 0xB1C 124 val Mhpmcounter29 = 0xB1D 125 val Mhpmcounter30 = 0xB1E 126 val Mhpmcounter31 = 0xB1F 127 128 // Machine Counter Setup (not implemented) 129 val Mcountinhibit = 0x320 130 val Mhpmevent3 = 0x323 131 val Mhpmevent4 = 0x324 132 val Mhpmevent5 = 0x325 133 val Mhpmevent6 = 0x326 134 val Mhpmevent7 = 0x327 135 val Mhpmevent8 = 0x328 136 val Mhpmevent9 = 0x329 137 val Mhpmevent10 = 0x32A 138 val Mhpmevent11 = 0x32B 139 val Mhpmevent12 = 0x32C 140 val Mhpmevent13 = 0x32D 141 val Mhpmevent14 = 0x32E 142 val Mhpmevent15 = 0x32F 143 val Mhpmevent16 = 0x330 144 val Mhpmevent17 = 0x331 145 val Mhpmevent18 = 0x332 146 val Mhpmevent19 = 0x333 147 val Mhpmevent20 = 0x334 148 val Mhpmevent21 = 0x335 149 val Mhpmevent22 = 0x336 150 val Mhpmevent23 = 0x337 151 val Mhpmevent24 = 0x338 152 val Mhpmevent25 = 0x339 153 val Mhpmevent26 = 0x33A 154 val Mhpmevent27 = 0x33B 155 val Mhpmevent28 = 0x33C 156 val Mhpmevent29 = 0x33D 157 val Mhpmevent30 = 0x33E 158 val Mhpmevent31 = 0x33F 159 160 // Debug/Trace Registers (shared with Debug Mode) (not implemented) 161 // Debug Mode Registers (not implemented) 162 163 def privEcall = 0x000.U 164 def privEbreak = 0x001.U 165 def privMret = 0x302.U 166 def privSret = 0x102.U 167 def privUret = 0x002.U 168 169 def ModeM = 0x3.U 170 def ModeH = 0x2.U 171 def ModeS = 0x1.U 172 def ModeU = 0x0.U 173 174 def IRQ_UEIP = 0 175 def IRQ_SEIP = 1 176 def IRQ_MEIP = 3 177 178 def IRQ_UTIP = 4 179 def IRQ_STIP = 5 180 def IRQ_MTIP = 7 181 182 def IRQ_USIP = 8 183 def IRQ_SSIP = 9 184 def IRQ_MSIP = 11 185 186 val IntPriority = Seq( 187 IRQ_MEIP, IRQ_MSIP, IRQ_MTIP, 188 IRQ_SEIP, IRQ_SSIP, IRQ_STIP, 189 IRQ_UEIP, IRQ_USIP, IRQ_UTIP 190 ) 191 192 def csrAccessPermissionCheck(addr: UInt, wen: Bool, mode: UInt): Bool = { 193 val readOnly = addr(11,10) === "b11".U 194 val lowestAccessPrivilegeLevel = addr(9,8) 195 mode >= lowestAccessPrivilegeLevel && !(wen && readOnly) 196 } 197 198 def perfcntPermissionCheck(addr: UInt, mode: UInt, mmask: UInt, smask: UInt): Bool = { 199 val index = UIntToOH(addr & 31.U) 200 Mux(mode === ModeM, true.B, Mux(mode === ModeS, (index & mmask) =/= 0.U, (index & mmask & smask) =/= 0.U)) 201 } 202} 203