blob: d1f9416229283a140392a75fdc86a5e5f2c3835e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
// Richard CPU
// Copyright (C) 2026 Richard Qin
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// File path: rtl/core/include/csr_pkg.sv
// Description: Global enumerations, address definitions, and exception reason constants related to CSR and privilege-level architecture
package csr_pkg;
import rv64_pkg::*;
typedef enum logic [2:0] {
CSR_OP_NONE = 3'b000,
CSR_OP_WRITE = 3'b001,
CSR_OP_SET = 3'b010,
CSR_OP_CLEAR = 3'b011
} csr_op_t;
// ---------------------------------
// Floating-Point CSRs
// ---------------------------------
localparam logic [11:0] CSR_FFLAGS = 12'h001; // Floating-Point accrued exception flags
localparam logic [11:0] CSR_FRM = 12'h002; // Floating-Point dynamic rounding mode
localparam logic [11:0] CSR_FCSR = 12'h003; // Combined fflags/frm register
// ---------------------------------
// Machine Mode CSRs (M-Mode)
// ---------------------------------
localparam logic [11:0] CSR_MVENDORID = 12'hF11; // Vendor ID
localparam logic [11:0] CSR_MARCHID = 12'hF12; // Architecture ID
localparam logic [11:0] CSR_MIMPID = 12'hF13; // Implementation ID
localparam logic [11:0] CSR_MHARTID = 12'hF14; // Hart ID
localparam logic [11:0] CSR_MCONFIGPTR= 12'hF15; // Machine Configuration Pointer
localparam logic [11:0] CSR_MSTATUS = 12'h300; // Machine Status Register
localparam logic [11:0] CSR_MISA = 12'h301; // Machine ISA Register
localparam logic [11:0] CSR_MEDELEG = 12'h302; // Exception Delegation
localparam logic [11:0] CSR_MIDELEG = 12'h303; // Interrupt Delegation
localparam logic [11:0] CSR_MIE = 12'h304; // Machine Interrupt Enable Register
localparam logic [11:0] CSR_MTVEC = 12'h305; // Machine Trap Vector Register
localparam logic [11:0] CSR_MCOUNTEREN= 12'h306; // Machine Counter Enable Register
localparam logic [11:0] CSR_MENVCFG = 12'h30A; // Machine Environment Configuration
localparam logic [11:0] CSR_MSTATEEN0 = 12'h30C; // Machine State Enable 0
localparam logic [11:0] CSR_MSTATEEN1 = 12'h30D; // Machine State Enable 1
localparam logic [11:0] CSR_MSTATEEN2 = 12'h30E; // Machine State Enable 2
localparam logic [11:0] CSR_MSTATEEN3 = 12'h30F; // Machine State Enable 3
localparam logic [11:0] CSR_PMPCFG0 = 12'h3A0; // PMP Configuration Register 0
localparam logic [11:0] CSR_PMPCFG15 = 12'h3AF; // PMP Configuration Register 15
localparam logic [11:0] CSR_PMPADDR0 = 12'h3B0; // PMP Address Register 0
localparam logic [11:0] CSR_PMPADDR63 = 12'h3EF; // PMP Address Register 63
localparam logic [11:0] CSR_MSCRATCH = 12'h340; // Machine Scratch Register
localparam logic [11:0] CSR_MEPC = 12'h341; // Machine Exception Program Counter
localparam logic [11:0] CSR_MCAUSE = 12'h342; // Machine Cause Register
localparam logic [11:0] CSR_MTVAL = 12'h343; // Machine Trap Value Register
localparam logic [11:0] CSR_MIP = 12'h344; // Machine Interrupt Pending Register
localparam logic [11:0] CSR_MTINST = 12'h34A; // Machine Trap Instruction
localparam logic [11:0] CSR_MTVAL2 = 12'h34B; // Machine Second Trap Value
localparam logic [11:0] CSR_MCOUNTINHIBIT = 12'h320; // Machine Counter-Inhibit Register
localparam logic [11:0] CSR_MCYCLE = 12'hB00; // Machine Cycle Counter
localparam logic [11:0] CSR_MINSTRET = 12'hB02; // Machine Instruction Retired Counter
localparam logic [11:0] CSR_MHPMCOUNTER3 = 12'hB03; // Machine HPM Counter 3
localparam logic [11:0] CSR_MHPMCOUNTER31 = 12'hB1F; // Machine HPM Counter 31
localparam logic [11:0] CSR_MHPMEVENT3 = 12'h323; // Machine HPM Event Selector 3
localparam logic [11:0] CSR_MHPMEVENT31 = 12'h33F; // Machine HPM Event Selector 31
// ---------------------------------
// Supervisor Mode CSRs (S-Mode)
// ---------------------------------
localparam logic [11:0] CSR_SSTATUS = 12'h100; // Supervisor Status Register
localparam logic [11:0] CSR_SIE = 12'h104; // Supervisor Interrupt Enable Register
localparam logic [11:0] CSR_STVEC = 12'h105; // Supervisor Trap Vector Register
localparam logic [11:0] CSR_SCOUNTEREN= 12'h106; // Supervisor Counter Enable Register
localparam logic [11:0] CSR_SENVCFG = 12'h10A; // Supervisor Environment Configuration
localparam logic [11:0] CSR_SSTATEEN0 = 12'h10C; // Supervisor State Enable 0
localparam logic [11:0] CSR_SSTATEEN1 = 12'h10D; // Supervisor State Enable 1
localparam logic [11:0] CSR_SSTATEEN2 = 12'h10E; // Supervisor State Enable 2
localparam logic [11:0] CSR_SSTATEEN3 = 12'h10F; // Supervisor State Enable 3
localparam logic [11:0] CSR_SSCRATCH = 12'h140; // Supervisor Scratch Register
localparam logic [11:0] CSR_SEPC = 12'h141; // Supervisor Exception Program Counter
localparam logic [11:0] CSR_SCAUSE = 12'h142; // Supervisor Cause Register
localparam logic [11:0] CSR_STVAL = 12'h143; // Supervisor Trap Value Register
localparam logic [11:0] CSR_SIP = 12'h144; // Supervisor Interrupt Pending Register
localparam logic [11:0] CSR_SATP = 12'h180; // Supervisor Address Translation and Protection Register
// ---------------------------------
// Hypervisor CSRs (H-Extension)
// ---------------------------------
localparam logic [11:0] CSR_HSTATUS = 12'h600; // Hypervisor Status
localparam logic [11:0] CSR_HEDELEG = 12'h602; // Hypervisor Exception Delegation
localparam logic [11:0] CSR_HIDELEG = 12'h603; // Hypervisor Interrupt Delegation
localparam logic [11:0] CSR_HIE = 12'h604; // Hypervisor Interrupt Enable
localparam logic [11:0] CSR_HTIMEDELTA = 12'h605; // Hypervisor Timer Delta
localparam logic [11:0] CSR_HCOUNTEREN = 12'h606; // Hypervisor Counter Enable
localparam logic [11:0] CSR_HGEIE = 12'h607; // Hypervisor Guest External Interrupt Enable
localparam logic [11:0] CSR_HENVCFG = 12'h60A; // Hypervisor Environment Configuration
localparam logic [11:0] CSR_HSTATEEN0 = 12'h60C; // Hypervisor State Enable 0
localparam logic [11:0] CSR_HSTATEEN1 = 12'h60D; // Hypervisor State Enable 1
localparam logic [11:0] CSR_HSTATEEN2 = 12'h60E; // Hypervisor State Enable 2
localparam logic [11:0] CSR_HSTATEEN3 = 12'h60F; // Hypervisor State Enable 3
localparam logic [11:0] CSR_HTVAL = 12'h643; // Hypervisor Trap Value
localparam logic [11:0] CSR_HIP = 12'h644; // Hypervisor Interrupt Pending
localparam logic [11:0] CSR_HVIP = 12'h645; // Hypervisor Virtual Interrupt Pending
localparam logic [11:0] CSR_HTINST = 12'h64A; // Hypervisor Trap Instruction
localparam logic [11:0] CSR_HGATP = 12'h680; // Hypervisor Guest Address Translation and Protection
localparam logic [11:0] CSR_HGEIP = 12'hE12; // Hypervisor Guest External Interrupt Pending
localparam logic [11:0] CSR_VSSTATUS = 12'h200; // Virtual Supervisor Status
localparam logic [11:0] CSR_VSIE = 12'h204; // Virtual Supervisor Interrupt Enable
localparam logic [11:0] CSR_VSTVEC = 12'h205; // Virtual Supervisor Trap Vector
localparam logic [11:0] CSR_VSSCRATCH = 12'h240; // Virtual Supervisor Scratch
localparam logic [11:0] CSR_VSEPC = 12'h241; // Virtual Supervisor Exception PC
localparam logic [11:0] CSR_VSCAUSE = 12'h242; // Virtual Supervisor Cause
localparam logic [11:0] CSR_VSTVAL = 12'h243; // Virtual Supervisor Trap Value
localparam logic [11:0] CSR_VSIP = 12'h244; // Virtual Supervisor Interrupt Pending
localparam logic [11:0] CSR_VSATP = 12'h280; // Virtual Supervisor Address Translation and Protection
// ---------------------------------
// User Mode CSRs (U-Mode / URW)
// ---------------------------------
localparam logic [11:0] CSR_CYCLE = 12'hC00; // Cycle Counter
localparam logic [11:0] CSR_TIME = 12'hC01; // Timer Counter
localparam logic [11:0] CSR_INSTRET = 12'hC02; // Instruction Retired Counter
localparam logic [11:0] CSR_HPMCOUNTER3 = 12'hC03; // HPM Counter 3
localparam logic [11:0] CSR_HPMCOUNTER31 = 12'hC1F; // HPM Counter 31
// ---------------------------------
// Exception Cause Codes (mcause.Interrupt == 0)
// ---------------------------------
localparam logic [XLEN-1:0] EXC_INST_ADDR_MISALIGNED = 64'd0; // Instruction Address Misaligned
localparam logic [XLEN-1:0] EXC_INST_FAULT = 64'd1; // Instruction Access Fault
localparam logic [XLEN-1:0] EXC_INST_ILLEGAL = 64'd2; // Illegal Instruction
localparam logic [XLEN-1:0] EXC_BREAKPOINT = 64'd3; // Breakpoint
localparam logic [XLEN-1:0] EXC_LOAD_ADDR_MISALIGNED = 64'd4; // Load Address Misaligned
localparam logic [XLEN-1:0] EXC_LOAD_FAULT = 64'd5; // Load Access Fault
localparam logic [XLEN-1:0] EXC_STORE_ADDR_MISALIGNED = 64'd6; // Store Address Misaligned
localparam logic [XLEN-1:0] EXC_STORE_FAULT = 64'd7; // Store Access Fault
localparam logic [XLEN-1:0] EXC_ECALL_FROM_U = 64'd8; // Environment Call from U-Mode
localparam logic [XLEN-1:0] EXC_ECALL_FROM_S = 64'd9; // Environment Call from S-Mode
localparam logic [XLEN-1:0] EXC_ECALL_FROM_M = 64'd11; // Environment Call from M-Mode
localparam logic [XLEN-1:0] EXC_INSTR_PAGE_FAULT = 64'd12; // Instruction Page Fault
localparam logic [XLEN-1:0] EXC_LOAD_PAGE_FAULT = 64'd13; // Load Page Fault
localparam logic [XLEN-1:0] EXC_STORE_PAGE_FAULT = 64'd15; // Store Page Fault
localparam logic [XLEN-1:0] MEDELEG_WRITABLE_MASK =
(64'h1 << EXC_INST_ADDR_MISALIGNED) |
(64'h1 << EXC_INST_FAULT) |
(64'h1 << EXC_INST_ILLEGAL) |
(64'h1 << EXC_BREAKPOINT) |
(64'h1 << EXC_LOAD_ADDR_MISALIGNED) |
(64'h1 << EXC_LOAD_FAULT) |
(64'h1 << EXC_STORE_ADDR_MISALIGNED) |
(64'h1 << EXC_STORE_FAULT) |
(64'h1 << EXC_ECALL_FROM_U) |
(64'h1 << EXC_ECALL_FROM_S) |
(64'h1 << EXC_INSTR_PAGE_FAULT) |
(64'h1 << EXC_LOAD_PAGE_FAULT) |
(64'h1 << EXC_STORE_PAGE_FAULT);
localparam logic [XLEN-1:0] MEDELEG_READ_ONLY_ONE_MASK = '0;
// ---------------------------------
// Interrupt Cause Codes (mcause.Interrupt == 1)
// ---------------------------------
// User Mode Interrupts
localparam logic [XLEN-1:0] INTERRUPT_U_SOFTWARE = 64'd0; // User Mode Software Interrupt
localparam logic [XLEN-1:0] INTERRUPT_U_TIMER = 64'd4; // User Mode Timer Interrupt
localparam logic [XLEN-1:0] INTERRUPT_U_EXTERNAL = 64'd8; // User Mode External Interrupt
// Supervisor Mode Interrupts
localparam logic [XLEN-1:0] INTERRUPT_S_SOFTWARE = 64'd1; // Supervisor Mode Software Interrupt
localparam logic [XLEN-1:0] INTERRUPT_S_TIMER = 64'd5; // Supervisor Mode Timer Interrupt
localparam logic [XLEN-1:0] INTERRUPT_S_EXTERNAL = 64'd9; // Supervisor Mode External Interrupt
// Machine Mode Interrupts
localparam logic [XLEN-1:0] INTERRUPT_M_SOFTWARE = 64'd3; // Machine Mode Software Interrupt
localparam logic [XLEN-1:0] INTERRUPT_M_TIMER = 64'd7; // Machine Mode Timer Interrupt
localparam logic [XLEN-1:0] INTERRUPT_M_EXTERNAL = 64'd11; // Machine Mode External Interrupt
localparam logic [XLEN-1:0] MIDELEG_WRITABLE_MASK =
(64'h1 << INTERRUPT_S_SOFTWARE) |
(64'h1 << INTERRUPT_S_TIMER) |
(64'h1 << INTERRUPT_S_EXTERNAL);
// ---------------------------------
// Physical Memory Protection (PMP)
// ---------------------------------
localparam int PMP_ENTRY_COUNT = 64;
localparam int PMP_CFG_CSR_COUNT = 16;
localparam int PMP_CFG_ENTRIES_PER_RV64_CSR = 8;
typedef logic [7:0] pmpcfg_entry_t;
typedef logic [XLEN-1:0] pmpaddr_entry_t;
localparam int PMPCFG_R_BIT = 0;
localparam int PMPCFG_W_BIT = 1;
localparam int PMPCFG_X_BIT = 2;
localparam int PMPCFG_A_LO = 3;
localparam int PMPCFG_A_HI = 4;
localparam int PMPCFG_L_BIT = 7;
localparam logic [1:0] PMP_MODE_OFF = 2'b00;
localparam logic [1:0] PMP_MODE_TOR = 2'b01;
localparam logic [1:0] PMP_MODE_NA4 = 2'b10;
localparam logic [1:0] PMP_MODE_NAPOT = 2'b11;
// ---------------------------------
// Environment Configuration / State Enable
// ---------------------------------
localparam int ENVCFG_FIOM_BIT = 0;
localparam int ENVCFG_CBIE_LO = 4;
localparam int ENVCFG_CBIE_HI = 5;
localparam int ENVCFG_CBCFE_BIT = 6;
localparam int ENVCFG_CBZE_BIT = 7;
localparam int ENVCFG_PMM_LO = 32;
localparam int ENVCFG_PMM_HI = 33;
localparam int STATEEN0_ENVCFG_BIT = 62;
localparam int STATEEN_SE0_BIT = 63;
endpackage
|