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

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [overview.adoc] - Blame information for rev 65

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

Line No. Rev Author Line
1 60 zero_gravi
:sectnums:
2
== Overview
3
 
4
The NEORV32footnote:[Pronounced "neo-R-V-thirty-two" or "neo-risc-five-thirty-two" in its long form.] is an open-source
5
RISC-V compatible processor system that is intended as *ready-to-go* auxiliary processor within a larger SoC
6
designs or as stand-alone custom / customizable microcontroller.
7
 
8
The system is highly configurable and provides optional common peripherals like embedded memories,
9
timers, serial interfaces, general purpose IO ports and an external bus interface to connect custom IP like
10
memories, NoCs and other peripherals. On-line and in-system debugging is supported by an OpenOCD/gdb
11
compatible on-chip debugger accessible via JTAG.
12
 
13
The software framework of the processor comes with application makefiles, software libraries for all CPU
14 65 zero_gravi
and processor features, a bootloader, a runtime environment and several example programs - including a port
15 60 zero_gravi
of the CoreMark MCU benchmark and the official RISC-V architecture test suite. RISC-V GCC is used as
16
default toolchain (https://github.com/stnolting/riscv-gcc-prebuilt[prebuilt toolchains are also provided]).
17
 
18
[TIP]
19 61 zero_gravi
Check out the processor's **https://stnolting.github.io/neorv32/ug[online User Guide]**
20
that provides hands-on tutorial to get you started.
21
 
22
[TIP]
23 60 zero_gravi
The project's change log is available in https://github.com/stnolting/neorv32/blob/master/CHANGELOG.md[CHANGELOG.md]
24
in the root directory of the NEORV32 repository. Please also check out the <<_legal>> section.
25
 
26
 
27 61 zero_gravi
**Structure**
28 60 zero_gravi
 
29 65 zero_gravi
[start=2]
30 64 zero_gravi
. <<_neorv32_processor_soc>>
31
. <<_neorv32_central_processing_unit_cpu>>
32 65 zero_gravi
. <<_software_framework>>
33 64 zero_gravi
. <<_on_chip_debugger_ocd>>
34 60 zero_gravi
 
35 61 zero_gravi
[TIP]
36
Links in this document are <<_overview,highlighted>>.
37 60 zero_gravi
 
38
 
39
 
40 61 zero_gravi
<<<
41
// ####################################################################################################################
42
:sectnums:
43
=== Rationale
44 60 zero_gravi
 
45 61 zero_gravi
**Why did you make this?**
46 60 zero_gravi
 
47 61 zero_gravi
I am fascinated by processor and CPU architecture design: it is the magic frontier where software meets hardware.
48
This project has started as something like a _journey_ into this magic realm to understand how things actually work
49
down on this very low level.
50 60 zero_gravi
 
51 61 zero_gravi
But there is more! When I started to dive into the emerging RISC-V ecosystem I felt overwhelmed by the complexity.
52
As a beginner it is hard to get an overview - especially when you want to setup a minimal platform to tinker with:
53
Which core to use? How to get the right toolchain? What features do I need? How does the booting work? How do I
54
create an actual executable? How to get that into the hardware? How to customize things? **_Where to start???_**
55 60 zero_gravi
 
56 61 zero_gravi
So this project aims to provides a _simple to understand_ and _easy to use_ yet _powerful_ and _flexible_ platform
57
that targets FPGA and RISC-V beginners as well as advanced users. Join me and us on this journey! 🙃
58 60 zero_gravi
 
59
 
60 61 zero_gravi
**Why a _soft_-core processor?**
61 60 zero_gravi
 
62 61 zero_gravi
As a matter of fact soft-core processors _cannot_ compete with discrete or FPGA hard-macro processors in terms
63
of performance, energy and size. But they do fill a niche in FPGA design space. For example, soft-core processors
64
allow to implement the _control flow part_ of certain applications (like communication protocol handling) using
65
software like plain C. This provides high flexibility as software can be easily changed, re-compiled and
66
re-uploaded again.
67 60 zero_gravi
 
68 61 zero_gravi
Furthermore, the concept of flexibility applies to all aspects of a soft-core processor. The user can add
69
_exactly_ the features that are required by the application: additional memories, custom interfaces, specialized
70
IP and even user-defined instructions.
71 60 zero_gravi
 
72
 
73 61 zero_gravi
**Why RISC-V?**
74
 
75
[quote, RISC-V International, https://riscv.org/about/]
76
____
77
RISC-V is a free and open ISA enabling a new era of processor innovation through open standard collaboration.
78
____
79
 
80
I love the idea of open-source. **Knowledge can help best if it is freely available.**
81
While open-source has already become quite popular in _software_, hardware projects still need to catch up.
82
Admittedly, there has been quite a development, but mainly in terms of _platforms_ and _applications_ (so
83
schematics, PCBs, etc.). Although processors and CPUs are the heart of almost every digital system, having a true
84
open-source silicon is still a rarity. RISC-V aims to change that. Even it is _just one approach_, it helps paving
85
the road for future development.
86
 
87
Furthermore, I welcome the community aspect of RISC-V. The ISA and everything beyond is developed with direct
88
contact to the community: this includes businesses and professionals but also hobbyist, amateurs and people
89
that are just curious. Everyone can join discussions and contribute to RISC-V in their very own way.
90
 
91
Finally, I really like the RISC-V ISA itself. It aims to be a clean, orthogonal and "intuitive" ISA that
92
resembles with the basic concepts of _RISC_: simple yet effective.
93
 
94
 
95
**Yet another RISC-V core? What makes it special?**
96
 
97
The NEORV32 is not based on another RISC-V core. It was build entirely from ground up (just following the official
98
ISA specs) having a different design goal in mind. The project does not intend to replace certain RISC-V cores or
99
just beat existing ones like https://github.com/SpinalHDL/VexRiscv[VexRISC] in terms of performance or
100
https://github.com/olofk/serv[SERV] in terms of size.
101
 
102
The project aims to provide _another option_ in the RISC-V / soft-core design space with a different performance
103
vs. size trade-off and a different focus: _embrace_ concepts like documentation, platform-independence / portability,
104
RISC-V compatibility, _customization_ and _ease of use_. See the <<_project_key_features>> below.
105
 
106
 
107 60 zero_gravi
// ####################################################################################################################
108
:sectnums:
109
=== Project Key Features
110
 
111 61 zero_gravi
* open-source and documented; including user guides to get started
112
* completely described in behavioral, platform-independent VHDL (yet platform-optimized modules are provided)
113
* fully synchronous design, no latches, no gated clocks
114
* small hardware footprint and high operating frequency for easy integration
115
* **NEORV32 CPU**: 32-bit `rv32i` RISC-V CPU
116
** RISC-V compatibility: passes the official architecture tests
117
** base architecture + privileged architecture (optional) + ISA extensions (optional)
118
** rich set of customization options (ISA extensions, design goal: performance / area (/ energy), ...)
119 62 zero_gravi
** aims to support <<_full_virtualization>> capabilities (CPU _and_ SoC) to increase execution safety
120 61 zero_gravi
** official https://github.com/riscv/riscv-isa-manual/blob/master/marchid.md[RISC-V open source architecture ID]
121
* **NEORV32 Processor (SoC)**: highly-configurable full-scale microcontroller-like processor system
122
** based on the NEORV32 CPU
123
** optional serial interfaces (UARTs, TWI, SPI)
124
** optional timers and counters (WDT, MTIME)
125
** optional general purpose IO and PWM and native NeoPixel (c) compatible smart LED interface
126
** optional embedded memories / caches for data, instructions and bootloader
127
** optional external memory interface (Wishbone / AXI4-Lite) and stream link interface (AXI4-Stream) for custom connectivity
128
** on-chip debugger compatible with OpenOCD and gdb
129 60 zero_gravi
* **Software framework**
130
** GCC-based toolchain - prebuilt toolchains available; application compilation based on GNU makefiles
131
** internal bootloader with serial user interface
132
** core libraries for high-level usage of the provided functions and peripherals
133
** runtime environment and several example programs
134
** doxygen-based documentation of the software framework; a deployed version is available at https://stnolting.github.io/neorv32/sw/files.html
135
** FreeRTOS port + demos available
136
 
137 61 zero_gravi
[TIP]
138
For more in-depth details regarding the feature provided by he hardware see the according sections:
139
<<_neorv32_central_processing_unit_cpu>> and <<_neorv32_processor_soc>>.
140 60 zero_gravi
 
141 61 zero_gravi
 
142 60 zero_gravi
<<<
143
// ####################################################################################################################
144
:sectnums:
145
=== Project Folder Structure
146
 
147
...................................
148 63 zero_gravi
neorv32                - Project home folder
149 62 zero_gravi
150 63 zero_gravi
├docs                  - Project documentation
151
│├datasheet            - .adoc sources for NEORV32 data sheet
152
│├doxygen_build        - Software framework documentation (generated by doxygen)
153
│├figures              - Figures and logos
154
│├icons                - Misc. symbols
155
│├references           - Data sheets and RISC-V specs.
156
│└src_adoc             - AsciiDoc sources for this document
157 62 zero_gravi
158 63 zero_gravi
├rtl                   - VHDL sources
159
│├core                 - Core sources of the CPU & SoC
160 64 zero_gravi
││└mem                 - SoC-internal memories (default architectures)
161 63 zero_gravi
│├processor_templates  - Pre-configured SoC wrappers
162
│├system_integration   - System wrappers for advanced connectivity
163
│└test_setups          - Minimal test setup "SoCs" used in the User Guide
164 62 zero_gravi
165 63 zero_gravi
├setups                - Example setups for various FPGAs, boards and toolchains
166 61 zero_gravi
│└...
167 62 zero_gravi
168 63 zero_gravi
├sim                   - Simulation files (see User Guide)
169 62 zero_gravi
170 63 zero_gravi
└sw                    - Software framework
171
 ├bootloader           - Sources and scripts for the NEORV32 internal bootloader
172
 ├common               - Linker script and crt0.S start-up code
173
 ├example              - Various example programs
174 60 zero_gravi
 │└...
175 62 zero_gravi
 ├isa-test
176 63 zero_gravi
 │├riscv-arch-test     - RISC-V spec. compatibility test framework (submodule)
177
 │└port-neorv32        - Port files for the official RISC-V architecture tests
178
 ├ocd_firmware         - source code for on-chip debugger's "park loop"
179
 ├openocd              - OpenOCD on-chip debugger configuration files
180
 ├image_gen            - Helper program to generate NEORV32 executables
181
 └lib                  - Processor core library
182
  ├include             - Header files (*.h)
183
  └source              - Source files (*.c)
184 60 zero_gravi
...................................
185
 
186
 
187
 
188
<<<
189
// ####################################################################################################################
190
:sectnums:
191
=== VHDL File Hierarchy
192
 
193
All necessary VHDL hardware description files are located in the project's `rtl/core folder`. The top entity
194
of the entire processor including all the required configuration generics is **`neorv32_top.vhd`**.
195
 
196
[IMPORTANT]
197
All core VHDL files from the list below have to be assigned to a new design library named **`neorv32`**. Additional
198
files, like alternative top entities, can be assigned to any library.
199
 
200
...................................
201 61 zero_gravi
neorv32_top.vhd                  - NEORV32 Processor top entity
202
203
├neorv32_fifo.vhd                - General purpose FIFO component
204
├neorv32_package.vhd             - Processor/CPU main VHDL package file
205
206
├neorv32_cpu.vhd                 - NEORV32 CPU top entity
207
│├neorv32_cpu_alu.vhd            - Arithmetic/logic unit
208 63 zero_gravi
││├neorv32_cpu_cp_bitmanip.vhd   - Bit-manipulation co-processor (B ext.)
209 61 zero_gravi
││├neorv32_cpu_cp_fpu.vhd        - Floating-point co-processor (Zfinx ext.)
210
││├neorv32_cpu_cp_muldiv.vhd     - Mul/Div co-processor (M extension)
211
││└neorv32_cpu_cp_shifter.vhd    - Bit-shift co-processor
212
│├neorv32_cpu_bus.vhd            - Bus interface + physical memory protection
213
│├neorv32_cpu_control.vhd        - CPU control, exception/IRQ system and CSRs
214
││└neorv32_cpu_decompressor.vhd  - Compressed instructions decoder
215
│└neorv32_cpu_regfile.vhd        - Data register file
216
217
├neorv32_boot_rom.vhd            - Bootloader ROM
218
│└neorv32_bootloader_image.vhd   - Bootloader boot ROM memory image
219
├neorv32_busswitch.vhd           - Processor bus switch for CPU buses (I&D)
220
├neorv32_bus_keeper.vhd          - Processor-internal bus monitor
221
├neorv32_cfs.vhd                 - Custom functions subsystem
222
├neorv32_debug_dm.vhd            - on-chip debugger: debug module
223
├neorv32_debug_dtm.vhd           - on-chip debugger: debug transfer module
224 64 zero_gravi
├neorv32_dmem.entity.vhd         - Processor-internal data memory (entity-only!)
225 61 zero_gravi
├neorv32_gpio.vhd                - General purpose input/output port unit
226 62 zero_gravi
├neorv32_icache.vhd              - Processor-internal instruction cache
227 64 zero_gravi
├neorv32_imem.entity.vhd         - Processor-internal instruction memory (entity-only!)
228 61 zero_gravi
│└neor32_application_image.vhd   - IMEM application initialization image
229
├neorv32_mtime.vhd               - Machine system timer
230
├neorv32_neoled.vhd              - NeoPixel (TM) compatible smart LED interface
231
├neorv32_pwm.vhd                 - Pulse-width modulation controller
232
├neorv32_spi.vhd                 - Serial peripheral interface controller
233
├neorv32_sysinfo.vhd             - System configuration information memory
234
├neorv32_trng.vhd                - True random number generator
235
├neorv32_twi.vhd                 - Two wire serial interface controller
236
├neorv32_uart.vhd                - Universal async. receiver/transmitter
237
├neorv32_wdt.vhd                 - Watchdog timer
238
├neorv32_wishbone.vhd            - External (Wishbone) bus interface
239 64 zero_gravi
240
├mem/neorv32_dmem.default.vhd    - _Default_ data memory (architecture-only!)
241
└mem/neorv32_imem.default.vhd    - _Default_ instruction memory (architecture-only!)
242 60 zero_gravi
...................................
243
 
244 64 zero_gravi
[NOTE]
245
The processor-internal instruction and data memories (IMEM and DMEM) are split into two design files each:
246
a plain entity definition (`neorv32_*mem.entity.vhd`) and the actual architecture definition
247
(`mem/neorv32_*mem.default.vhd`). The **default** architecture definitions from `rtl/core/mem` provide a _generic_ and
248
_platform independent_ memory design that (should) infers embedded memory blocks. You can replace/modify the architecture
249
source file in order to use platform-specific features (like advanced memory resources) or to improve technology mapping
250
and/or timing.
251 60 zero_gravi
 
252 64 zero_gravi
 
253 60 zero_gravi
<<<
254
// ####################################################################################################################
255
:sectnums:
256
=== FPGA Implementation Results
257
 
258 62 zero_gravi
This chapter shows _exemplary_ implementation results of the NEORV32 CPU and NEORV32 Processor.
259 60 zero_gravi
 
260
:sectnums:
261
==== CPU
262
 
263
[cols="<2,<8"]
264
[grid="topbot"]
265
|=======================
266 62 zero_gravi
| Hardware version: | `1.5.7.10`
267 60 zero_gravi
| Top entity:       | `rtl/core/neorv32_cpu.vhd`
268
|=======================
269
 
270
[cols="<5,>1,>1,>1,>1,>1"]
271
[options="header",grid="rows"]
272
|=======================
273 62 zero_gravi
| CPU                                        | LEs  | FFs  | MEM bits | DSPs | _f~max~_
274
| `rv32i`                                    |  806 |  359 |     1024 |    0 | 125 MHz
275
| `rv32i_Zicsr`                              | 1729 |  813 |     1024 |    0 | 124 MHz
276
| `rv32im_Zicsr`                             | 2269 | 1055 |     1024 |    0 | 124 MHz
277
| `rv32imc_Zicsr`                            | 2501 | 1070 |     1024 |    0 | 124 MHz
278
| `rv32imac_Zicsr`                           | 2511 | 1074 |     1024 |    0 | 124 MHz
279
| `rv32imacu_Zicsr`                          | 2521 | 1079 |     1024 |    0 | 124 MHz
280
| `rv32imacu_Zicsr_Zifencei`                 | 2522 | 1079 |     1024 |    0 | 122 MHz
281
| `rv32imacu_Zicsr_Zifencei_Zfinx`           | 3807 | 1731 |     1024 |    7 | 116 MHz
282
| `rv32imacu_Zicsr_Zifencei_Zfinx_DebugMode` | 3974 | 1815 |     1024 |    7 | 116 MHz
283 60 zero_gravi
|=======================
284
 
285 62 zero_gravi
[NOTE]
286
No HPM counters and no PMP regions were implemented for generating these results.
287 60 zero_gravi
 
288 62 zero_gravi
[TIP]
289
The CPU provides further options to reduce the area footprint (for example by constraining the CPU-internal
290
counter sizes) or to increase performance (for example by using a barrel-shifter; at cost of extra hardware).
291 63 zero_gravi
See section <<_processor_top_entity_generics>> for more information. Also, take a look at the User Guide section
292
https://stnolting.github.io/neorv32/ug/#_application_specific_processor_configuration[Application-Specific Processor Configuration].
293 62 zero_gravi
 
294
 
295 60 zero_gravi
:sectnums:
296
==== Processor Modules
297
 
298
[cols="<2,<8"]
299
[grid="topbot"]
300
|=======================
301 62 zero_gravi
| Hardware version: | `1.5.7.15`
302 60 zero_gravi
| Top entity:       | `rtl/core/neorv32_top.vhd`
303
|=======================
304
 
305
.Hardware utilization by the processor modules (mandatory core modules in **bold**)
306
[cols="<2,<8,>1,>1,>2,>1"]
307
[options="header",grid="rows"]
308
|=======================
309 62 zero_gravi
| Module        | Description                                           | LEs | FFs | MEM bits | DSPs
310
| Boot ROM      | Bootloader ROM (4kB)                                  |   2 |   1 |    32768 |    0
311
| **BUSKEEPER** | Processor-internal bus monitor                        |   9 |   6 |        0 |    0
312
| **BUSSWITCH** | Bus mux for CPU instr. and data interface             |  63 |   8 |        0 |    0
313 61 zero_gravi
| CFS           | Custom functions subsystemfootnote:[Resource utilization depends on actually implemented custom functionality.] | - | - | - | -
314 62 zero_gravi
| DMEM          | Processor-internal data memory (8kB)                  |  19 |   2 |    65536 |    0
315
| DM            | On-chip debugger - debug module                       | 493 | 240 |        0 |    0
316
| DTM           | On-chip debugger - debug transfer module (JTAG)       | 254 | 218 |        0 |    0
317
| GPIO          | General purpose input/output ports                    | 134 | 161 |        0 |    0
318
| iCACHE        | Instruction cache (1x4 blocks, 256 bytes per block)   | 2 21| 156 |     8192 |    0
319
| IMEM          | Processor-internal instruction memory (16kB)          |  13 |   2 |   131072 |    0
320
| MTIME         | Machine system timer                                  | 319 | 167 |        0 |    0
321
| NEOLED        | Smart LED Interface (NeoPixel/WS28128) [FIFO_depth=1] | 226 | 182 |        0 |    0
322
| SLINK         | Stream link interface (2xRX, 2xTX, FIFO_depth=1)      | 208 | 181 |        0 |    0
323
| PWM           | Pulse_width modulation controller (4 channels)        |  71 |  69 |        0 |    0
324
| SPI           | Serial peripheral interface                           | 148 | 127 |        0 |    0
325
| **SYSINFO**   | System configuration information memory               |  14 |  11 |        0 |    0
326
| TRNG          | True random number generator                          |  89 |  76 |        0 |    0
327
| TWI           | Two-wire interface                                    |  77 |  43 |        0 |    0
328
| UART0/1       | Universal asynchronous receiver/transmitter 0/1       | 183 | 132 |        0 |    0
329
| WDT           | Watchdog timer                                        |  53 |  43 |        0 |    0
330
| WISHBONE      | External memory interface                             | 114 | 110 |        0 |    0
331
| XIRQ          | External interrupt controller (32 channels)           | 241 | 201 |        0 |    0
332 60 zero_gravi
|=======================
333
 
334
 
335
<<<
336
:sectnums:
337
==== Exemplary Setups
338
 
339 61 zero_gravi
Check out the `setups` folder (@GitHub: https://github.com/stnolting/neorv32/tree/master/setups),
340
which provides several demo setups for various FPGA boards and toolchains.
341 60 zero_gravi
 
342
 
343
<<<
344
// ####################################################################################################################
345
:sectnums:
346
=== CPU Performance
347
 
348 62 zero_gravi
The performance of the NEORV32 was tested and evaluated using the https://www.eembc.org/coremark/[Core Mark CPU benchmark].
349
This benchmark focuses on testing the capabilities of the CPU core itself rather than the performance of the whole
350
system. The according sources can be found in the `sw/example/coremark` folder.
351 60 zero_gravi
 
352 63 zero_gravi
.Dhrystone
353
[TIP]
354
A _simple_ port of the Dhrystone benchmark is also available in `sw/example/dhrystone`.
355
 
356 60 zero_gravi
The resulting CoreMark score is defined as CoreMark iterations per second.
357
The execution time is determined via the RISC-V `[m]cycle[h]` CSRs. The relative CoreMark score is
358
defined as CoreMark score divided by the CPU's clock frequency in MHz.
359
 
360 62 zero_gravi
.Configuration
361 60 zero_gravi
[cols="<2,<8"]
362
[grid="topbot"]
363
|=======================
364 62 zero_gravi
| HW version:     | `1.5.7.10`
365
| Hardware:       | 32kB int. IMEM, 16kB int. DMEM, no caches, 100MHz clock
366
| CoreMark:       | 2000 iterations, MEM_METHOD is MEM_STACK
367
| Compiler:       | RISCV32-GCC 10.2.0
368
| Compiler flags: | default, see makefile
369 60 zero_gravi
|=======================
370
 
371
.CoreMark results
372 62 zero_gravi
[cols="<4,^1,^1,^1"]
373 60 zero_gravi
[options="header",grid="rows"]
374
|=======================
375 62 zero_gravi
| CPU                                            | CoreMark Score | CoreMarks/Mhz | Average CPI
376
| _small_ (`rv32i_Zicsr`)                        |          33.89 | **0.3389**    | **4.04**
377
| _medium_ (`rv32imc_Zicsr`)                     |          62.50 | **0.6250**    | **5.34**
378
| _performance_(`rv32imc_Zicsr` + perf. options) |          95.23 | **0.9523**    | **3.54**
379 60 zero_gravi
|=======================
380
 
381
[NOTE]
382 62 zero_gravi
The "_performance_" CPU configuration uses the <<_fast_mul_en>> and <<_fast_shift_en>> options.
383 60 zero_gravi
 
384 62 zero_gravi
[NOTE]
385 60 zero_gravi
The NEORV32 CPU is based on a multi-cycle architecture. Each instruction is executed in a sequence of
386 62 zero_gravi
several consecutive micro operations.
387 60 zero_gravi
 
388 62 zero_gravi
[NOTE]
389 60 zero_gravi
The average CPI (cycles per instruction) depends on the instruction mix of a specific applications and also on
390 62 zero_gravi
the available CPU extensions. The average CPI is computed by dividing the total number of required clock cycles
391
(only the timed core to avoid distortion due to IO wait cycles) by the number of executed instructions
392
(`[m]instret[h]` CSRs).
393 60 zero_gravi
 
394
[TIP]
395
More information regarding the execution time of each implemented instruction can be found in
396
chapter <<_instruction_timing>>.

powered by: WebSVN 2.1.0

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