NEORV32 Software Framework Documentation
The NEORV32 RISC-V Processor
Loading...
Searching...
No Matches
neorv32_cpu.h
Go to the documentation of this file.
1// ================================================================================ //
2// The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 //
3// Copyright (c) NEORV32 contributors. //
4// Copyright (c) 2020 - 2025 Stephan Nolting. All rights reserved. //
5// Licensed under the BSD-3-Clause license, see LICENSE for details. //
6// SPDX-License-Identifier: BSD-3-Clause //
7// ================================================================================ //
8
13
14#ifndef NEORV32_CPU_H
15#define NEORV32_CPU_H
16
17#include <stdint.h>
18
19
20/**********************************************************************/
24uint64_t neorv32_cpu_get_cycle(void);
25void neorv32_cpu_set_mcycle(uint64_t value);
26uint64_t neorv32_cpu_get_instret(void);
27void neorv32_cpu_set_minstret(uint64_t value);
30int neorv32_cpu_pmp_configure_region(int index, uint32_t addr, uint8_t config);
32uint32_t neorv32_cpu_hpm_get_size(void);
34
35
36/**********************************************************************/
41inline void __attribute__ ((always_inline)) neorv32_cpu_soft_restart(void) {
42
43 uint32_t sw_boot_addr = NEORV32_CRT0_ENTRY; // linker symbol
44 asm volatile ("jalr x0, 0(%[dst])" : : [dst] "r" (sw_boot_addr));
45 __builtin_unreachable();
46 while(1); // should never be reached
47}
48
49
50/**********************************************************************/
58inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata) {
59
60 uint32_t reg_addr = addr;
61 uint32_t reg_data = wdata;
62 asm volatile ("sw %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
63}
64
65
66/**********************************************************************/
74inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata) {
75
76 uint32_t reg_addr = addr;
77 uint32_t reg_data = (uint32_t)wdata;
78 asm volatile ("sh %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
79}
80
81
82/**********************************************************************/
88inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata) {
89
90 uint32_t reg_addr = addr;
91 uint32_t reg_data = (uint32_t)wdata;
92 asm volatile ("sb %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
93}
94
95
96/**********************************************************************/
104inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_word(uint32_t addr) {
105
106 uint32_t reg_addr = addr;
107 uint32_t reg_data;
108 asm volatile ("lw %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
109 return reg_data;
110}
111
112
113/**********************************************************************/
121inline uint16_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_half(uint32_t addr) {
122
123 uint32_t reg_addr = addr;
124 uint16_t reg_data;
125 asm volatile ("lhu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
126 return reg_data;
127}
128
129
130/**********************************************************************/
138inline int16_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_half(uint32_t addr) {
139
140 uint32_t reg_addr = addr;
141 int16_t reg_data;
142 asm volatile ("lh %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
143 return reg_data;
144}
145
146
147/**********************************************************************/
153inline uint8_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_byte(uint32_t addr) {
154
155 uint32_t reg_addr = addr;
156 uint8_t reg_data;
157 asm volatile ("lbu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
158 return reg_data;
159}
160
161
162/**********************************************************************/
168inline int8_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_byte(uint32_t addr) {
169
170 uint32_t reg_addr = addr;
171 int8_t reg_data;
172 asm volatile ("lb %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
173 return reg_data;
174}
175
176
177/**********************************************************************/
183inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_read(const int csr_id) {
184
185 uint32_t csr_data;
186 asm volatile ("csrr %[dst], %[id]" : [dst] "=r" (csr_data) : [id] "i" (csr_id));
187 return csr_data;
188}
189
190
191/**********************************************************************/
197inline void __attribute__ ((always_inline)) neorv32_cpu_csr_write(const int csr_id, uint32_t data) {
198
199 uint32_t csr_data = data;
200 asm volatile ("csrw %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
201}
202
203
204/**********************************************************************/
210inline void __attribute__ ((always_inline)) neorv32_cpu_csr_set(const int csr_id, uint32_t mask) {
211
212 uint32_t csr_data = mask;
213 asm volatile ("csrs %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
214}
215
216
217/**********************************************************************/
223inline void __attribute__ ((always_inline)) neorv32_cpu_csr_clr(const int csr_id, uint32_t mask) {
224
225 uint32_t csr_data = mask;
226 asm volatile ("csrc %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
227}
228
229
230/**********************************************************************/
237inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata) {
238
239 uint32_t tmp;
240 asm volatile ("csrrw %[dst], %[id], %[src]" : [dst] "=r" (tmp) : [id] "i" (csr_id), [src] "r" (wdata));
241 return tmp;
242}
243
244
245/**********************************************************************/
251inline void __attribute__ ((always_inline)) neorv32_cpu_sleep(void) {
252
253 asm volatile ("wfi");
254}
255
256
257/**********************************************************************/
266inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amolr(uint32_t addr) {
267
268#if defined __riscv_atomic
269 uint32_t amo_addr = addr;
270 uint32_t amo_rdata;
271
272 asm volatile ("lr.w %[dst], 0(%[addr])" : [dst] "=r" (amo_rdata) : [addr] "r" (amo_addr));
273
274 return amo_rdata;
275#else
276 (void)addr;
277
278 return 0;
279#endif
280}
281
282
283/**********************************************************************/
293inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
294
295#if defined __riscv_atomic
296 uint32_t amo_addr = addr;
297 uint32_t amo_wdata = wdata;
298 uint32_t amo_status;
299
300 asm volatile ("sc.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_status) : [src] "r" (amo_wdata), [addr] "r" (amo_addr));
301
302 return amo_status;
303#else
304 (void)addr;
305 (void)wdata;
306
307 return 1; // always fail
308#endif
309}
310
311
312#endif // NEORV32_CPU_H
#define NEORV32_CRT0_ENTRY
Definition neorv32.h:198
void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:58
void neorv32_cpu_set_mcycle(uint64_t value)
Definition neorv32_cpu.c:69
void neorv32_cpu_csr_set(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:210
uint32_t neorv32_cpu_pmp_get_num_regions(void)
Definition neorv32_cpu.c:130
void neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata)
Definition neorv32_cpu.h:74
int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:168
uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:121
uint64_t neorv32_cpu_get_instret(void)
Definition neorv32_cpu.c:86
uint32_t neorv32_cpu_load_unsigned_word(uint32_t addr)
Definition neorv32_cpu.h:104
void neorv32_cpu_set_minstret(uint64_t value)
Definition neorv32_cpu.c:111
void neorv32_cpu_soft_restart(void)
Definition neorv32_cpu.h:41
uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:293
uint32_t neorv32_cpu_hpm_get_num_counters(void)
Definition neorv32_cpu.c:282
void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:251
int neorv32_cpu_pmp_configure_region(int index, uint32_t addr, uint8_t config)
Definition neorv32_cpu.c:214
uint32_t neorv32_cpu_csr_read(const int csr_id)
Definition neorv32_cpu.h:183
void neorv32_cpu_csr_clr(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:223
uint64_t neorv32_cpu_get_cycle(void)
Definition neorv32_cpu.c:44
uint8_t neorv32_cpu_load_unsigned_byte(uint32_t addr)
Definition neorv32_cpu.h:153
uint32_t neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata)
Definition neorv32_cpu.h:237
uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:266
uint32_t neorv32_cpu_pmp_get_granularity(void)
Definition neorv32_cpu.c:174
uint32_t neorv32_cpu_hpm_get_size(void)
Definition neorv32_cpu.c:334
int16_t neorv32_cpu_load_signed_half(uint32_t addr)
Definition neorv32_cpu.h:138
void neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata)
Definition neorv32_cpu.h:88
void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:197