OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [software.adoc] - Blame information for rev 62

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 zero_gravi
:sectnums:
2
== Software Framework
3
 
4
To make actual use of the NEORV32 processor, the project comes with a complete software eco-system. This
5
ecosystem is based on the RISC-V port of the GCC GNU Compiler Collection and consists of the following elementary parts:
6
 
7
[cols="<6,<4"]
8
[grid="none"]
9
|=======================
10
| Application/bootloader start-up code | `sw/common/crt0.S`
11
| Application/bootloader linker script | `sw/common/neorv32.ld`
12
| Core hardware driver libraries | `sw/lib/include/` & `sw/lib/source/`
13 62 zero_gravi
| Central makefile | `sw/common/common.mk`
14 60 zero_gravi
| Auxiliary tool for generating NEORV32 executables | `sw/image_gen/`
15
| Default bootloader | `sw/bootloader/bootloader.c`
16
|=======================
17
 
18
Last but not least, the NEORV32 ecosystem provides some example programs for testing the hardware, for
19
illustrating the usage of peripherals and for general getting in touch with the project (`sw/example`).
20
 
21
// ####################################################################################################################
22
:sectnums:
23
=== Compiler Toolchain
24
 
25
The toolchain for this project is based on the free RISC-V GCC-port. You can find the compiler sources and
26
build instructions on the official RISC-V GNU toolchain GitHub page: https://github.com/riscv/riscv-gnutoolchain.
27
 
28
The NEORV32 implements a 32-bit base integer architecture (`rv32i`) and a 32-bit integer and soft-float ABI
29
(ilp32), so make sure you build an according toolchain.
30
 
31
Alternatively, you can download my prebuilt `rv32i/e` toolchains for 64-bit x86 Linux from: https://github.com/stnolting/riscv-gcc-prebuilt
32
 
33
The default toolchain prefix used by the project's makefiles is (can be changed in the makefiles): **`riscv32-unknown-elf`**
34
 
35
[TIP]
36
More information regarding the toolchain (building from scratch or downloading the prebuilt ones)
37 61 zero_gravi
can be found in the user guides' section https://stnolting.github.io/neorv32/ug/#_software_toolchain_setup[Software Toolchain Setup].
38 60 zero_gravi
 
39
 
40
 
41
<<<
42
// ####################################################################################################################
43
:sectnums:
44
=== Core Libraries
45
 
46
The NEORV32 project provides a set of C libraries that allows an easy usage of the processor/CPU features.
47
Just include the main NEORV32 library file in your application's source file(s):
48
 
49
[source,c]
50
----
51
#include 
52
----
53
 
54
Together with the makefile, this will automatically include all the processor's header files located in
55
`sw/lib/include` into your application. The actual source files of the core libraries are located in
56
`sw/lib/source` and are automatically included into the source list of your software project. The following
57
files are currently part of the NEORV32 core library:
58
 
59
[cols="<3,<4,<8"]
60
[options="header",grid="rows"]
61
|=======================
62
| C source file | C header file | Description
63
| -                  | `neorv32.h`            | main NEORV32 definitions and library file
64
| `neorv32_cfs.c`    | `neorv32_cfs.h`        | HW driver (stub)footnote:[This driver file only represents a stub, since the real CFS drivers are defined by the actual CFS implementation.] functions for the custom functions subsystem
65
| `neorv32_cpu.c`    | `neorv32_cpu.h`        | HW driver functions for the NEORV32 **CPU**
66
| `neorv32_gpio.c`   | `neorv32_gpio.h`       | HW driver functions for the **GPIO**
67
| -                  | `neorv32_intrinsics.h` | macros for custom intrinsics/instructions
68
| `neorv32_mtime.c`  | `neorv32_mtime.h`      | HW driver functions for the **MTIME**
69
| `neorv32_neoled.c` | `neorv32_neoled.h`     | HW driver functions for the **NEOLED**
70
| `neorv32_pwm.c`    | `neorv32_pwm.h`        | HW driver functions for the **PWM**
71
| `neorv32_rte.c`    | `neorv32_rte.h`        | NEORV32 **runtime environment** and helpers
72
| `neorv32_spi.c`    | `neorv32_spi.h`        | HW driver functions for the **SPI**
73
| `neorv32_trng.c`   | `neorv32_trng.h`       | HW driver functions for the **TRNG**
74
| `neorv32_twi.c`    | `neorv32_twi.h`        | HW driver functions for the **TWI**
75
| `neorv32_uart.c`   | `neorv32_uart.h`       | HW driver functions for the **UART0** and **UART1**
76
| `neorv32_wdt.c`    | `neorv32_wdt.h`        | HW driver functions for the **WDT**
77
|=======================
78
 
79
.Documentation
80
[TIP]
81
All core library software sources are highly documented using _doxygen_. See section <>.
82
The documentation is automatically built and deployed to GitHub pages by the CI workflow (:https://stnolting.github.io/neorv32/sw/files.html).
83
 
84
 
85
 
86
 
87
<<<
88
// ####################################################################################################################
89
:sectnums:
90
=== Application Makefile
91
 
92 62 zero_gravi
Application compilation is based on a single, centralized **GNU makefiles** `sw/common/common.mk`. Each project in the
93
`sw/example` folder features a makefile that just includes this central makefile. When creating a new project, copy an existing project folder or
94 60 zero_gravi
at least the makefile to your new project folder. I suggest to create new projects also in `sw/example` to keep
95
the file dependencies. Of course, these dependencies can be manually configured via makefiles variables
96
when your project is located somewhere else.
97
 
98 62 zero_gravi
[NOTE]
99 60 zero_gravi
Before you can use the makefiles, you need to install the RISC-V GCC toolchain. Also, you have to add the
100 62 zero_gravi
installation folder of the compiler to your system's `PATH` variable. More information can be found in
101
https://stnolting.github.io/neorv32/ug/#_software_toolchain_setup[User Guide: Software Toolchain Setup].
102 60 zero_gravi
 
103
The makefile is invoked by simply executing make in your console:
104
 
105
[source,bash]
106
----
107
neorv32/sw/example/blink_led$ make
108
----
109
 
110
:sectnums:
111
==== Targets
112
 
113 62 zero_gravi
Just executing `make` (or executing `make help`) will show the help menu listing all available targets.
114 60 zero_gravi
 
115 62 zero_gravi
[source,makefile]
116
----
117
$ make
118
<<< NEORV32 Application Makefile >>>
119
Make sure to add the bin folder of RISC-V GCC to your PATH variable.
120
Targets:
121
 help       - show this text
122
 check      - check toolchain
123
 info       - show makefile/toolchain configuration
124
 exe        - compile and generate  executable for upload via bootloader
125
 hex        - compile and generate  executable raw file
126
 install    - compile, generate and install VHDL IMEM boot image (for application)
127
 all        - exe + hex + install
128
 elf_info   - show ELF layout info
129
 clean      - clean up project
130
 clean_all  - clean up project, core libraries and image generator
131
 bootloader - compile, generate and install VHDL BOOTROM boot image (for bootloader only!)
132
----
133 60 zero_gravi
 
134
 
135
:sectnums:
136
==== Configuration
137
 
138 62 zero_gravi
The compilation flow is configured via variables right at the beginning of the **central**
139
makefile (`sw/common/common.mk`):
140 60 zero_gravi
 
141 62 zero_gravi
[TIP]
142
The makefile configuration variables can be (re-)defined directly when invoking the makefile. For
143
example via `$ make MARCH=-march=rv32ic clean_all exe`. You can also make project-specific definitions
144
of all variables inside the project's actual makefile (e.g., `sw/example/blink_led/makefile`).
145
 
146 60 zero_gravi
[source,makefile]
147
----
148
# *****************************************************************************
149
# USER CONFIGURATION
150
# *****************************************************************************
151
# User's application sources (*.c, *.cpp, *.s, *.S); add additional files here
152
APP_SRC ?= $(wildcard ./*.c) $(wildcard ./*.s) $(wildcard ./*.cpp) $(wildcard ./*.S)
153
# User's application include folders (don't forget the '-I' before each entry)
154
APP_INC ?= -I .
155
# User's application include folders - for assembly files only (don't forget the '-I' before each
156
entry)
157
ASM_INC ?= -I .
158
# Optimization
159
EFFORT ?= -Os
160
# Compiler toolchain
161 62 zero_gravi
RISCV_PREFIX ?= riscv32-unknown-elf-
162 60 zero_gravi
# CPU architecture and ABI
163
MARCH ?= -march=rv32i
164
MABI  ?= -mabi=ilp32
165
# User flags for additional configuration (will be added to compiler flags)
166
USER_FLAGS ?=
167
# Relative or absolute path to the NEORV32 home folder
168
NEORV32_HOME ?= ../../..
169
# *****************************************************************************
170
----
171
 
172
[cols="<3,<10"]
173
[grid="none"]
174
|=======================
175
| _APP_SRC_         | The source files of the application (`*.c`, `*.cpp`, `*.S` and `*.s` files are allowed; file of these types in the project folder are automatically added via wildcards). Additional files can be added; separated by white spaces
176
| _APP_INC_         | Include file folders; separated by white spaces; must be defined with `-I` prefix
177
| _ASM_INC_         | Include file folders that are used only for the assembly source files (`*.S`/`*.s`).
178
| _EFFORT_          | Optimization level, optimize for size (`-Os`) is default; legal values: `-O0`, `-O1`, `-O2`, `-O3`, `-Os`
179 62 zero_gravi
| _RISCV_PREFIX_    | The toolchain prefix to be used; follows the naming convention "architecture-vendor-output-"
180
| _MARCH_           | The targetd RISC-V architecture/ISA. Only `rv32` is supported by the NEORV32. Enable compiler support of optional CPU extension by adding the according extension letter (e.g. `rv32im` for _M_ CPU extension). See https://stnolting.github.io/neorv32/ug/#_enabling_risc_v_cpu_extensions[User Guide: Enabling RISC-V CPU Extensions] for more information.
181 60 zero_gravi
| _MABI_            | The default 32-bit integer ABI.
182
| _USER_FLAGS_      | Additional flags that will be forwarded to the compiler tools
183
| _NEORV32_HOME_    | Relative or absolute path to the NEORV32 project home folder. Adapt this if the makefile/project is not in the project's `sw/example folder`.
184
| _COM_PORT_        | Default serial port for executable upload to bootloader.
185
|=======================
186
 
187
:sectnums:
188
==== Default Compiler Flags
189
 
190
The following default compiler flags are used for compiling an application. These flags are defined via the
191
`CC_OPTS` variable. Custom flags can be appended via the `USER_FLAGS` variable to the `CC_OPTS` variable.
192
 
193
[cols="<3,<9"]
194
[grid="none"]
195
|=======================
196
| `-Wall` | Enable all compiler warnings.
197
| `-ffunction-sections` | Put functions and data segment in independent sections. This allows a code optimization as dead code and unused data can be easily removed.
198
| `-nostartfiles` | Do not use the default start code. The makefiles use the NEORV32-specific start-up code instead (`sw/common/crt0.S`).
199
| `-Wl,--gc-sections` | Make the linker perform dead code elimination.
200
| `-lm` | Include/link with `math.h`.
201
| `-lc` | Search for the standard C library when linking.
202
| `-lgcc` | Make sure we have no unresolved references to internal GCC library subroutines.
203
| `-mno-fdiv` | Use builtin software functions for floating-point divisions and square roots (since the according instructions are not supported yet).
204
| `-falign-functions=4` .4+| Force a 32-bit alignment of functions and labels (branch/jump/call targets). This increases performance as it simplifies instruction fetch when using the C extension. As a drawback this will also slightly increase the program code.
205
| `-falign-labels=4`
206
| `-falign-loops=4`
207
| `-falign-jumps=4`
208
|=======================
209
 
210
 
211
 
212
<<<
213
// ####################################################################################################################
214
:sectnums:
215
=== Executable Image Format
216
 
217 61 zero_gravi
In order to generate a file, which can be executed by the processor, all source files have to be compiler, linked
218
and packed into a final _executable_.
219 60 zero_gravi
 
220 61 zero_gravi
:sectnums:
221
==== Linker Script
222
 
223
When all the application sources have been compiled, they need to be _linked_ in order to generate a unified
224
program file. For this purpose the makefile uses the NEORV32-specific linker script `sw/common/neorv32.ld` for
225
linking all object files that were generated during compilation.
226
 
227
The linker script defines three memory _sections_: `rom`, `ram` and `iodev`. Each section provides specific
228
access _attributes_: read access (`r`), write access (`w`) and executable (`x`).
229
 
230
.Linker memory sections - general
231 60 zero_gravi
[cols="<2,^1,<7"]
232
[options="header",grid="rows"]
233
|=======================
234
| Memory section  | Attributes | Description
235 61 zero_gravi
| `ram`           | `rwx`      | Data memory address space (processor-internal/external DMEM)
236
| `rom`           | `rx`       | Instruction memory address space (processor-internal/external IMEM) _or_ internal bootloader ROM
237
| `iodev`         | `rw`       | Processor-internal memory-mapped IO/peripheral devices address space
238 60 zero_gravi
|=======================
239
 
240 61 zero_gravi
These sections are defined right at the beginning of the linker script:
241 60 zero_gravi
 
242 61 zero_gravi
.Linker memory sections - cut-out from linker script `neorv32.ld`
243
[source,c]
244
----
245
MEMORY
246
{
247
  ram  (rwx) : ORIGIN = 0x80000000, LENGTH = DEFINED(make_bootloader) ? 512 : 8*1024
248
  rom   (rx) : ORIGIN = DEFINED(make_bootloader) ? 0xFFFF0000 : 0x00000000, LENGTH = DEFINED(make_bootloader) ? 32K : 2048M
249
  iodev (rw) : ORIGIN = 0xFFFFFE00, LENGTH = 512
250
}
251
----
252 60 zero_gravi
 
253 61 zero_gravi
Each memory section provides a _base address_ `ORIGIN` and a _size_ `LENGTH`. The base address and size of the `iodev` section is
254
fixed and must not be altered. The base addresses and sizes of the `ram` and `rom` regions correspond to the total available instruction
255
and data memory address space (see section <<_address_space_layout>>).
256 60 zero_gravi
 
257 61 zero_gravi
[IMPORTANT]
258
`ORIGIN` of the `ram` section has to be always identical to the processor's `dspace_base_c` hardware configuration. Additionally,
259
`ORIGIN` of the `rom` section has to be always identical to the processor's `ispace_base_c` hardware configuration.
260
 
261
The sizes of `ram` section has to be equal to the size of the **physical available data instruction memory**. For example, if the processor
262
setup only uses processor-internal DMEM (<<_mem_int_dmem_en>> = _true_ and no external data memory attached) the `LENGTH` parameter of
263
this memory section has to be equal to the size configured by the <<_mem_int_dmem_size>> generic.
264
 
265
The sizes of `rom` section is a little bit more complicated. The default linker script configuration assumes a _maximum_ of 2GB _logical_
266
memory space, which is also the default configuration of the processor's hardware instruction memory address space. This size _does not_ have
267
to reflect the _actual_ physical size of the instruction memory (internal IMEM and/or processor-external memory). It just provides a maximum
268
limit. When uploading new executable via the bootloader, the bootloader itself checks if sufficient _physical_ instruction memory is available.
269
If a new executable is embedded right into the internal-IMEM the synthesis tool will check, if the configured instruction memory size
270
is sufficient (e.g., via the <<_mem_int_imem_size>> generic).
271
 
272
[IMPORTANT]
273
The `rom` region uses a conditional assignment (via the `make_bootloader` symbol) for `ORIGIN` and `LENGTH` that is used to place
274
"normal executable" (i.e. for the IMEM) or "the bootloader image" to their according memories. +
275
 +
276
The `ram` region also uses a conditional assignment (via the `make_bootloader` symbol) for `LENGTH`. When compiling the bootloader
277
(`make_bootloader` symbol is set) the generated bootloader will only use the _first_ 512 bytes of the data address space. This is
278
a fall-back to ensure the bootloader can operate independently of the actual _physical_ data memory size.
279
 
280
The linker maps all the regions from the compiled object files into four final sections: `.text`, `.rodata`, `.data` and `.bss`.
281
These four regions contain everything required for the application to run:
282
 
283
.Linker memory regions
284 60 zero_gravi
[cols="<1,<9"]
285
[options="header",grid="rows"]
286
|=======================
287 62 zero_gravi
| Region    | Description
288 60 zero_gravi
| `.text`   | Executable instructions generated from the start-up code and all application sources.
289
| `.rodata` | Constants (like strings) from the application; also the initial data for initialized variables.
290
| `.data`   | This section is required for the address generation of fixed (= global) variables only.
291
| `.bss`    | This section is required for the address generation of dynamic memory constructs only.
292
|=======================
293
 
294
The `.text` and `.rodata` sections are mapped to processor's instruction memory space and the `.data` and
295 61 zero_gravi
`.bss` sections are mapped to the processor's data memory space. Finally, the `.text`, `.rodata` and `.data`
296
sections are extracted and concatenated into a single file `main.bin`.
297 60 zero_gravi
 
298
 
299 61 zero_gravi
:sectnums:
300
==== Executable Image Generator
301 60 zero_gravi
 
302 61 zero_gravi
The `main.bin` file is packed by the NEORV32 image generator (`sw/image_gen`) to generate the final executable file.
303
 
304
[NOTE]
305
The sources of the image generator are automatically compiled when invoking the makefile.
306
 
307
The image generator can generate three types of executables, selected by a flag when calling the generator:
308
 
309 60 zero_gravi
[cols="<1,<9"]
310
[grid="none"]
311
|=======================
312
| `-app_bin` | Generates an executable binary file `neorv32_exe.bin` (for UART uploading via the bootloader).
313 62 zero_gravi
| `-app_hex` | Generates a plain ASCII hex-char file `neorv32_exe.hex` that can be used to initialize custom (instruction-) memories (in synthesis/simulation).
314 60 zero_gravi
| `-app_img` | Generates an executable VHDL memory initialization image for the processor-internal IMEM. This option generates the `rtl/core/neorv32_application_image.vhd` file.
315
| `-bld_img` | Generates an executable VHDL memory initialization image for the processor-internal BOOT ROM. This option generates the `rtl/core/neorv32_bootloader_image.vhd` file.
316
|=======================
317
 
318 61 zero_gravi
All these options are managed by the makefile. The _normal application_ compilation flow will generate the `neorv32_exe.bin`
319
executable to be upload via UART to the NEORV32 bootloader.
320 60 zero_gravi
 
321 61 zero_gravi
The image generator add a small header to the `neorv32_exe.bin` executable, which consists of three 32-bit words located right at the
322
beginning of the file. The first word of the executable is the signature word and is always `0x4788cafe`. Based on this word the bootloader
323
can identify a valid image file. The next word represents the size in bytes of the actual program
324 60 zero_gravi
image in bytes. A simple "complement" checksum of the actual program image is given by the third word. This
325
provides a simple protection against data transmission or storage errors.
326
 
327
 
328 61 zero_gravi
:sectnums:
329
==== Start-Up Code (crt0)
330 60 zero_gravi
 
331 61 zero_gravi
The CPU and also the processor require a minimal start-up and initialization code to bring the CPU (and the SoC)
332
into a stable and initialized state and to initialize the C runtime environment before the actual application can be executed.
333
This start-up code is located in `sw/common/crt0.S` and is automatically linked _every_ application program
334
and placed right before the actual application code so it gets executed right after reset.
335 60 zero_gravi
 
336 61 zero_gravi
The `crt0.S` start-up performs the following operations:
337 60 zero_gravi
 
338 61 zero_gravi
[start=1]
339
. Initialize all integer registers `x1 - x31` (or jsut `x1 - x15` when using the `E` CPU extension) to a defined value.
340
. Initialize the global pointer `gp` and the stack pointer `sp` according to the `.data` segment layout provided by the linker script.
341
. Initialize all CPU core CSRs and also install a default "dummy" trap handler for _all_ traps. This handler catches all traps during the early boot phase.
342
. Clear IO area: Write zero to all memory-mapped registers within the IO region (`iodev` section). If certain devices have not been implemented, a bus access fault exception will occur. This exception is captured by the dummy trap handler.
343
. Clear the `.bss` section defined by the linker script.
344
. Copy read-only data from the `.text` section to the `.data` section to set initialized variables.
345
. Call the application's `main` function (with _no_ arguments: `argc` = `argv` = 0).
346
. If the `main` function returns `crt0` can call an "after-main handler" (see below)
347
. If there is no after-main handler or after returning from the after-main handler the processor goes to an endless sleep mode (using a simple loop or via the `wfi` instruction if available).
348 60 zero_gravi
 
349 61 zero_gravi
:sectnums:
350
===== After-Main Handler
351
 
352
If the application's `main()` function actually returns, an _after main handler_ can be executed. This handler can be a normal function
353
since the C runtime is still available when executed. If this handler uses any kind of peripheral/IO modules make sure these are
354
already initialized within the application or you have to initialize them _inside_ the handler.
355
 
356
.After-main handler - function prototype
357
[source,c]
358
----
359
int __neorv32_crt0_after_main(int32_t return_code);
360
----
361
 
362
The function has exactly one argument (`return_code`) that provides the _return value_ of the application's main function.
363
For instance, this variable contains _-1_ if the main function returned with `return -1;`. The return value of the
364
`__neorv32_crt0_after_main` function is irrelevant as there is no further "software instance" executed afterwards that can check this.
365
However, the on-chip debugger could still evaluate the return value of the after-main handler.
366
 
367
A simple `printf` can be used to inform the user when the application main function return
368
(this example assumes that UART0 has been already properly configured in the actual application):
369
 
370
.After-main handler - example
371
[source,c]
372
----
373
int __neorv32_crt0_after_main(int32_t return_code) {
374
 
375
  neorv32_uart_printf("Main returned with code: %i\n", return_code);
376
  return 0;
377
}
378
----
379
 
380
 
381 60 zero_gravi
<<<
382
// ####################################################################################################################
383
:sectnums:
384
=== Bootloader
385
 
386 61 zero_gravi
[NOTE]
387
This section illustrated the **default** bootloader from the repository. The bootloader can be customized
388
to target application-specific scenarios. See User Guide section
389
https://stnolting.github.io/neorv32/ug/#_customizing_the_internal_bootloader[Customizing the Internal Bootloader]
390
for more information.
391 60 zero_gravi
 
392 61 zero_gravi
The default NEORV32 bootloader (source code `sw/bootloader/bootloader.c`) provides a build-in firmware that
393
allows to upload new application executables via UART at every time and to optionally store/boot them to/from
394
an external SPI flash. It features a simple "automatic boot" feature that will try to fetch an executable
395
from SPI flash if there is _no_ UART user interaction. This allows to build processor setup with
396
non-volatile application storage, which can be updated at any time.
397 60 zero_gravi
 
398 61 zero_gravi
The bootloader is only implemented if the <<_int_bootloader_en>> generic is _true_. This will
399
select the <<_indirect_boot>> boot configuration.
400 60 zero_gravi
 
401 61 zero_gravi
.Hardware requirements of the _default_ NEORV32 bootloader
402 60 zero_gravi
[IMPORTANT]
403 61 zero_gravi
**REQUIRED**: The bootloader requires the CSR access CPU extension (<<_cpu_extension_riscv_zicsr>> generic is _true_)
404
and at least 512 bytes of data memory (processor-internal DMEM or external DMEM). +
405
 +
406
_RECOMMENDED_: For user interaction via UART (like uploading executables) the primary UART (UART0) has to be
407
implemented (<<_io_uart0_en>> generic is _true_). Without UART the bootloader does not make much sense. However, auto-boot
408
via SPI is still supported but the bootloader should be customized (see User Guide) for this purpose. +
409
 +
410
_OPTIONAL_: The default bootloader uses bit 0 of the GPIO output port as "heart beat" and status LED if the
411
GPIO controller is implemented (<<_io_gpio_en>> generic is _true_). +
412
 +
413
_OPTIONAL_: The MTIME machine timer (<<_io_mtime_en>> generic is _true_) and the SPI controller
414
(<<_io_spi_en>> generic is _true_) are required in order to use the bootloader's auto-boot feature
415
(automatic boot from external SPI flash if there is no user interaction via UART).
416 60 zero_gravi
 
417
To interact with the bootloader, connect the primary UART (UART0) signals (`uart0_txd_o` and
418
`uart0_rxd_o`) of the processor's top entity via a serial port (-adapter) to your computer (hardware flow control is
419
not used so the according interface signals can be ignored.), configure your
420 62 zero_gravi
terminal program using the following settings and perform a reset of the processor.
421 60 zero_gravi
 
422
Terminal console settings (`19200-8-N-1`):
423
 
424
* 19200 Baud
425
* 8 data bits
426
* no parity bit
427
* 1 stop bit
428
* newline on `\r\n` (carriage return, newline)
429
* no transfer protocol / control flow protocol - just the raw byte stuff
430
 
431
The bootloader uses the LSB of the top entity's `gpio_o` output port as high-active status LED (all other
432
output pin are set to low level by the bootloader). After reset, this LED will start blinking at ~2Hz and the
433
following intro screen should show up in your terminal:
434
 
435
[source]
436
----
437
<< NEORV32 Bootloader >>
438
 
439
BLDV: Mar 23 2021
440
HWV:  0x01050208
441
CLK:  0x05F5E100
442
MISA: 0x40901105
443
ZEXT: 0x00000023
444
PROC: 0x0EFF0037
445
IMEM: 0x00004000 bytes @ 0x00000000
446
DMEM: 0x00002000 bytes @ 0x80000000
447
 
448
Autoboot in 8s. Press key to abort.
449
----
450
 
451
This start-up screen also gives some brief information about the bootloader and several system configuration parameters:
452
 
453
[cols="<2,<15"]
454
[grid="none"]
455
|=======================
456
| `BLDV` | Bootloader version (built date).
457
| `HWV`  | Processor hardware version (from the `mimpid` CSR) in BCD format (example: `0x01040606` = v1.4.6.6).
458
| `CLK`  | Processor clock speed in Hz (via the SYSINFO module, from the _CLOCK_FREQUENCY_ generic).
459
| `MISA` | CPU extensions (from the `misa` CSR).
460
| `ZEXT` | CPU sub-extensions (from the `mzext` CSR)
461
| `PROC` | Processor configuration (via the SYSINFO module, from the IO_* and MEM_* configuration generics).
462
| `IMEM` | IMEM memory base address and size in byte (from the _MEM_INT_IMEM_SIZE_ generic).
463
| `DMEM` | DMEM memory base address and size in byte (from the _MEM_INT_DMEM_SIZE_ generic).
464
|=======================
465
 
466
Now you have 8 seconds to press any key. Otherwise, the bootloader starts the auto boot sequence. When
467
you press any key within the 8 seconds, the actual bootloader user console starts:
468
 
469
[source]
470
----
471
<< NEORV32 Bootloader >>
472
 
473
BLDV: Mar 23 2021
474
HWV:  0x01050208
475
CLK:  0x05F5E100
476
USER: 0x10000DE0
477
MISA: 0x40901105
478
ZEXT: 0x00000023
479
PROC: 0x0EFF0037
480
IMEM: 0x00004000 bytes @ 0x00000000
481
DMEM: 0x00002000 bytes @ 0x80000000
482
 
483
Autoboot in 8s. Press key to abort.
484
Aborted.
485
 
486
Available commands:
487
h: Help
488
r: Restart
489
u: Upload
490
s: Store to flash
491
l: Load from flash
492
e: Execute
493
CMD:>
494
----
495
 
496
The auto-boot countdown is stopped and now you can enter a command from the list to perform the
497
corresponding operation:
498
 
499
* `h`: Show the help text (again)
500
* `r`: Restart the bootloader and the auto-boot sequence
501
* `u`: Upload new program executable (`neorv32_exe.bin`) via UART into the instruction memory
502
* `s`: Store executable to SPI flash at `spi_csn_o(0)`
503
* `l`: Load executable from SPI flash at `spi_csn_o(0)`
504
* `e`: Start the application, which is currently stored in the instruction memory (IMEM)
505
 
506
A new executable can be uploaded via UART by executing the `u` command. After that, the executable can be directly
507
executed via the `e` command. To store the recently uploaded executable to an attached SPI flash press `s`. To
508
directly load an executable from the SPI flash press `l`. The bootloader and the auto-boot sequence can be
509
manually restarted via the `r` command.
510
 
511
[TIP]
512
The CPU is in machine level privilege mode after reset. When the bootloader boots an application,
513
this application is also started in machine level privilege mode.
514
 
515 61 zero_gravi
[TIP]
516
For detailed information on using an SPI flash for application storage see User Guide section
517
https://stnolting.github.io/neorv32/ug/#_programming_an_external_spi_flash_via_the_bootloader[Programming an External SPI Flash via the Bootloader].
518 60 zero_gravi
 
519
 
520
:sectnums:
521
==== Auto Boot Sequence
522 61 zero_gravi
When you reset the NEORV32 processor, the bootloader waits 8 seconds for a UART console input before it
523 60 zero_gravi
starts the automatic boot sequence. This sequence tries to fetch a valid boot image from the external SPI
524 61 zero_gravi
flash, connected to SPI chip select `spi_csn_o(0)`. If a valid boot image is found that can be successfully
525
transferred into the instruction memory, it is automatically started. If no SPI flash is detected or if there
526
is no valid boot image found, and error code will be shown.
527 60 zero_gravi
 
528
 
529
:sectnums:
530
==== Bootloader Error Codes
531
 
532
If something goes wrong during bootloader operation, an error code is shown. In this case the processor
533
stalls, a bell command and one of the following error codes are send to the terminal, the bootloader status
534 61 zero_gravi
LED is permanently activated and the system must be manually reset.
535 60 zero_gravi
 
536
[cols="<2,<13"]
537
[grid="rows"]
538
|=======================
539 62 zero_gravi
| **`ERROR_0`** | If you try to transfer an invalid executable (via UART or from the external SPI flash), this error message shows up. There might be a transfer protocol configuration error in the terminal program. Also, if no SPI flash was found during an auto-boot attempt, this message will be displayed.
540
| **`ERROR_1`** | Your program is way too big for the internal processor’s instructions memory. Increase the memory size or reduce your application code.
541 60 zero_gravi
| **`ERROR_2`** | This indicates a checksum error. Something went wrong during the transfer of the program image (upload via UART or loading from the external SPI flash). If the error was caused by a UART upload, just try it again. When the error was generated during a flash access, the stored image might be corrupted.
542
| **`ERROR_3`** | This error occurs if the attached SPI flash cannot be accessed. Make sure you have the right type of flash and that it is properly connected to the NEORV32 SPI port using chip select #0.
543
|=======================
544
 
545
 
546
 
547
<<<
548
// ####################################################################################################################
549
:sectnums:
550
=== NEORV32 Runtime Environment
551
 
552
The NEORV32 provides a minimal runtime environment (RTE) that takes care of a stable
553
and _safe_ execution environment by handling _all_ traps (including interrupts).
554
 
555
[NOTE]
556
Using the RTE is **optional**. The RTE provides a simple and comfortable way of delegating traps while making sure that all traps (even though they are not
557
explicitly used by the application) are handled correctly. Performance-optimized applications or embedded operating systems should not use the RTE for delegating traps.
558
 
559
When execution enters the application's `main` function, the actual runtime environment is responsible for catching all implemented exceptions
560
and interrupts. To activate the NEORV32 RTE execute the following function:
561
 
562
[source,c]
563
----
564
void neorv32_rte_setup(void);
565
----
566
 
567
This setup initializes the `mtvec` CSR, which provides the base entry point for all trap
568
handlers. The address stored to this register reflects the first-level exception handler provided by the
569
NEORV32 RTE. Whenever an exception or interrupt is triggered, this first-level handler is called.
570
 
571
The first-level handler performs a complete context save, analyzes the source of the exception/interrupt and
572
calls the according second-level exception handler, which actually takes care of the exception/interrupt
573
handling. For this, the RTE manages a private look-up table to store the addresses of the according trap
574
handlers.
575
 
576
After the initial setup of the RTE, each entry in the trap handler's look-up table is initialized with a debug
577
handler, that outputs detailed hardware information via the **primary UART (UART0)** when triggered. This
578
is intended as a fall-back for debugging or for accidentally-triggered exceptions/interrupts.
579
For instance, an illegal instruction exception catched by the RTE debug handler might look like this in the UART0 output:
580
 
581
[source]
582
----
583
 Illegal instruction @0x000002d6, MTVAL=0x00001537 
584
----
585
 
586
To install the **actual application's trap handlers** the NEORV32 RTE provides functions for installing and
587
un-installing trap handler for each implemented exception/interrupt source.
588
 
589
[source,c]
590
----
591
int neorv32_rte_exception_install(uint8_t id, void (*handler)(void));
592
----
593
 
594
[cols="<5,<12"]
595
[options="header",grid="rows"]
596
|=======================
597
| ID name [C] | Description / trap causing entry
598
| `RTE_TRAP_I_MISALIGNED` | instruction address misaligned
599
| `RTE_TRAP_I_ACCESS`     | instruction (bus) access fault
600
| `RTE_TRAP_I_ILLEGAL`    | illegal instruction
601
| `RTE_TRAP_BREAKPOINT`   | breakpoint (`ebreak` instruction)
602
| `RTE_TRAP_L_MISALIGNED` | load address misaligned
603
| `RTE_TRAP_L_ACCESS`     | load (bus) access fault
604
| `RTE_TRAP_S_MISALIGNED` | store address misaligned
605
| `RTE_TRAP_S_ACCESS`     | store (bus) access fault
606
| `RTE_TRAP_MENV_CALL`    | environment call from machine mode (`ecall` instruction)
607
| `RTE_TRAP_UENV_CALL`    | environment call from user mode (`ecall` instruction)
608
| `RTE_TRAP_MTI`          | machine timer interrupt
609
| `RTE_TRAP_MEI`          | machine external interrupt
610
| `RTE_TRAP_MSI`          | machine software interrupt
611
| `RTE_TRAP_FIRQ_0` : `RTE_TRAP_FIRQ_15` | fast interrupt channel 0..15
612
|=======================
613
 
614
When installing a custom handler function for any of these exception/interrupts, make sure the function uses
615
**no attributes** (especially no interrupt attribute!), has no arguments and no return value like in the following
616
example:
617
 
618
[source,c]
619
----
620
void handler_xyz(void) {
621
 
622
  // handle exception/interrupt...
623
}
624
----
625
 
626
[WARNING]
627
Do NOT use the `((interrupt))` attribute for the application exception handler functions! This
628
will place an `mret` instruction to the end of it making it impossible to return to the first-level
629
exception handler of the RTE, which will cause stack corruption.
630
 
631
Example: Installation of the MTIME interrupt handler:
632
 
633
[source,c]
634
----
635
neorv32_rte_exception_install(EXC_MTI, handler_xyz);
636
----
637
 
638
To remove a previously installed exception handler call the according un-install function from the NEORV32
639
runtime environment. This will replace the previously installed handler by the initial debug handler, so even
640
un-installed exceptions and interrupts are further captured.
641
 
642
[source,c]
643
----
644
int neorv32_rte_exception_uninstall(uint8_t id);
645
----
646
 
647
Example: Removing the MTIME interrupt handler:
648
 
649
[source,c]
650
----
651
neorv32_rte_exception_uninstall(EXC_MTI);
652
----
653
 
654
[TIP]
655
More information regarding the NEORV32 runtime environment can be found in the doxygen
656
software documentation (also available online at https://stnolting.github.io/neorv32/sw/files.html[GitHub pages]).

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.