Line 39... |
Line 39... |
|
|
The NEORV32 Processor is a customizable microcontroller-like system on chip (SoC) that is based on the RISC-V NEORV32 CPU.
|
The NEORV32 Processor is a customizable microcontroller-like system on chip (SoC) that is based on the RISC-V NEORV32 CPU.
|
The project is intended as auxiliary processor in larger SoC designs or as *ready-to-go* stand-alone
|
The project is intended as auxiliary processor in larger SoC designs or as *ready-to-go* stand-alone
|
custom / customizable microcontroller.
|
custom / customizable microcontroller.
|
|
|
|
Special focus is paid on **execution safety** to provide defined and predictable behavior at any time.
|
|
Therefore, the CPU ensures that all memory access are acknowledged and no invalid/malformed instructions
|
|
are executed. Whenever an unexpected situation occurs, the application code is informed via hardware exceptions.
|
|
|
:information_source: Want to know more? Check out the [project's rationale](https://stnolting.github.io/neorv32/#_rationale).
|
:information_source: Want to know more? Check out the [project's rationale](https://stnolting.github.io/neorv32/#_rationale).
|
|
|
:books: For detailed information take a look at the [NEORV32 documentation (online at GitHub-pages)](https://stnolting.github.io/neorv32/).
|
:books: For detailed information take a look at the [NEORV32 documentation (online at GitHub-pages)](https://stnolting.github.io/neorv32/).
|
The *doxygen*-based documentation of the *software framework* is also available online
|
The *doxygen*-based documentation of the *software framework* is also available online
|
at [GitHub-pages](https://stnolting.github.io/neorv32/sw/files.html).
|
at [GitHub-pages](https://stnolting.github.io/neorv32/sw/files.html).
|
Line 132... |
Line 136... |
|
|
* _true random_ number generator ([TRNG](https://stnolting.github.io/neorv32/#_true_random_number_generator_trng))
|
* _true random_ number generator ([TRNG](https://stnolting.github.io/neorv32/#_true_random_number_generator_trng))
|
* on-chip debugger ([OCD](https://stnolting.github.io/neorv32/#_on_chip_debugger_ocd)) via JTGA - implementing
|
* on-chip debugger ([OCD](https://stnolting.github.io/neorv32/#_on_chip_debugger_ocd)) via JTGA - implementing
|
the [*Minimal RISC-V Debug Specification Version 0.13.2*](https://github.com/riscv/riscv-debug-spec)
|
the [*Minimal RISC-V Debug Specification Version 0.13.2*](https://github.com/riscv/riscv-debug-spec)
|
and compatible with *OpenOCD* and *gdb*
|
and compatible with *OpenOCD* and *gdb*
|
|
* bus keeper to monitor processor-internal bus transactions ([BUSKEEPER](https://stnolting.github.io/neorv32/#_internal_bus_monitor_buskeeper))
|
|
|
:information_source: It is recommended to use the processor setup even if you want to **use the CPU in stand-alone mode**.
|
:information_source: It is recommended to use the processor setup even if you want to **use the CPU in stand-alone mode**.
|
Just disable all optional processor-internal modules via the according generics and you will get a "CPU wrapper" that
|
Just disable all optional processor-internal modules via the according generics and you will get a "CPU wrapper" that
|
provides a minimal CPU environment and an external memory interface (like AXI4). This minimal setup allows to further use
|
provides a minimal CPU environment and an external memory interface (like AXI4). This minimal setup allows to further use
|
the default bootloader and software framework. From this base you can start building your own processor system.
|
the default bootloader and software framework. From this base you can start building your own processor system.
|
Line 169... |
Line 174... |
*Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/references/riscv-spec.pdf)
|
*Unprivileged ISA Specification* [(Version 2.2)](https://github.com/stnolting/neorv32/blob/master/docs/references/riscv-spec.pdf)
|
and the *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/references/riscv-privileged.pdf).
|
and the *Privileged Architecture Specification* [(Version 1.12-draft)](https://github.com/stnolting/neorv32/blob/master/docs/references/riscv-privileged.pdf).
|
Compatibility is checked by passing the [official RISC-V architecture tests](https://github.com/riscv/riscv-arch-test)
|
Compatibility is checked by passing the [official RISC-V architecture tests](https://github.com/riscv/riscv-arch-test)
|
(see [`sim/README`](sim/README.md)).
|
(see [`sim/README`](sim/README.md)).
|
|
|
The core implements a little-endian Von-Neumann architecture using two pipeline stages, where each stage can operate in a multi-cycle processing
|
The core is a little-endian Von-Neumann machine implemented as multi-cycle architecture.
|
scheme. The CPU supports three privilege levels (`machine` and optional `user` and `debug_mode`), the three standard RISC-V machine
|
However, the CPU's _front end_ (instruction fetch) and _back end_ (instruction execution) can work independently to increase performance.
|
|
Currently, three privilege levels (`machine` and optional `user` and `debug_mode`) are supported. The CPU implements all three standard RISC-V machine
|
interrupts (`MTI`, `MEI`, `MSI`) plus 16 _fast interrupt requests_ as custom extensions.
|
interrupts (`MTI`, `MEI`, `MSI`) plus 16 _fast interrupt requests_ as custom extensions.
|
It also supports **all** standard RISC-V exceptions (instruction/load/store misaligned address & bus access fault, illegal
|
It also supports **all** standard RISC-V exceptions (instruction/load/store misaligned address & bus access fault, illegal
|
instruction, breakpoint, environment calls). See :books: [_"Full Virtualization"_](https://stnolting.github.io/neorv32/#_full_virtualization)
|
instruction, breakpoint, environment calls).
|
for more information.
|
|
|
|
|
|
### Available ISA Extensions
|
### Available ISA Extensions
|
|
|
Currently, the following _optional_ RISC-V-compatible ISA extensions are implemented (linked to the according
|
Currently, the following _optional_ RISC-V-compatible ISA extensions are implemented (linked to the according
|
Line 186... |
Line 191... |
|
|
**RV32
|
**RV32
|
[[`I`](https://stnolting.github.io/neorv32/#_i_base_integer_isa)/
|
[[`I`](https://stnolting.github.io/neorv32/#_i_base_integer_isa)/
|
[`E`](https://stnolting.github.io/neorv32/#_e_embedded_cpu)]
|
[`E`](https://stnolting.github.io/neorv32/#_e_embedded_cpu)]
|
[[`A`](https://stnolting.github.io/neorv32/#_a_atomic_memory_access)]
|
[[`A`](https://stnolting.github.io/neorv32/#_a_atomic_memory_access)]
|
|
[[`B`](https://stnolting.github.io/neorv32/#_b_bit_manipulation_operations)]
|
[[`C`](https://stnolting.github.io/neorv32/#_c_compressed_instructions)]
|
[[`C`](https://stnolting.github.io/neorv32/#_c_compressed_instructions)]
|
[[`M`](https://stnolting.github.io/neorv32/#_m_integer_multiplication_and_division)]
|
[[`M`](https://stnolting.github.io/neorv32/#_m_integer_multiplication_and_division)]
|
[[`U`](https://stnolting.github.io/neorv32/#_u_less_privileged_user_mode)]
|
[[`U`](https://stnolting.github.io/neorv32/#_u_less_privileged_user_mode)]
|
[[`X`](https://stnolting.github.io/neorv32/#_x_neorv32_specific_custom_extensions)]
|
[[`X`](https://stnolting.github.io/neorv32/#_x_neorv32_specific_custom_extensions)]
|
[[`Zbb`](https://stnolting.github.io/neorv32/#_zbb_basic_bit_manipulation_operations)]
|
|
[[`Zfinx`](https://stnolting.github.io/neorv32/#_zfinx_single_precision_floating_point_operations)]
|
[[`Zfinx`](https://stnolting.github.io/neorv32/#_zfinx_single_precision_floating_point_operations)]
|
[[`Zicsr`](https://stnolting.github.io/neorv32/#_zicsr_control_and_status_register_access_privileged_architecture)]
|
[[`Zicsr`](https://stnolting.github.io/neorv32/#_zicsr_control_and_status_register_access_privileged_architecture)]
|
|
[[`Zicntr`](https://stnolting.github.io/neorv32/#_zicntr_cpu_base_counters)]
|
|
[[`Zihpm`](https://stnolting.github.io/neorv32/#_zihpm_hardware_performance_monitors)]
|
[[`Zifencei`](https://stnolting.github.io/neorv32/#_zifencei_instruction_stream_synchronization)]
|
[[`Zifencei`](https://stnolting.github.io/neorv32/#_zifencei_instruction_stream_synchronization)]
|
[[`Zmmul`](https://stnolting.github.io/neorv32/#_zmmul_integer_multiplication)]
|
[[`Zmmul`](https://stnolting.github.io/neorv32/#_zmmul_integer_multiplication)]
|
[[`PMP`](https://stnolting.github.io/neorv32/#_pmp_physical_memory_protection)]
|
[[`PMP`](https://stnolting.github.io/neorv32/#_pmp_physical_memory_protection)]
|
[[`HPM`](https://stnolting.github.io/neorv32/#_hpm_hardware_performance_monitors)]
|
|
[[`DEBUG`](https://stnolting.github.io/neorv32/#_cpu_debug_mode)]**
|
[[`DEBUG`](https://stnolting.github.io/neorv32/#_cpu_debug_mode)]**
|
|
|
:warning: The `Zbb`, `Zfinx` and `Zmmul` RISC-V extensions are frozen but not officially ratified yet. Hence, there is no
|
:warning: The `B`, `Zfinx` and `Zmmul` RISC-V extensions are frozen but not officially ratified yet. Hence, there is no
|
upstream gcc support. To circumvent this, the NEORV32 software framework provides _intrinsic_ libraries for these extensions.
|
upstream gcc support. To circumvent this, the NEORV32 software framework provides _intrinsic_ libraries for these extensions.
|
|
|
[[back to top](#The-NEORV32-RISC-V-Processor)]
|
[[back to top](#The-NEORV32-RISC-V-Processor)]
|
|
|
|
|
Line 216... |
Line 222... |
Results generated for hardware version [`1.5.7.10`](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md).
|
Results generated for hardware version [`1.5.7.10`](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md).
|
|
|
| CPU Configuration | LEs | FFs | Memory bits | DSPs (9-bit) | f_max |
|
| CPU Configuration | LEs | FFs | Memory bits | DSPs (9-bit) | f_max |
|
|:--------------------------------------------------|:----:|:----:|:-----------:|:------------:|:-------:|
|
|:--------------------------------------------------|:----:|:----:|:-----------:|:------------:|:-------:|
|
| `rv32i` | 806 | 359 | 1024 | 0 | 125 MHz |
|
| `rv32i` | 806 | 359 | 1024 | 0 | 125 MHz |
|
| `rv32i_Zicsr` | 1729 | 813 | 1024 | 0 | 124 MHz |
|
| `rv32i_Zicsr_Zicntr` | 1729 | 813 | 1024 | 0 | 124 MHz |
|
| `rv32imac_Zicsr` | 2511 | 1074 | 1024 | 0 | 124 MHz |
|
| `rv32imac_Zicsr_Zicntr` | 2511 | 1074 | 1024 | 0 | 124 MHz |
|
|
|
:information_source: An incremental list of CPU extension's hardware utilization can found in
|
:information_source: An incremental list of CPU extension's hardware utilization can found in
|
[online documentation - _"FPGA Implementation Results - CPU"_](https://stnolting.github.io/neorv32/#_cpu).
|
[online documentation - _"FPGA Implementation Results - CPU"_](https://stnolting.github.io/neorv32/#_cpu).
|
|
|
:information_source: The CPU provides options to further reduce the footprint (for example by constraining
|
:information_source: The CPU provides options to further reduce the footprint (for example by constraining
|
Line 253... |
Line 259... |
~~~
|
~~~
|
|
|
Results generated for hardware version [`1.5.7.10`](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md).
|
Results generated for hardware version [`1.5.7.10`](https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md).
|
|
|
| CPU Configuration | CoreMark Score | CoreMarks/MHz | Average CPI |
|
| CPU Configuration | CoreMark Score | CoreMarks/MHz | Average CPI |
|
|:-----------------------------------------------|:--------------:|:-------------:|:-----------:|
|
|:------------------------------------------------|:--------------:|:-------------:|:-----------:|
|
| _small_ (`rv32i_Zicsr`) | 33.89 | **0.3389** | **4.04** |
|
| _small_ (`rv32i_Zicsr`) | 33.89 | **0.3389** | **4.04** |
|
| _medium_ (`rv32imc_Zicsr`) | 62.50 | **0.6250** | **5.34** |
|
| _medium_ (`rv32imc_Zicsr`) | 62.50 | **0.6250** | **5.34** |
|
| _performance_(`rv32imc_Zicsr` + perf. options) | 95.23 | **0.9523** | **3.54** |
|
| _performance_(`rv32imc_Zicsr` + perf. options) | 95.23 | **0.9523** | **3.54** |
|
|
|
:information_source: More information regarding the CPU performance can be found in the
|
:information_source: More information regarding the CPU performance can be found in the
|
Line 311... |
Line 317... |
* [SoC Modules](https://stnolting.github.io/neorv32/#_processor_internal_modules) - available IO/peripheral modules and memories
|
* [SoC Modules](https://stnolting.github.io/neorv32/#_processor_internal_modules) - available IO/peripheral modules and memories
|
* [On-Chip Debugger](https://stnolting.github.io/neorv32/#_on_chip_debugger_ocd) - online & in-system debugging of the processor via JTAG
|
* [On-Chip Debugger](https://stnolting.github.io/neorv32/#_on_chip_debugger_ocd) - online & in-system debugging of the processor via JTAG
|
|
|
* [NEORV32 CPU](https://stnolting.github.io/neorv32/#_neorv32_central_processing_unit_cpu) - the CPU
|
* [NEORV32 CPU](https://stnolting.github.io/neorv32/#_neorv32_central_processing_unit_cpu) - the CPU
|
* [RISC-V compatibility](https://stnolting.github.io/neorv32/#_risc_v_compatibility) - what is compatible to the specs. and what is not
|
* [RISC-V compatibility](https://stnolting.github.io/neorv32/#_risc_v_compatibility) - what is compatible to the specs. and what is not
|
|
* [Full Virtualization](https://stnolting.github.io/neorv32/#_full_virtualization) - hardware execution safety
|
* [ISA and Extensions](https://stnolting.github.io/neorv32/#_instruction_sets_and_extensions) - available RISC-V ISA extensions
|
* [ISA and Extensions](https://stnolting.github.io/neorv32/#_instruction_sets_and_extensions) - available RISC-V ISA extensions
|
* [CSRs](https://stnolting.github.io/neorv32/#_control_and_status_registers_csrs) - control and status registers
|
* [CSRs](https://stnolting.github.io/neorv32/#_control_and_status_registers_csrs) - control and status registers
|
* [Traps](https://stnolting.github.io/neorv32/#_traps_exceptions_and_interrupts) - interrupts and exceptions
|
* [Traps](https://stnolting.github.io/neorv32/#_traps_exceptions_and_interrupts) - interrupts and exceptions
|
|
|
### :floppy_disk: Software Overview
|
### :floppy_disk: Software Overview
|