1/*************************************************************************************** 2* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3* Copyright (c) 2020-2021 Peng Cheng Laboratory 4* 5* XiangShan is licensed under Mulan PSL v2. 6* You can use this software according to the terms and conditions of the Mulan PSL v2. 7* You may obtain a copy of Mulan PSL v2 at: 8* http://license.coscl.org.cn/MulanPSL2 9* 10* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13* 14* See the Mulan PSL v2 for more details. 15***************************************************************************************/ 16 17package xiangshan.backend.fu.util 18 19import chisel3._ 20import chisel3.util._ 21import utils._ 22import xiangshan._ 23import xiangshan.backend._ 24import utils.XSDebug 25 26trait HasCSRConst { 27 28 // User Trap Setup 29 val Ustatus = 0x000 30 val Uie = 0x004 31 val Utvec = 0x005 32 33 // User Trap Handling 34 val Uscratch = 0x040 35 val Uepc = 0x041 36 val Ucause = 0x042 37 val Utval = 0x043 38 val Uip = 0x044 39 40 // User Floating-Point CSRs (not implemented) 41 val Fflags = 0x001 42 val Frm = 0x002 43 val Fcsr = 0x003 44 45 // User Counter/Timers 46 val Cycle = 0xC00 47 val Time = 0xC01 48 val Instret = 0xC02 49 50 // Supervisor Trap Setup 51 val Sstatus = 0x100 52 val Sedeleg = 0x102 53 val Sideleg = 0x103 54 val Sie = 0x104 55 val Stvec = 0x105 56 val Scounteren = 0x106 57 58 // Supervisor Trap Handling 59 val Sscratch = 0x140 60 val Sepc = 0x141 61 val Scause = 0x142 62 val Stval = 0x143 63 val Sip = 0x144 64 65 // Supervisor Protection and Translation 66 val Satp = 0x180 67 68 // Supervisor Custom Read/Write 69 val Sbpctl = 0x5C0 70 val Spfctl = 0x5C1 71 val Slvpredctl = 0x5C2 72 val Smblockctl = 0x5C3 73 val Srnctl = 0x5C4 74 val Scachebase = 0x5C5 75 /** 0x5C5-0x5E5 for cache instruction register*/ 76 77 val Sdsid = 0x9C0 78 79 // Machine Information Registers 80 val Mvendorid = 0xF11 81 val Marchid = 0xF12 82 val Mimpid = 0xF13 83 val Mhartid = 0xF14 84 85 // Machine Trap Setup 86 val Mstatus = 0x300 87 val Misa = 0x301 88 val Medeleg = 0x302 89 val Mideleg = 0x303 90 val Mie = 0x304 91 val Mtvec = 0x305 92 val Mcounteren = 0x306 93 94 // Machine Trap Handling 95 val Mscratch = 0x340 96 val Mepc = 0x341 97 val Mcause = 0x342 98 val Mtval = 0x343 99 val Mip = 0x344 100 101 // Machine Memory Protection 102 // TBD 103 val PmpcfgBase = 0x3A0 104 val PmpaddrBase = 0x3B0 105 // Machine level PMA 106 val PmacfgBase = 0x7C0 107 val PmaaddrBase = 0x7C8 // 84 entry at most 108 109 // Machine Counter/Timers 110 // Currently, we uses perfcnt csr set instead of standard Machine Counter/Timers 111 // 0xB80 - 0x89F are also used as perfcnt csr 112 val Mcycle = 0xb00 113 val Minstret = 0xb02 114 115 val Mhpmcounter3 = 0xB03 116 val Mhpmcounter4 = 0xB04 117 val Mhpmcounter5 = 0xB05 118 val Mhpmcounter6 = 0xB06 119 val Mhpmcounter7 = 0xB07 120 val Mhpmcounter8 = 0xB08 121 val Mhpmcounter9 = 0xB09 122 val Mhpmcounter10 = 0xB0A 123 val Mhpmcounter11 = 0xB0B 124 val Mhpmcounter12 = 0xB0C 125 val Mhpmcounter13 = 0xB0D 126 val Mhpmcounter14 = 0xB0E 127 val Mhpmcounter15 = 0xB0F 128 val Mhpmcounter16 = 0xB10 129 val Mhpmcounter17 = 0xB11 130 val Mhpmcounter18 = 0xB12 131 val Mhpmcounter19 = 0xB13 132 val Mhpmcounter20 = 0xB14 133 val Mhpmcounter21 = 0xB15 134 val Mhpmcounter22 = 0xB16 135 val Mhpmcounter23 = 0xB17 136 val Mhpmcounter24 = 0xB18 137 val Mhpmcounter25 = 0xB19 138 val Mhpmcounter26 = 0xB1A 139 val Mhpmcounter27 = 0xB1B 140 val Mhpmcounter28 = 0xB1C 141 val Mhpmcounter29 = 0xB1D 142 val Mhpmcounter30 = 0xB1E 143 val Mhpmcounter31 = 0xB1F 144 145 // Machine Counter Setup (not implemented) 146 val Mcountinhibit = 0x320 147 val Mhpmevent3 = 0x323 148 val Mhpmevent4 = 0x324 149 val Mhpmevent5 = 0x325 150 val Mhpmevent6 = 0x326 151 val Mhpmevent7 = 0x327 152 val Mhpmevent8 = 0x328 153 val Mhpmevent9 = 0x329 154 val Mhpmevent10 = 0x32A 155 val Mhpmevent11 = 0x32B 156 val Mhpmevent12 = 0x32C 157 val Mhpmevent13 = 0x32D 158 val Mhpmevent14 = 0x32E 159 val Mhpmevent15 = 0x32F 160 val Mhpmevent16 = 0x330 161 val Mhpmevent17 = 0x331 162 val Mhpmevent18 = 0x332 163 val Mhpmevent19 = 0x333 164 val Mhpmevent20 = 0x334 165 val Mhpmevent21 = 0x335 166 val Mhpmevent22 = 0x336 167 val Mhpmevent23 = 0x337 168 val Mhpmevent24 = 0x338 169 val Mhpmevent25 = 0x339 170 val Mhpmevent26 = 0x33A 171 val Mhpmevent27 = 0x33B 172 val Mhpmevent28 = 0x33C 173 val Mhpmevent29 = 0x33D 174 val Mhpmevent30 = 0x33E 175 val Mhpmevent31 = 0x33F 176 177 // Debug/Trace Registers (shared with Debug Mode) (not implemented) 178 // Debug Mode Registers 179 val Dcsr = 0x7B0 180 val Dpc = 0x7B1 181 val Dscratch = 0x7B2 182 val Dscratch1 = 0x7B3 183 184 def privEcall = 0x000.U 185 def privEbreak = 0x001.U 186 def privMret = 0x302.U 187 def privSret = 0x102.U 188 def privUret = 0x002.U 189 def privDret = 0x7b2.U 190 191 def ModeM = 0x3.U 192 def ModeH = 0x2.U 193 def ModeS = 0x1.U 194 def ModeU = 0x0.U 195 196 def IRQ_UEIP = 0 197 def IRQ_SEIP = 1 198 def IRQ_MEIP = 3 199 200 def IRQ_UTIP = 4 201 def IRQ_STIP = 5 202 def IRQ_MTIP = 7 203 204 def IRQ_USIP = 8 205 def IRQ_SSIP = 9 206 def IRQ_MSIP = 11 207 208 def IRQ_DEBUG = 12 209 210 val Asid_true_len = 16 211 212 def Asid_true_mask(AsidLength : Int) : UInt = { 213 val res = Wire(Vec(Asid_true_len,Bool())) 214 (0 until Asid_true_len).map(i => { 215 res(i) := (i <= AsidLength).B 216 }) 217 Cat(res.reverse) 218 // val zero = "h0".U(1.W) 219 // val one = "h1".U(1.W) 220 // val mask_high = Fill(Asid_true_len - AsidLength, zero) 221 // val mask_low = Fill(AsidLength, one) 222 223 // Cat(mask_high, mask_low) 224 } 225 226 val IntPriority = Seq( 227 IRQ_DEBUG, 228 IRQ_MEIP, IRQ_MSIP, IRQ_MTIP, 229 IRQ_SEIP, IRQ_SSIP, IRQ_STIP, 230 IRQ_UEIP, IRQ_USIP, IRQ_UTIP 231 ) 232 233 def csrAccessPermissionCheck(addr: UInt, wen: Bool, mode: UInt): Bool = { 234 val readOnly = addr(11,10) === "b11".U 235 val lowestAccessPrivilegeLevel = addr(9,8) 236 mode >= lowestAccessPrivilegeLevel && !(wen && readOnly) 237 } 238 239 def perfcntPermissionCheck(addr: UInt, mode: UInt, mmask: UInt, smask: UInt): Bool = { 240 val index = UIntToOH(addr & 31.U) 241 Mux(mode === ModeM, true.B, Mux(mode === ModeS, (index & mmask) =/= 0.U, (index & mmask & smask) =/= 0.U)) 242 } 243} 244