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/**********************************************************************/
44inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata) {
45
46 uint32_t reg_addr = addr;
47 uint32_t reg_data = wdata;
48 asm volatile ("sw %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
49}
50
51
52/**********************************************************************/
60inline 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));
65}
66
67
68/**********************************************************************/
74inline void __attribute__ ((always_inline)) neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata) {
75
76 uint32_t reg_addr = addr;
77 uint32_t reg_data = (uint32_t)wdata;
78 asm volatile ("sb %[da], 0(%[ad])" : : [da] "r" (reg_data), [ad] "r" (reg_addr));
79}
80
81
82/**********************************************************************/
90inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_word(uint32_t addr) {
91
92 uint32_t reg_addr = addr;
93 uint32_t reg_data;
94 asm volatile ("lw %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
95 return reg_data;
96}
97
98
99/**********************************************************************/
107inline uint16_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_half(uint32_t addr) {
108
109 uint32_t reg_addr = addr;
110 uint16_t reg_data;
111 asm volatile ("lhu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
112 return reg_data;
113}
114
115
116/**********************************************************************/
124inline 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));
129 return reg_data;
130}
131
132
133/**********************************************************************/
139inline uint8_t __attribute__ ((always_inline)) neorv32_cpu_load_unsigned_byte(uint32_t addr) {
140
141 uint32_t reg_addr = addr;
142 uint8_t reg_data;
143 asm volatile ("lbu %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
144 return reg_data;
145}
146
147
148/**********************************************************************/
154inline int8_t __attribute__ ((always_inline)) neorv32_cpu_load_signed_byte(uint32_t addr) {
155
156 uint32_t reg_addr = addr;
157 int8_t reg_data;
158 asm volatile ("lb %[da], 0(%[ad])" : [da] "=r" (reg_data) : [ad] "r" (reg_addr));
159 return reg_data;
160}
161
162
163/**********************************************************************/
169inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_csr_read(const int csr_id) {
170
171 uint32_t csr_data;
172 asm volatile ("csrr %[dst], %[id]" : [dst] "=r" (csr_data) : [id] "i" (csr_id));
173 return csr_data;
174}
175
176
177/**********************************************************************/
183inline 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
190/**********************************************************************/
196inline void __attribute__ ((always_inline)) neorv32_cpu_csr_set(const int csr_id, uint32_t mask) {
197
198 uint32_t csr_data = mask;
199 asm volatile ("csrs %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
200}
201
202
203/**********************************************************************/
209inline void __attribute__ ((always_inline)) neorv32_cpu_csr_clr(const int csr_id, uint32_t mask) {
210
211 uint32_t csr_data = mask;
212 asm volatile ("csrc %[id], %[src]" : : [id] "i" (csr_id), [src] "r" (csr_data));
213}
214
215
216/**********************************************************************/
222inline void __attribute__ ((always_inline)) neorv32_cpu_sleep(void) {
223
224 asm volatile ("wfi");
225}
226
227
228/**********************************************************************/
237inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amolr(uint32_t addr) {
238
239#if defined __riscv_atomic
240 uint32_t amo_addr = addr;
241 uint32_t amo_rdata;
242
243 asm volatile ("lr.w %[dst], 0(%[addr])" : [dst] "=r" (amo_rdata) : [addr] "r" (amo_addr));
244
245 return amo_rdata;
246#else
247 (void)addr;
248
249 return 0;
250#endif
251}
252
253
254/**********************************************************************/
264inline uint32_t __attribute__ ((always_inline)) neorv32_cpu_amosc(uint32_t addr, uint32_t wdata) {
265
266#if defined __riscv_atomic
267 uint32_t amo_addr = addr;
268 uint32_t amo_wdata = wdata;
269 uint32_t amo_status;
270
271 asm volatile ("sc.w %[dst], %[src], (%[addr])" : [dst] "=r" (amo_status) : [src] "r" (amo_wdata), [addr] "r" (amo_addr));
272
273 return amo_status;
274#else
275 (void)addr;
276 (void)wdata;
277
278 return 1; // always fail
279#endif
280}
281
282
283#endif // NEORV32_CPU_H
void neorv32_cpu_store_unsigned_word(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:44
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:196
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:60
int8_t neorv32_cpu_load_signed_byte(uint32_t addr)
Definition neorv32_cpu.h:154
uint16_t neorv32_cpu_load_unsigned_half(uint32_t addr)
Definition neorv32_cpu.h:107
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:90
void neorv32_cpu_set_minstret(uint64_t value)
Definition neorv32_cpu.c:111
uint32_t neorv32_cpu_amosc(uint32_t addr, uint32_t wdata)
Definition neorv32_cpu.h:264
uint32_t neorv32_cpu_hpm_get_num_counters(void)
Definition neorv32_cpu.c:282
void neorv32_cpu_sleep(void)
Definition neorv32_cpu.h:222
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:169
void neorv32_cpu_csr_clr(const int csr_id, uint32_t mask)
Definition neorv32_cpu.h:209
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:139
uint32_t neorv32_cpu_amolr(uint32_t addr)
Definition neorv32_cpu.h:237
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:124
void neorv32_cpu_store_unsigned_byte(uint32_t addr, uint8_t wdata)
Definition neorv32_cpu.h:74
void neorv32_cpu_csr_write(const int csr_id, uint32_t data)
Definition neorv32_cpu.h:183