API Reference
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 - 2026 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
14#ifndef NEORV32_CPU_H
15#define NEORV32_CPU_H
16
17#include <neorv32.h>
18#include <stdint.h>
19
20/**********************************************************************/
24uint64_t neorv32_cpu_get_cycle(void);
25void neorv32_cpu_set_mcycle(uint64_t value);
26uint64_t neorv32_cpu_get_time(void);
27uint64_t neorv32_cpu_get_instret(void);
28void neorv32_cpu_set_minstret(uint64_t value);
31int neorv32_cpu_pmp_configure_region(int index, uint32_t addr, uint8_t config);
33uint32_t neorv32_cpu_hpm_get_size(void);
37// ================================================================================================
38// Inline Load/Store
39// ================================================================================================
40
41/**********************************************************************/
49static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata) {
50
51 uint32_t reg_addr = addr;
52 uint32_t reg_data = wdata;
53 asm volatile ("sw %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
54}
55
56/**********************************************************************/
64static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata) {
65
66 uint32_t reg_addr = addr;
67 uint32_t reg_data = (uint32_t)wdata;
68 asm volatile ("sh %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
69}
70
71/**********************************************************************/
77static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata) {
78
79 uint32_t reg_addr = addr;
80 uint32_t reg_data = (uint32_t)wdata;
81 asm volatile ("sb %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
82}
83
84/**********************************************************************/
92static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_word(uint32_t addr) {
93
94 uint32_t reg_addr = addr;
95 uint32_t reg_data;
96 asm volatile ("lw %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
97 return reg_data;
98}
99
100/**********************************************************************/
108static inline uint16_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_half(uint32_t addr) {
109
110 uint32_t reg_addr = addr;
111 uint16_t reg_data;
112 asm volatile ("lhu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
113 return reg_data;
114}
115
116/**********************************************************************/
124static inline int16_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_half(uint32_t addr) {
125
126 uint32_t reg_addr = addr;
127 int16_t reg_data;
128 asm volatile ("lh %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
129 return reg_data;
130}
131
132/**********************************************************************/
138static inline uint8_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_byte(uint32_t addr) {
139
140 uint32_t reg_addr = addr;
141 uint8_t reg_data;
142 asm volatile ("lbu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
143 return reg_data;
144}
145
146/**********************************************************************/
152static inline int8_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_byte(uint32_t addr) {
153
154 uint32_t reg_addr = addr;
155 int8_t reg_data;
156 asm volatile ("lb %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
157 return reg_data;
158}
159
160// ================================================================================================
161// Inline CSR Access
162// ================================================================================================
163
164/**********************************************************************/
170static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_read(const int csr_id) {
171
172 uint32_t csr_data;
173 asm volatile ("csrr %[dst], %[id]" : [dst] "=r" (csr_data) : [id] "i" (csr_id));
174 return csr_data;
175}
176
177/**********************************************************************/
183static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_write(const int csr_id, uint32_t data) {
184
185 uint32_t csr_data = data;
186 asm volatile ("csrw %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
187}
188
189/**********************************************************************/
195static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_set(const int csr_id, uint32_t mask) {
196
197 uint32_t csr_data = mask;
198 asm volatile ("csrs %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
199}
200
201/**********************************************************************/
207static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_clr(const int csr_id, uint32_t mask) {
208
209 uint32_t csr_data = mask;
210 asm volatile ("csrc %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
211}
212
213/**********************************************************************/
220static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata) {
221
222 uint32_t tmp;
223 asm volatile ("csrrw %[dst], %[id], %[src]" : [dst] "=r" (tmp) : [id] "i" (csr_id), [src] "r" (wdata));
224 return tmp;
225}
226
227// ================================================================================================
228// Inline Atomic Memory Access
229// ================================================================================================
230
231/**********************************************************************/
239static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amolr(uint32_t addr) {
240
241 uint32_t amo_addr = addr;
242 uint32_t amo_rdata;
243
244 asm volatile ("lr.w %[dst], 0(%[addr])" : [dst] "=r" (amo_rdata) : [addr] "r" (amo_addr) : "memory");
245
246 return amo_rdata;
247}
248
249/**********************************************************************/
258static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
259
260 uint32_t amo_addr = addr;
261 uint32_t amo_wdata = wdata;
262 uint32_t amo_status;
263
264 asm volatile ("sc.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_status) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
265
266 return amo_status;
267}
268
269/**********************************************************************/
278static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoswap(uint32_t addr, uint32_t wdata) {
279
280 uint32_t amo_addr = addr;
281 uint32_t amo_wdata = wdata;
282 uint32_t amo_rdata;
283
284 asm volatile ("amoswap.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
285
286 return amo_rdata;
287}
288
289/**********************************************************************/
298static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoadd(uint32_t addr, uint32_t wdata) {
299
300 uint32_t amo_addr = addr;
301 uint32_t amo_wdata = wdata;
302 uint32_t amo_rdata;
303
304 asm volatile ("amoadd.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
305
306 return amo_rdata;
307}
308
309/**********************************************************************/
318static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoxor(uint32_t addr, uint32_t wdata) {
319
320 uint32_t amo_addr = addr;
321 uint32_t amo_wdata = wdata;
322 uint32_t amo_rdata;
323
324 asm volatile ("amoxor.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
325
326 return amo_rdata;
327}
328
329/**********************************************************************/
338static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoand(uint32_t addr, uint32_t wdata) {
339
340 uint32_t amo_addr = addr;
341 uint32_t amo_wdata = wdata;
342 uint32_t amo_rdata;
343
344 asm volatile ("amoand.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
345
346 return amo_rdata;
347}
348
349/**********************************************************************/
358static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoor(uint32_t addr, uint32_t wdata) {
359
360 uint32_t amo_addr = addr;
361 uint32_t amo_wdata = wdata;
362 uint32_t amo_rdata;
363
364 asm volatile ("amoor.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
365
366 return amo_rdata;
367}
368
369/**********************************************************************/
378static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomin(uint32_t addr, uint32_t wdata) {
379
380 uint32_t amo_addr = addr;
381 uint32_t amo_wdata = wdata;
382 uint32_t amo_rdata;
383
384 asm volatile ("amomin.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
385
386 return amo_rdata;
387}
388
389/**********************************************************************/
398static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomax(uint32_t addr, uint32_t wdata) {
399
400 uint32_t amo_addr = addr;
401 uint32_t amo_wdata = wdata;
402 uint32_t amo_rdata;
403
404 asm volatile ("amomax.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
405
406 return amo_rdata;
407}
408
409/**********************************************************************/
418static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amominu(uint32_t addr, uint32_t wdata) {
419
420 uint32_t amo_addr = addr;
421 uint32_t amo_wdata = wdata;
422 uint32_t amo_rdata;
423
424 asm volatile ("amominu.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
425
426 return amo_rdata;
427}
428
429/**********************************************************************/
438static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomaxu(uint32_t addr, uint32_t wdata) {
439
440 uint32_t amo_addr = addr;
441 uint32_t amo_wdata = wdata;
442 uint32_t amo_rdata;
443
444 asm volatile ("amomaxu.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
445
446 return amo_rdata;
447}
448
449// ================================================================================================
450// Inline Misc
451// ================================================================================================
452
453/**********************************************************************/
459static inline void __attribute__ ((always_inline)) neorv32_cpu_sleep(void) {
460
461 asm volatile ("wfi");
462}
463
464#endif // NEORV32_CPU_H
Main NEORV32 core library / driver / HAL include file.
static uint32_t neorv32_cpu_amomaxu(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:438
static uint32_t neorv32_cpu_csr_read(const int csr_id)
Definition neorv32_cpu.h:170
static uint32_t neorv32_cpu_amomin(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:378
void neorv32_cpu_set_mcycle(uint64_t value)
Definition neorv32_cpu.c:43
uint32_t neorv32_cpu_pmp_get_num_regions(void)
Definition neorv32_cpu.c:120
static void neorv32_cpu_csr_clr(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:207
static void neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata)
Definition neorv32_cpu.h:64
static uint32_t neorv32_cpu_amoadd(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:298
uint64_t neorv32_cpu_get_instret(void)
Definition neorv32_cpu.c:81
static uint32_t neorv32_cpu_amominu(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:418
static uint32_t neorv32_cpu_load_unsigned_word(uint32_t addr)
Definition neorv32_cpu.h:92
static uint32_t neorv32_cpu_amoxor(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:318
static uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:239
void neorv32_cpu_set_minstret(uint64_t value)
Definition neorv32_cpu.c:104
static void neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata)
Definition neorv32_cpu.h:77
uint32_t neorv32_cpu_hpm_get_num_counters(void)
Definition neorv32_cpu.c:259
static uint32_t neorv32_cpu_amoand(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:338
static uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:108
static uint8_t neorv32_cpu_load_unsigned_byte(uint32_t addr)
Definition neorv32_cpu.h:138
static void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:183
static uint32_t neorv32_cpu_amoswap(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:278
static void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:459
static uint32_t neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata)
Definition neorv32_cpu.h:220
static uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:258
static uint32_t neorv32_cpu_amomax(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:398
int neorv32_cpu_pmp_configure_region(int index, uint32_t addr, uint8_t config)
Definition neorv32_cpu.c:194
int neorv32_cpu_hwtrig_get_number(void)
Definition neorv32_cpu.c:378
static void neorv32_cpu_csr_set(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:195
static int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:152
uint64_t neorv32_cpu_get_cycle(void)
Definition neorv32_cpu.c:20
uint64_t neorv32_cpu_get_time(void)
Definition neorv32_cpu.c:58
static uint32_t neorv32_cpu_amoor(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:358
uint32_t neorv32_cpu_pmp_get_granularity(void)
Definition neorv32_cpu.c:157
uint32_t neorv32_cpu_hpm_get_size(void)
Definition neorv32_cpu.c:340
static int16_t neorv32_cpu_load_signed_half(uint32_t addr)
Definition neorv32_cpu.h:124
static void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:49