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/**********************************************************************/
42inline void __attribute__ ((always_inline)) neorv32_cpu_soft_restart(void) {
43
44 uint32_t sw_boot_addr = NEORV32_CRT0_ENTRY; // linker symbol
45 asm volatile ("jalr x0, 0(%[dst])" : : [dst] "r" (sw_boot_addr));
46 __builtin_unreachable();
47 while(1); // should never be reached
48}
49
50
51/**********************************************************************/
59inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata) {
60
61 uint32_t reg_addr = addr;
62 uint32_t reg_data = wdata;
63 asm volatile ("sw %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
64}
65
66
67/**********************************************************************/
75inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata) {
76
77 uint32_t reg_addr = addr;
78 uint32_t reg_data = (uint32_t)wdata;
79 asm volatile ("sh %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
80}
81
82
83/**********************************************************************/
89inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata) {
90
91 uint32_t reg_addr = addr;
92 uint32_t reg_data = (uint32_t)wdata;
93 asm volatile ("sb %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
94}
95
96
97/**********************************************************************/
105inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_word(uint32_t addr) {
106
107 uint32_t reg_addr = addr;
108 uint32_t reg_data;
109 asm volatile ("lw %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
110 return reg_data;
111}
112
113
114/**********************************************************************/
122inline uint16_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_half(uint32_t addr) {
123
124 uint32_t reg_addr = addr;
125 uint16_t reg_data;
126 asm volatile ("lhu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
127 return reg_data;
128}
129
130
131/**********************************************************************/
139inline int16_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_half(uint32_t addr) {
140
141 uint32_t reg_addr = addr;
142 int16_t reg_data;
143 asm volatile ("lh %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
144 return reg_data;
145}
146
147
148/**********************************************************************/
154inline uint8_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_byte(uint32_t addr) {
155
156 uint32_t reg_addr = addr;
157 uint8_t reg_data;
158 asm volatile ("lbu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
159 return reg_data;
160}
161
162
163/**********************************************************************/
169inline int8_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_byte(uint32_t addr) {
170
171 uint32_t reg_addr = addr;
172 int8_t reg_data;
173 asm volatile ("lb %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
174 return reg_data;
175}
176
177
178/**********************************************************************/
184inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_read(const int csr_id) {
185
186 uint32_t csr_data;
187 asm volatile ("csrr %[dst], %[id]" : [dst] "=r" (csr_data) : [id] "i" (csr_id));
188 return csr_data;
189}
190
191
192/**********************************************************************/
198inline void __attribute__ ((always_inline)) neorv32_cpu_csr_write(const int csr_id, uint32_t data) {
199
200 uint32_t csr_data = data;
201 asm volatile ("csrw %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
202}
203
204
205/**********************************************************************/
211inline void __attribute__ ((always_inline)) neorv32_cpu_csr_set(const int csr_id, uint32_t mask) {
212
213 uint32_t csr_data = mask;
214 asm volatile ("csrs %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
215}
216
217
218/**********************************************************************/
224inline void __attribute__ ((always_inline)) neorv32_cpu_csr_clr(const int csr_id, uint32_t mask) {
225
226 uint32_t csr_data = mask;
227 asm volatile ("csrc %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
228}
229
230
231/**********************************************************************/
238inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata) {
239
240 uint32_t tmp;
241 asm volatile ("csrrw %[dst], %[id], %[src]" : [dst] "=r" (tmp) : [id] "i" (csr_id), [src] "r" (wdata));
242 return tmp;
243}
244
245
246/**********************************************************************/
252inline void __attribute__ ((always_inline)) neorv32_cpu_sleep(void) {
253
254 asm volatile ("wfi");
255}
256
257
258/**********************************************************************/
267inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amolr(uint32_t addr) {
268
269#if defined __riscv_atomic
270 uint32_t amo_addr = addr;
271 uint32_t amo_rdata;
272
273 asm volatile ("lr.w %[dst], 0(%[addr])" : [dst] "=r" (amo_rdata) : [addr] "r" (amo_addr));
274
275 return amo_rdata;
276#else
277 (void)addr;
278
279 return 0;
280#endif
281}
282
283
284/**********************************************************************/
294inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
295
296#if defined __riscv_atomic
297 uint32_t amo_addr = addr;
298 uint32_t amo_wdata = wdata;
299 uint32_t amo_status;
300
301 asm volatile ("sc.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_status) : [src] "r" (amo_wdata), [addr] "r" (amo_addr));
302
303 return amo_status;
304#else
305 (void)addr;
306 (void)wdata;
307
308 return 1; // always fail
309#endif
310}
311
312
313#endif // NEORV32_CPU_H
#define NEORV32_CRT0_ENTRY
Definition neorv32.h:183
void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:59
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:211
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:75
int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:169
uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:122
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:105
void neorv32_cpu_set_minstret(uint64_t value)
Definition neorv32_cpu.c:111
void neorv32_cpu_soft_restart(void)
Definition neorv32_cpu.h:42
uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:294
uint32_t neorv32_cpu_hpm_get_num_counters(void)
Definition neorv32_cpu.c:282
void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:252
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:184
void neorv32_cpu_csr_clr(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:224
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:154
uint32_t neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata)
Definition neorv32_cpu.h:238
uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:267
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:139
void neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata)
Definition neorv32_cpu.h:89
void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:198