xref: /XiangShan/src/main/scala/xiangshan/backend/fu/util/CSRConst.scala (revision a273862e37f1d43bee748f2a6353320a2f52f6f4)
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