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) 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 <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);
36
37// ================================================================================================
38// Inline Load/Store
39// ================================================================================================
40
41/**********************************************************************/
47static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata) {
48
49 uint32_t reg_addr = addr;
50 uint32_t reg_data = wdata;
51 asm volatile ("sw %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
52}
53
54/**********************************************************************/
60static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata) {
61
62 uint32_t reg_addr = addr;
63 uint32_t reg_data = (uint32_t)wdata;
64 asm volatile ("sh %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
65}
66
67/**********************************************************************/
73static inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata) {
74
75 uint32_t reg_addr = addr;
76 uint32_t reg_data = (uint32_t)wdata;
77 asm volatile ("sb %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr) : "memory");
78}
79
80/**********************************************************************/
86static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_word(uint32_t addr) {
87
88 uint32_t reg_addr = addr;
89 uint32_t reg_data;
90 asm volatile ("lw %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
91 return reg_data;
92}
93
94/**********************************************************************/
100static inline uint16_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_half(uint32_t addr) {
101
102 uint32_t reg_addr = addr;
103 uint16_t reg_data;
104 asm volatile ("lhu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
105 return reg_data;
106}
107
108/**********************************************************************/
114static inline int16_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_half(uint32_t addr) {
115
116 uint32_t reg_addr = addr;
117 int16_t reg_data;
118 asm volatile ("lh %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
119 return reg_data;
120}
121
122/**********************************************************************/
128static inline uint8_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_byte(uint32_t addr) {
129
130 uint32_t reg_addr = addr;
131 uint8_t reg_data;
132 asm volatile ("lbu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
133 return reg_data;
134}
135
136/**********************************************************************/
142static inline int8_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_byte(uint32_t addr) {
143
144 uint32_t reg_addr = addr;
145 int8_t reg_data;
146 asm volatile ("lb %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr) : "memory");
147 return reg_data;
148}
149
150// ================================================================================================
151// Inline CSR Access
152// ================================================================================================
153
154/**********************************************************************/
160static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_read(const int csr_id) {
161
162 uint32_t csr_data;
163 asm volatile ("csrr %[dst], %[id]" : [dst] "=r" (csr_data) : [id] "i" (csr_id));
164 return csr_data;
165}
166
167/**********************************************************************/
173static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_write(const int csr_id, uint32_t data) {
174
175 uint32_t csr_data = data;
176 asm volatile ("csrw %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
177}
178
179/**********************************************************************/
185static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_set(const int csr_id, uint32_t mask) {
186
187 uint32_t csr_data = mask;
188 asm volatile ("csrs %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
189}
190
191/**********************************************************************/
197static inline void __attribute__ ((always_inline)) neorv32_cpu_csr_clr(const int csr_id, uint32_t mask) {
198
199 uint32_t csr_data = mask;
200 asm volatile ("csrc %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
201}
202
203/**********************************************************************/
210static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata) {
211
212 uint32_t tmp;
213 asm volatile ("csrrw %[dst], %[id], %[src]" : [dst] "=r" (tmp) : [id] "i" (csr_id), [src] "r" (wdata));
214 return tmp;
215}
216
217// ================================================================================================
218// Inline Atomic Memory Access
219// ================================================================================================
220
221/**********************************************************************/
227static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amolr(uint32_t addr) {
228
229 uint32_t amo_addr = addr;
230 uint32_t amo_rdata;
231
232 asm volatile ("lr.w %[dst], 0(%[addr])" : [dst] "=r" (amo_rdata) : [addr] "r" (amo_addr) : "memory");
233
234 return amo_rdata;
235}
236
237/**********************************************************************/
244static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
245
246 uint32_t amo_addr = addr;
247 uint32_t amo_wdata = wdata;
248 uint32_t amo_status;
249
250 asm volatile ("sc.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_status) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
251
252 return amo_status;
253}
254
255/**********************************************************************/
262static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoswap(uint32_t addr, uint32_t wdata) {
263
264 uint32_t amo_addr = addr;
265 uint32_t amo_wdata = wdata;
266 uint32_t amo_rdata;
267
268 asm volatile ("amoswap.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
269
270 return amo_rdata;
271}
272
273/**********************************************************************/
280static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoadd(uint32_t addr, uint32_t wdata) {
281
282 uint32_t amo_addr = addr;
283 uint32_t amo_wdata = wdata;
284 uint32_t amo_rdata;
285
286 asm volatile ("amoadd.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
287
288 return amo_rdata;
289}
290
291/**********************************************************************/
298static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoxor(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 ("amoxor.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/**********************************************************************/
316static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoand(uint32_t addr, uint32_t wdata) {
317
318 uint32_t amo_addr = addr;
319 uint32_t amo_wdata = wdata;
320 uint32_t amo_rdata;
321
322 asm volatile ("amoand.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
323
324 return amo_rdata;
325}
326
327/**********************************************************************/
334static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amoor(uint32_t addr, uint32_t wdata) {
335
336 uint32_t amo_addr = addr;
337 uint32_t amo_wdata = wdata;
338 uint32_t amo_rdata;
339
340 asm volatile ("amoor.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
341
342 return amo_rdata;
343}
344
345/**********************************************************************/
352static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomin(uint32_t addr, uint32_t wdata) {
353
354 uint32_t amo_addr = addr;
355 uint32_t amo_wdata = wdata;
356 uint32_t amo_rdata;
357
358 asm volatile ("amomin.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
359
360 return amo_rdata;
361}
362
363/**********************************************************************/
370static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomax(uint32_t addr, uint32_t wdata) {
371
372 uint32_t amo_addr = addr;
373 uint32_t amo_wdata = wdata;
374 uint32_t amo_rdata;
375
376 asm volatile ("amomax.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
377
378 return amo_rdata;
379}
380
381/**********************************************************************/
388static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amominu(uint32_t addr, uint32_t wdata) {
389
390 uint32_t amo_addr = addr;
391 uint32_t amo_wdata = wdata;
392 uint32_t amo_rdata;
393
394 asm volatile ("amominu.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
395
396 return amo_rdata;
397}
398
399/**********************************************************************/
406static inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amomaxu(uint32_t addr, uint32_t wdata) {
407
408 uint32_t amo_addr = addr;
409 uint32_t amo_wdata = wdata;
410 uint32_t amo_rdata;
411
412 asm volatile ("amomaxu.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_rdata) : [src] "r" (amo_wdata), [addr] "r" (amo_addr) : "memory");
413
414 return amo_rdata;
415}
416
417// ================================================================================================
418// Inline Misc
419// ================================================================================================
420
421/**********************************************************************/
427static inline void __attribute__ ((always_inline)) neorv32_cpu_sleep(void) {
428
429 asm volatile ("wfi");
430}
431
432#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:406
static uint32_t neorv32_cpu_csr_read(const int csr_id)
Definition neorv32_cpu.h:160
static uint32_t neorv32_cpu_amomin(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:352
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:197
static void neorv32_cpu_store_unsigned_half(uint32_t addr, uint16_t wdata)
Definition neorv32_cpu.h:60
static uint32_t neorv32_cpu_amoadd(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:280
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:388
static uint32_t neorv32_cpu_load_unsigned_word(uint32_t addr)
Definition neorv32_cpu.h:86
static uint32_t neorv32_cpu_amoxor(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:298
static uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:227
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:73
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:316
static uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:100
static uint8_t neorv32_cpu_load_unsigned_byte(uint32_t addr)
Definition neorv32_cpu.h:128
static void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:173
static uint32_t neorv32_cpu_amoswap(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:262
static void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:427
static uint32_t neorv32_cpu_csr_swap(const int csr_id, uint32_t wdata)
Definition neorv32_cpu.h:210
static uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:244
static uint32_t neorv32_cpu_amomax(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:370
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:185
static int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:142
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:334
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:114
static void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:47