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

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [README.md] - Blame information for rev 13

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

Line No. Rev Author Line
1 11 zero_gravi
# [The NEORV32 Processor](https://github.com/stnolting/neorv32) (RISC-V-compliant)
2 2 zero_gravi
 
3
[![Build Status](https://travis-ci.com/stnolting/neorv32.svg?branch=master)](https://travis-ci.com/stnolting/neorv32)
4
[![license](https://img.shields.io/github/license/stnolting/neorv32)](https://github.com/stnolting/neorv32/blob/master/LICENSE)
5
[![release](https://img.shields.io/github/v/release/stnolting/neorv32)](https://github.com/stnolting/neorv32/releases)
6
 
7
 
8
## Table of Content
9
 
10
* [Introduction](#Introduction)
11
* [Features](#Features)
12
* [FPGA Implementation Results](#FPGA-Implementation-Results)
13
* [Performance](#Performance)
14
* [Top Entity](#Top-Entity)
15
* [**Getting Started**](#Getting-Started)
16 9 zero_gravi
* [Contribute](#Contribute)
17 2 zero_gravi
* [Legal](#Legal)
18
 
19
 
20
 
21
## Introduction
22
 
23 11 zero_gravi
The NEORV32 is a customizable full-scale mikrocontroller-like processor system based on a [RISC-V-compliant](https://github.com/stnolting/neorv32_riscv_compliance)
24
`rv32i` CPU with optional `E`, `C`, `M`, `Zicsr` and `Zifencei` extensions. The CPU was built from scratch and is compliant to the **Unprivileged
25 12 zero_gravi
ISA Specification Version 2.2** and a subset of the **Privileged Architecture Specification Version 1.12-draft**.
26 2 zero_gravi
 
27 11 zero_gravi
The NEORV32 is intended as auxiliary processor within a larger SoC designs or as stand-alone custom microcontroller.
28
Its top entity can be directly synthesized for any FPGA without modifications and provides a full-scale RISC-V based microcontroller.
29
 
30 2 zero_gravi
The processor provides common peripherals and interfaces like input and output ports, serial interfaces for UART, I²C and SPI,
31 4 zero_gravi
interrupt controller, timers and embedded memories. External memories, peripherals and custom IP can be attached via a
32 9 zero_gravi
Wishbone-based external memory interface. All optional features beyond the base CPU can be enabled and configured via VHDL generics.
33 2 zero_gravi
 
34
This project comes with a complete software ecosystem that features core libraries for high-level usage of the
35 11 zero_gravi
provided functions and peripherals, application makefiles, a runtime environment and several example programs. All software source files
36
provide a doxygen-based [documentary](https://stnolting.github.io/neorv32/files.html).
37 2 zero_gravi
 
38
The project is intended to work "out of the box". Just synthesize the test setup from this project, upload
39 4 zero_gravi
it to your FPGA board of choice and start playing with the NEORV32. If you do not want to [compile the GCC toolchains](https://github.com/riscv/riscv-gnu-toolchain)
40 11 zero_gravi
by yourself, you can also download [pre-compiled toolchains](https://github.com/stnolting/riscv_gcc_prebuilt) for Linux.
41 2 zero_gravi
 
42
For more information take a look a the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
43
 
44
 
45
### Design Principles
46
 
47
 * From zero to main(): Completely open source and documented.
48
 * Plain VHDL without technology-specific parts like attributes, macros or primitives.
49
 * Easy to use – working out of the box.
50
 * Clean synchronous design, no wacky combinatorial interfaces.
51
 * The processor has to fit in a Lattice iCE40 UltraPlus 5k FPGA running at 20+ MHz.
52
 
53
 
54
### Status
55 3 zero_gravi
 
56 6 zero_gravi
The processor is synthesizable (tested with Intel Quartus Prime, Xilinx Vivado and Lattice Radiant/LSE) and can successfully execute
57
all the [provided example programs](https://github.com/stnolting/neorv32/tree/master/sw/example) including the CoreMark benchmark.
58 2 zero_gravi
 
59 8 zero_gravi
The processor passes the official `rv32i`, `rv32im`, `rv32imc`, `rv32Zicsr` and `rv32Zifencei` [RISC-V compliance tests](https://github.com/riscv/riscv-compliance).
60 2 zero_gravi
 
61 11 zero_gravi
| Project component                                                               | CI status | Note     |
62
|:--------------------------------------------------------------------------------|:----------|:---------|
63
| [NEORV32 processor](https://github.com/stnolting/neorv32)                       | [![Test](https://img.shields.io/travis/stnolting/neorv32/master.svg?label=test)](https://travis-ci.com/stnolting/neorv32)                                         | [![sw doc](https://img.shields.io/badge/SW%20documentation-gh--pages-blue)](https://stnolting.github.io/neorv32/files.html) |
64 12 zero_gravi
| [Pre-built toolchain](https://github.com/stnolting/riscv_gcc_prebuilt)          | [![Test](https://img.shields.io/travis/stnolting/riscv_gcc_prebuilt/master.svg?label=test)](https://travis-ci.com/stnolting/riscv_gcc_prebuilt)                   | |
65 11 zero_gravi
| [RISC-V compliance test](https://github.com/stnolting/neorv32_riscv_compliance) | [![Test](https://img.shields.io/travis/stnolting/neorv32_riscv_compliance/master.svg?label=compliance)](https://travis-ci.com/stnolting/neorv32_riscv_compliance) | |
66 6 zero_gravi
 
67
 
68 12 zero_gravi
### Non RISC-V-Compliant Issues
69 7 zero_gravi
 
70 12 zero_gravi
* No exception is triggered in `E` mode when using registers above `x15` (*needs fixing*)
71
* `misa` CSR is read-only - no dynamic enabling/disabling of implemented CPU extensions during runtime
72
* Machine software interrupt `msi` is implemented, but there is no mechanism available to trigger it
73
* The `[m]cycleh` and `[m]instreth` CSR counters are only 20-bit wide (in contrast to original 32-bit)
74 7 zero_gravi
 
75
 
76 9 zero_gravi
### To-Do / Wish List
77 7 zero_gravi
 
78 13 zero_gravi
- Add instructions how to use the NEORV32 CPU without the processor surroundings
79
- Add AXI / AXI-Lite bridges
80
- Option to use DSP-based multiplier in `M` extension (would be so much faster)
81 9 zero_gravi
- Synthesis results for more platforms
82 13 zero_gravi
- Implement user mode (`U` extension)
83 7 zero_gravi
- Port Dhrystone benchmark
84 13 zero_gravi
- Implement atomic operations (`A` extension) and floating-point operations (`F` extension)
85
- Maybe port an RTOS (like [Zephyr](https://github.com/zephyrproject-rtos/zephyr), [freeRTOS](https://www.freertos.org) or [RIOT](https://www.riot-os.org))
86
- Make a 64-bit branch someday
87 7 zero_gravi
 
88
 
89
 
90 2 zero_gravi
## Features
91
 
92
### Processor Features
93
 
94 11 zero_gravi
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_processor.png)
95
 
96 8 zero_gravi
  - RISC-V-compliant `rv32i` or `rv32e` CPU with optional `C`, `E`, `M`, `Zicsr` and `rv32Zifencei` extensions
97 2 zero_gravi
  - GCC-based toolchain ([pre-compiled rv32i and rv32 etoolchains available](https://github.com/stnolting/riscv_gcc_prebuilt))
98 3 zero_gravi
  - Application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile)
99 11 zero_gravi
  - [Doxygen-based](https://github.com/stnolting/neorv32/blob/master/docs/doxygen_makefile_sw) documentation of the software framework: available on [GitHub pages](https://stnolting.github.io/neorv32/files.html)
100
  - Detailed [datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf)
101 2 zero_gravi
  - Completely described in behavioral, platform-independent VHDL – no primitives, macros, etc.
102
  - Fully synchronous design, no latches, no gated clocks
103
  - Small hardware footprint and high operating frequency
104 7 zero_gravi
  - Highly customizable processor configuration
105 12 zero_gravi
  - _Optional_ processor-internal data and instruction memories (DMEM/IMEM)
106 7 zero_gravi
  - _Optional_ internal bootloader with UART console and automatic SPI flash boot option
107
  - _Optional_ machine system timer (MTIME), RISC-V-compliant
108
  - _Optional_ universal asynchronous receiver and transmitter (UART)
109
  - _Optional_ 8/16/24/32-bit serial peripheral interface controller (SPI) with 8 dedicated chip select lines
110
  - _Optional_ two wire serial interface controller (TWI), compatible to the I²C standard
111
  - _Optional_ general purpose parallel IO port (GPIO), 16xOut & 16xIn, with pin-change interrupt
112
  - _Optional_ 32-bit external bus interface, Wishbone b4 compliant (WISHBONE)
113
  - _Optional_ watchdog timer (WDT)
114
  - _Optional_ PWM controller with 4 channels and 8-bit duty cycle resolution (PWM)
115
  - _Optional_ GARO-based true random number generator (TRNG)
116
  - _Optional_ core-local interrupt controller with 8 channels (CLIC)
117
  - _Optional_ dummy device (DEVNULL) (can be used for *fast* simulation console output)
118 12 zero_gravi
  - System configuration information memory to check hardware configuration by software (SYSINFO)
119 2 zero_gravi
 
120
### CPU Features
121
 
122 11 zero_gravi
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_cpu.png)
123
 
124
The CPU is [compliant](https://github.com/stnolting/neorv32_riscv_compliance) to the
125 12 zero_gravi
[official RISC-V specifications (2.2)](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the
126
[RISC-V privileged architecture specifications (1.12-draft)](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf).
127 2 zero_gravi
 
128 11 zero_gravi
More information regarding the CPU including a detailed list of the instruction set and the available CSRs can be found in
129
the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
130
 
131
 
132
**General**:
133 12 zero_gravi
  * Modified Harvard architecture (separate CPU interfaces for data and instructions; single processor-bus via bus switch)
134
  * Two stages in-order pipeline (FETCH, EXECUTE); each stage uses a multi-cycle processing scheme
135 11 zero_gravi
  * No hardware support of unaligned accesses - they will trigger and exception
136
 
137
 
138 3 zero_gravi
**RV32I base instruction set** (`I` extension):
139 2 zero_gravi
  * ALU instructions: `LUI` `AUIPC` `ADDI` `SLTI` `SLTIU` `XORI` `ORI` `ANDI` `SLLI` `SRLI` `SRAI` `ADD` `SUB` `SLL` `SLT` `SLTU` `XOR` `SRL` `SRA` `OR` `AND`
140 7 zero_gravi
  * Jump and branch instructions: `JAL` `JALR` `BEQ` `BNE` `BLT` `BGE` `BLTU` `BGEU`
141 2 zero_gravi
  * Memory instructions: `LB` `LH` `LW` `LBU` `LHU` `SB` `SH` `SW`
142 8 zero_gravi
  * System instructions: `ECALL` `EBREAK` `FENCE`
143 2 zero_gravi
 
144 3 zero_gravi
**Compressed instructions** (`C` extension):
145 2 zero_gravi
  * ALU instructions: `C.ADDI4SPN` `C.ADDI` `C.ADD` `C.ADDI16SP` `C.LI` `C.LUI` `C.SLLI` `C.SRLI` `C.SRAI` `C.ANDI` `C.SUB` `C.XOR` `C.OR` `C.AND` `C.MV` `C.NOP`
146 7 zero_gravi
  * Jump and branch instructions: `C.J` `C.JAL` `C.JR` `C.JALR` `C.BEQZ` `C.BNEZ`
147 2 zero_gravi
  * Memory instructions: `C.LW` `C.SW` `C.LWSP` `C.SWSP`
148
  * Misc instructions: `C.EBREAK` (only with `Zicsr` extension)
149
 
150 3 zero_gravi
**Embedded CPU version** (`E` extension):
151 2 zero_gravi
  * Reduced register file (only the 16 lowest registers)
152
 
153 3 zero_gravi
**Integer multiplication and division hardware** (`M` extension):
154 2 zero_gravi
  * Multiplication instructions: `MUL` `MULH` `MULHSU` `MULHU`
155
  * Division instructions: `DIV` `DIVU` `REM` `REMU`
156
 
157 8 zero_gravi
**Privileged architecture / CSR access** (`Zicsr` extension):
158 2 zero_gravi
  * Privilege levels: `M-mode` (Machine mode)
159
  * CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI`
160 8 zero_gravi
  * System instructions: `MRET` `WFI`
161 12 zero_gravi
  * Counter CSRs: `[m]cycle[h]` `[m]instret[h]` `time[h]`
162
  * Machine CSRs: `mstatus` `misa`(read-only!) `mie` `mtvec` `mscratch` `mepc` `mcause` `mtval` `mip` `mvendorid` `marchid` `mimpid` `mhartid`
163 2 zero_gravi
  * Supported exceptions and interrupts:
164
    * Misaligned instruction address
165
    * Instruction access fault
166
    * Illegal instruction
167 4 zero_gravi
    * Breakpoint (via `ebreak` instruction)
168 2 zero_gravi
    * Load address misaligned
169
    * Load access fault
170 4 zero_gravi
    * Store address misaligned
171 2 zero_gravi
    * Store access fault
172 4 zero_gravi
    * Environment call from M-mode (via `ecall` instruction)
173 9 zero_gravi
    * Machine timer interrupt `mti` (via MTIME unit)
174
    * Machine external interrupt `mei` (via CLIC unit)
175 2 zero_gravi
 
176 8 zero_gravi
**Privileged architecture / FENCE.I** (`Zifencei` extension):
177
  * System instructions: `FENCE.I`
178
 
179 2 zero_gravi
 
180
## FPGA Implementation Results
181
 
182
This chapter shows exemplary implementation results of the NEORV32 processor for an **Intel Cyclone IV EP4CE22F17C6N FPGA** on
183
a DE0-nano board. The design was synthesized using **Intel Quartus Prime Lite 19.1** ("balanced implementation"). The timing
184 4 zero_gravi
information is derived from the Timing Analyzer / Slow 1200mV 0C Model. If not otherwise specified, the default configuration
185 12 zero_gravi
of the processor's generics is assumed. No constraints were used at all.
186 2 zero_gravi
 
187 11 zero_gravi
### CPU
188
 
189 12 zero_gravi
Results generated for hardware version: `1.2.0.0`
190 2 zero_gravi
 
191 12 zero_gravi
| CPU Configuration                | LEs        | FFs      | Memory bits | DSPs | f_max   |
192
|:---------------------------------|:----------:|:--------:|:-----------:|:----:|:-------:|
193
| `rv32i`                          |       1065 |      477 |       2048  |    0 | 112 MHz |
194
| `rv32i`   + `Zicsr` + `Zifencei` |       1914 |      837 |       2048  |    0 | 100 MHz |
195
| `rv32im`  + `Zicsr` + `Zifencei` |       2542 |     1085 |       2048  |    0 | 100 MHz |
196
| `rv32imc` + `Zicsr` + `Zifencei` |       2806 |     1102 |       2048  |    0 | 100 MHz |
197
| `rv32emc` + `Zicsr` + `Zifencei` |       2783 |     1102 |       1024  |    0 | 100 MHz |
198 2 zero_gravi
 
199 6 zero_gravi
### Processor-Internal Peripherals and Memories
200 2 zero_gravi
 
201 12 zero_gravi
Results generated for hardware version: `1.2.0.0`
202 11 zero_gravi
 
203 2 zero_gravi
| Module   | Description                                     | LEs | FFs | Memory bits | DSPs |
204
|:---------|:------------------------------------------------|:---:|:---:|:-----------:|:----:|
205 4 zero_gravi
| BOOT ROM | Bootloader ROM (4kB)                            |   3 |   1 |      32 768 |    0 |
206 6 zero_gravi
| DEVNULL  | Dummy device                                    |   3 |   1 |           0 |    0 |
207 2 zero_gravi
| DMEM     | Processor-internal data memory (8kB)            |  12 |   2 |      65 536 |    0 |
208 6 zero_gravi
| GPIO     | General purpose input/output ports              |  38 |  33 |           0 |    0 |
209 2 zero_gravi
| IMEM     | Processor-internal instruction memory (16kb)    |   7 |   2 |     131 072 |    0 |
210 11 zero_gravi
| MTIME    | Machine system timer                            | 269 | 166 |           0 |    0 |
211 6 zero_gravi
| PWM      | Pulse-width modulation controller               |  76 |  69 |           0 |    0 |
212
| SPI      | Serial peripheral interface                     | 206 | 125 |           0 |    0 |
213 12 zero_gravi
| SYSINFO  | System configuration information memory         |   7 |   7 |           0 |    0 |
214 6 zero_gravi
| TRNG     | True random number generator                    | 104 |  93 |           0 |    0 |
215
| TWI      | Two-wire interface                              |  78 |  44 |           0 |    0 |
216
| UART     | Universal asynchronous receiver/transmitter     | 151 | 108 |           0 |    0 |
217 2 zero_gravi
| WDT      | Watchdog timer                                  |  57 |  45 |           0 |    0 |
218
 
219
 
220 11 zero_gravi
### Exemplary FPGA Setups
221 6 zero_gravi
 
222 11 zero_gravi
Exemplary implementation results for different FPGA platforms. The processor setup uses *all provided peripherals*,
223 12 zero_gravi
no external memory interface and only internal instruction and data memories. IMEM uses 16kB and DMEM uses 8kB memory space. The setup's top entity connects most of the
224 11 zero_gravi
processor's [top entity](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) signals
225 12 zero_gravi
to FPGA pins - except for the Wishbone bus and the interrupt signals.
226 6 zero_gravi
 
227 13 zero_gravi
Results generated for hardware version: `1.2.0.6`
228 6 zero_gravi
 
229 13 zero_gravi
| Vendor  | FPGA                              | Board            | Toolchain               | Impl. strategy |CPU                               | LUT / LE   | FF / REG   | DSP    | Memory Bits  | BRAM / EBR | SPRAM    | Frequency    |
230
|:--------|:----------------------------------|:-----------------|:------------------------|:---------------|:---------------------------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|-------------:|
231
| Intel   | Cyclone IV `EP4CE22F17C6N`        | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced       | `rv32imc` + `Zicsr` + `Zifencei` | 4035 (18%) | 1860  (8%) | 0 (0%) | 231424 (38%) |          - |        - |      101 MHz |
232
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0     | Radiant 2.1 (LSE)       | timing         | `rv32ic`  + `Zicsr` + `Zifencei` | 5001 (95%) | 1694 (32%) | 0 (0%) |            - |   12 (40%) | 4 (100%) |   c 22.5 MHz |
233
| Xilinx  | Artix-7 `XC7A35TICSG324-1L`       | Arty A7-35T      | Vivado 2019.2           | default        | `rv32imc` + `Zicsr` + `Zifencei` | 2509 (12%) | 1914  (5%) | 0 (0%) |            - |    8 (16%) |        - |    c 100 MHz |
234 2 zero_gravi
 
235 11 zero_gravi
**Notes**
236
* The Lattice iCE40 UltraPlus setup uses the FPGA's SPRAM memory primitives for the internal IMEM and DEMEM (each 64kb).
237 12 zero_gravi
The FPGA-specific memory components can be found in [`rtl/fpga_specific`](https://github.com/stnolting/neorv32/blob/master/rtl/fpga_specific/lattice_ice40up).
238
* The clock frequencies marked with a "c" are constrained clocks. The remaining ones are _f_max_ results from the place and route timing reports.
239 11 zero_gravi
* The Upduino and the Arty board have on-board SPI flash memories for storing the FPGA configuration. These device can also be used by the default NEORV32
240
bootloader to store and automatically boot an application program after reset (both tested successfully).
241 2 zero_gravi
 
242
## Performance
243
 
244
### CoreMark Benchmark
245
 
246
The [CoreMark CPU benchmark](https://www.eembc.org/coremark) was executed on the NEORV32 and is available in the
247
[sw/example/coremark](https://github.com/stnolting/neorv32/blob/master/sw/example/coremark) project folder. This benchmark
248
tests the capabilities of a CPU itself rather than the functions provided by the whole system / SoC.
249
 
250 12 zero_gravi
Results generated for hardware version: `1.2.0.0`
251 2 zero_gravi
 
252
~~~
253
**Configuration**
254 12 zero_gravi
Hardware:    32kB IMEM, 16kB DMEM, 100MHz clock
255
CoreMark:    2000 iterations, MEM_METHOD is MEM_STACK
256
Compiler:    RISCV32-GCC 9.2.0
257
Peripherals: UART for printing the results
258 2 zero_gravi
~~~
259
 
260 12 zero_gravi
| CPU                              | Optimization | CoreMark Score | CoreMarks/MHz |
261
|:---------------------------------|:------------:|:--------------:|:-------------:|
262
| `rv32i`   + `Zicsr` + `Zifencei` |        `-O2` |          25.97 |        0.2597 |
263
| `rv32im`  + `Zicsr` + `Zifencei` |        `-O2` |          55.55 |        0.5555 |
264
| `rv32imc` + `Zicsr` + `Zifencei` |        `-O2` |          54.05 |        0.5405 |
265 2 zero_gravi
 
266
 
267
### Instruction Cycles
268
 
269 11 zero_gravi
The NEORV32 CPU is based on a two-stages pipelined architecutre. Each stage uses a multi-cycle processing scheme. Hence,
270 9 zero_gravi
each instruction requires several clock cycles to execute (2 cycles for ALU operations, ..., 40 cycles for divisions).
271
The average CPI (cycles per instruction) depends on the instruction mix of a specific applications and also on the available
272 2 zero_gravi
CPU extensions.
273
 
274
Please note that the CPU-internal shifter (e.g. for the `SLL` instruction) as well as the multiplier and divider of the
275
`M` extension use a bit-serial approach and require several cycles for completion.
276
 
277 6 zero_gravi
The following table shows the performance results for successfully running 2000 CoreMark
278 9 zero_gravi
iterations, which reflects a pretty good "real-life" work load. The average CPI is computed by
279 12 zero_gravi
dividing the total number of required clock cycles (only the timed core to avoid distortion due to IO wait cycles; sampled via the `cycle[h]` CSRs)
280
by the number of executed instructions (`instret[h]` CSRs). The executables were generated using optimization `-O2`.
281 2 zero_gravi
 
282 12 zero_gravi
Results generated for hardware version: `1.2.0.0`
283 2 zero_gravi
 
284 12 zero_gravi
| CPU                              | Required Clock Cycles | Executed Instructions | Average CPI |
285
|:---------------------------------|----------------------:|----------------------:|:-----------:|
286
| `rv32i`   + `Zicsr` + `Zifencei` |         7 754 927 850 |         1 492 843 669 |         5.2 |
287
| `rv32im`  + `Zicsr` + `Zifencei` |         3 684 015 850 |           626 274 115 |         5.9 |
288
| `rv32imc` + `Zicsr` + `Zifencei` |         3 788 220 853 |           626 274 115 |         6.0 |
289 2 zero_gravi
 
290
 
291 12 zero_gravi
 
292 2 zero_gravi
## Top Entity
293
 
294
The top entity of the processor is [**neorv32_top.vhd**](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) (from the `rtl/core` folder).
295
Just instantiate this file in your project and you are ready to go! All signals of this top entity are of type *std_ulogic* or *std_ulogic_vector*, respectively
296
(except for the TWI signals, which are of type *std_logic*).
297
 
298 12 zero_gravi
Use the generics to configure the processor according to your needs. Each generic is initilized with the default configuration.
299 2 zero_gravi
Detailed information regarding the signals and configuration generics can be found in the [NEORV32 documentary](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
300
 
301
```vhdl
302
entity neorv32_top is
303
  generic (
304
    -- General --
305 12 zero_gravi
    CLOCK_FREQUENCY              : natural := 0;      -- clock frequency of clk_i in Hz
306 8 zero_gravi
    BOOTLOADER_USE               : boolean := true;   -- implement processor-internal bootloader?
307
    CSR_COUNTERS_USE             : boolean := true;   -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])?
308 12 zero_gravi
    USER_CODE                    : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
309 2 zero_gravi
    -- RISC-V CPU Extensions --
310 8 zero_gravi
    CPU_EXTENSION_RISCV_C        : boolean := true;   -- implement compressed extension?
311
    CPU_EXTENSION_RISCV_E        : boolean := false;  -- implement embedded RF extension?
312
    CPU_EXTENSION_RISCV_M        : boolean := true;   -- implement muld/div extension?
313
    CPU_EXTENSION_RISCV_Zicsr    : boolean := true;   -- implement CSR system?
314
    CPU_EXTENSION_RISCV_Zifencei : boolean := true;   -- implement instruction stream sync.?
315 2 zero_gravi
    -- Memory configuration: Instruction memory --
316 8 zero_gravi
    MEM_ISPACE_BASE              : std_ulogic_vector(31 downto 0) := x"00000000"; -- base address of instruction memory space
317
    MEM_ISPACE_SIZE              : natural := 16*1024; -- total size of instruction memory space in byte
318
    MEM_INT_IMEM_USE             : boolean := true;    -- implement processor-internal instruction memory
319
    MEM_INT_IMEM_SIZE            : natural := 16*1024; -- size of processor-internal instruction memory in bytes
320
    MEM_INT_IMEM_ROM             : boolean := false;   -- implement processor-internal instruction memory as ROM
321 2 zero_gravi
    -- Memory configuration: Data memory --
322 8 zero_gravi
    MEM_DSPACE_BASE              : std_ulogic_vector(31 downto 0) := x"80000000"; -- base address of data memory space
323
    MEM_DSPACE_SIZE              : natural := 8*1024; -- total size of data memory space in byte
324
    MEM_INT_DMEM_USE             : boolean := true;   -- implement processor-internal data memory
325
    MEM_INT_DMEM_SIZE            : natural := 8*1024; -- size of processor-internal data memory in bytes
326 2 zero_gravi
    -- Memory configuration: External memory interface --
327 8 zero_gravi
    MEM_EXT_USE                  : boolean := false;  -- implement external memory bus interface?
328
    MEM_EXT_REG_STAGES           : natural := 2;      -- number of interface register stages (0,1,2)
329
    MEM_EXT_TIMEOUT              : natural := 15;     -- cycles after which a valid bus access will timeout (>=1)
330 2 zero_gravi
    -- Processor peripherals --
331 8 zero_gravi
    IO_GPIO_USE                  : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
332
    IO_MTIME_USE                 : boolean := true;   -- implement machine system timer (MTIME)?
333
    IO_UART_USE                  : boolean := true;   -- implement universal asynchronous receiver/transmitter (UART)?
334
    IO_SPI_USE                   : boolean := true;   -- implement serial peripheral interface (SPI)?
335
    IO_TWI_USE                   : boolean := true;   -- implement two-wire interface (TWI)?
336
    IO_PWM_USE                   : boolean := true;   -- implement pulse-width modulation unit (PWM)?
337
    IO_WDT_USE                   : boolean := true;   -- implement watch dog timer (WDT)?
338
    IO_CLIC_USE                  : boolean := true;   -- implement core local interrupt controller (CLIC)?
339
    IO_TRNG_USE                  : boolean := false;  -- implement true random number generator (TRNG)?
340
    IO_DEVNULL_USE               : boolean := true    -- implement dummy device (DEVNULL)?
341 2 zero_gravi
  );
342
  port (
343
    -- Global control --
344
    clk_i        : in  std_ulogic := '0'; -- global clock, rising edge
345
    rstn_i       : in  std_ulogic := '0'; -- global reset, low-active, async
346
    -- Wishbone bus interface (available if MEM_EXT_USE = true) --
347
    wb_adr_o     : out std_ulogic_vector(31 downto 0); -- address
348
    wb_dat_i     : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
349
    wb_dat_o     : out std_ulogic_vector(31 downto 0); -- write data
350
    wb_we_o      : out std_ulogic; -- read/write
351
    wb_sel_o     : out std_ulogic_vector(03 downto 0); -- byte enable
352
    wb_stb_o     : out std_ulogic; -- strobe
353
    wb_cyc_o     : out std_ulogic; -- valid cycle
354
    wb_ack_i     : in  std_ulogic := '0'; -- transfer acknowledge
355
    wb_err_i     : in  std_ulogic := '0'; -- transfer error
356 12 zero_gravi
    -- Advanced memory control signals (available if MEM_EXT_USE = true) --
357
    fence_o      : out std_ulogic; -- indicates an executed FENCE operation
358
    fencei_o     : out std_ulogic; -- indicates an executed FENCEI operation
359 2 zero_gravi
    -- GPIO (available if IO_GPIO_USE = true) --
360
    gpio_o       : out std_ulogic_vector(15 downto 0); -- parallel output
361
    gpio_i       : in  std_ulogic_vector(15 downto 0) := (others => '0'); -- parallel input
362
    -- UART (available if IO_UART_USE = true) --
363
    uart_txd_o   : out std_ulogic; -- UART send data
364
    uart_rxd_i   : in  std_ulogic := '0'; -- UART receive data
365
    -- SPI (available if IO_SPI_USE = true) --
366 6 zero_gravi
    spi_sck_o    : out std_ulogic; -- serial clock line
367
    spi_sdo_o    : out std_ulogic; -- serial data line out
368
    spi_sdi_i    : in  std_ulogic := '0'; -- serial data line in
369 2 zero_gravi
    spi_csn_o    : out std_ulogic_vector(07 downto 0); -- SPI CS
370
    -- TWI (available if IO_TWI_USE = true) --
371
    twi_sda_io   : inout std_logic := 'H'; -- twi serial data line
372
    twi_scl_io   : inout std_logic := 'H'; -- twi serial clock line
373
    -- PWM (available if IO_PWM_USE = true) --
374
    pwm_o        : out std_ulogic_vector(03 downto 0); -- pwm channels
375
    -- Interrupts (available if IO_CLIC_USE = true) --
376
    ext_irq_i    : in  std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request
377
    ext_ack_o    : out std_ulogic_vector(01 downto 0)  -- external interrupt request acknowledge
378
  );
379
end neorv32_top;
380
```
381
 
382
 
383
 
384
## Getting Started
385
 
386
This overview is just a short excerpt from the *Let's Get It Started* section of the NEORV32 documentary:
387
 
388
[![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf)
389
 
390
 
391
### Building the Toolchain
392
 
393
At first you need the **RISC-V GCC toolchain**. You can either [download the sources](https://github.com/riscv/riscv-gnu-toolchain)
394
and build the toolchain by yourself, or you can download a prebuilt one and install it.
395
 
396
To build the toolchain by yourself, get the sources from the official [RISCV-GNU-TOOLCHAIN](https://github.com/riscv/riscv-gnu-toolchain) github page:
397
 
398
    $ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
399
 
400
Download and install the prerequisite standard packages:
401
 
402
    $ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
403
 
404
To build the Linux cross-compiler, pick an install path. If you choose, say, `/opt/riscv`, then add `/opt/riscv/bin` to your `PATH` environment variable.
405
 
406
    $ export PATH:$PATH:/opt/riscv/bin
407
 
408
Then, simply run the following commands in the RISC-V GNU toolchain source folder (for the `rv32i` toolchain):
409
 
410
    riscv-gnu-toolchain$ ./configure --prefix=/opt/riscv --with-arch=rv32i –with-abi=ilp32
411
    riscv-gnu-toolchain$ make
412
 
413
After a while (hours!) you will get `riscv32-unknown-elf-gcc` and all of its friends in your `/opt/riscv/bin` folder.
414
 
415
 
416
### Using a Prebuilt Toolchain
417
 
418
Alternatively, you can download a prebuilt toolchain. I have uploaded the toolchain I am using to GitHub. This toolchain
419
has been compiled on a 64-bit x86 Ubuntu (Ubuntu on Windows). Download the toolchain of choice:
420
 
421
[https://github.com/stnolting/riscv_gcc_prebuilt](https://github.com/stnolting/riscv_gcc_prebuilt)
422
 
423
 
424 11 zero_gravi
### Dowload the NEORV32 and Create a Hardware Project
425 2 zero_gravi
 
426 12 zero_gravi
Get the sources of the NEORV32 Processor project. You can either download a [release](https://github.com/stnolting/neorv32/releases)
427
or get the most recent version of this project as [`*.zip` file](https://github.com/stnolting/neorv32/archive/master.zip) or using `git clone` (suggested for easy project updates via `git pull`):
428
 
429 2 zero_gravi
    $ git clone https://github.com/stnolting/neorv32.git
430
 
431 12 zero_gravi
Create a new project with your FPGA design tool of choice and add all the `*.vhd` files from the [`rtl/core`](https://github.com/stnolting/neorv32/blob/master/rtl)
432
folder to this project. Make sure to add them to a **new library** called `neorv32`.
433 2 zero_gravi
 
434 11 zero_gravi
You can either instantiate the [processor's top entity](https://github.com/stnolting/neorv32#top-entity) in your own project or you
435
can use a simple [test setup](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates/neorv32_test_setup.vhd) (from the project's
436
[`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates) folder) as top entity.
437 12 zero_gravi
This test setup instantiates the processor and implements most of the peripherals and some ISA extensions. Only the UART, clock, reset and some GPIO output sginals are
438 11 zero_gravi
propagated (basically, its a FPGA "hello world" example):
439 2 zero_gravi
 
440
```vhdl
441 9 zero_gravi
  entity neorv32_test_setup is
442
    port (
443
      -- Global control --
444
      clk_i      : in  std_ulogic := '0'; -- global clock, rising edge
445
      rstn_i     : in  std_ulogic := '0'; -- global reset, low-active, async
446
      -- GPIO --
447
      gpio_o     : out std_ulogic_vector(7 downto 0); -- parallel output
448
      -- UART --
449
      uart_txd_o : out std_ulogic; -- UART send data
450
      uart_rxd_i : in  std_ulogic := '0' -- UART receive data
451
    );
452
  end neorv32_test_setup;
453 2 zero_gravi
```
454
 
455
 
456
### Compiling and Uploading One of the Example Projects
457
 
458 11 zero_gravi
Make sure `GNU Make` and a native `GCC` compiler are installed. To test the installation of the RISC-V toolchain navigate to an example project like
459 2 zero_gravi
`sw/example/blink_led` and run:
460
 
461
    neorv32/sw/example/blink_led$ make check
462
 
463 9 zero_gravi
The NEORV32 project includes some [example programs](https://github.com/stnolting/neorv32/tree/master/sw/example) from
464
which you can start your own application. Simply compile one of these projects. This will create a NEORV32
465
executable `neorv32_exe.bin` in the same folder.
466 2 zero_gravi
 
467
    neorv32/sw/example/blink_led$ make clean_all compile
468
 
469
Connect your FPGA board via UART to you computer and open the according port to interface with the NEORV32 bootloader. The bootloader
470
uses the following default UART configuration:
471
 
472
- 19200 Baud
473
- 8 data bits
474
- 1 stop bit
475
- No parity bits
476
- No transmission / flow control protocol (raw bytes only)
477
- Newline on `\r\n` (carriage return & newline)
478
 
479 9 zero_gravi
Use the bootloader console to upload the `neorv32_exe.bin` file and run your application image.
480 2 zero_gravi
 
481 9 zero_gravi
```
482
  << NEORV32 Bootloader >>
483
 
484
  BLDV: Jul  6 2020
485
  HWV:  1.0.1.0
486
  CLK:  0x0134FD90 Hz
487 13 zero_gravi
  USER: 0x0001CE40
488 9 zero_gravi
  MISA: 0x42801104
489
  CONF: 0x03FF0035
490
  IMEM: 0x00010000 bytes @ 0x00000000
491
  DMEM: 0x00010000 bytes @ 0x80000000
492
 
493
  Autoboot in 8s. Press key to abort.
494
  Aborted.
495
 
496
  Available CMDs:
497
   h: Help
498
   r: Restart
499
   u: Upload
500
   s: Store to flash
501
   l: Load from flash
502
   e: Execute
503
  CMD:> u
504
  Awaiting neorv32_exe.bin... OK
505
  CMD:> e
506
  Booting...
507
 
508
  Blinking LED demo program
509
```
510 2 zero_gravi
 
511 9 zero_gravi
Going further: Take a look at the _Let's Get It Started!_ chapter of the [![NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/PDF_32.png) NEORV32 datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf).
512 2 zero_gravi
 
513
 
514
 
515 9 zero_gravi
## Contribute
516 2 zero_gravi
 
517 9 zero_gravi
I'm always thankful for help! So if you have any questions, bug reports, ideas or if you want to give some kind of feedback, feel free
518
to open a [new issue](https://github.com/stnolting/neorv32/issues).
519 2 zero_gravi
 
520 9 zero_gravi
If you want to get involved you can also directly drop me a line (mailto:stnolting@gmail.com).
521
Please also check out the project's [code of conduct](https://github.com/stnolting/neorv32/tree/master/CODE_OF_CONDUCT.md).
522 2 zero_gravi
 
523
 
524 9 zero_gravi
 
525 11 zero_gravi
## Legal
526 2 zero_gravi
 
527 12 zero_gravi
This project is released under the BSD 3-Clause license. No copyright infringement intended.
528 11 zero_gravi
Other implied or used projects might have different licensing - see their documentation to get more information.
529
 
530
#### Citation
531
 
532 2 zero_gravi
If you are using the NEORV32 Processor in some kind of publication, please cite it as follows:
533
 
534
> S. Nolting, "The NEORV32 Processor", github.com/stnolting/neorv32
535
 
536 9 zero_gravi
#### BSD 3-Clause License
537 2 zero_gravi
 
538
Copyright (c) 2020, Stephan Nolting. All rights reserved.
539
 
540
Redistribution and use in source and binary forms, with or without modification, are
541
permitted provided that the following conditions are met:
542
 
543
1. Redistributions of source code must retain the above copyright notice, this list of
544
conditions and the following disclaimer.
545
2. Redistributions in binary form must reproduce the above copyright notice, this list of
546
conditions and the following disclaimer in the documentation and/or other materials
547
provided with the distribution.
548
3. Neither the name of the copyright holder nor the names of its contributors may be used to
549
endorse or promote products derived from this software without specific prior written
550
permission.
551
 
552
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
553
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
554
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
555
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
556
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
557
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
558
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
559
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
560
OF THE POSSIBILITY OF SUCH DAMAGE.
561
 
562
 
563 9 zero_gravi
#### Limitation of Liability for External Links
564
 
565
Our website contains links to the websites of third parties („external links“). As the
566
content of these websites is not under our control, we cannot assume any liability for
567
such external content. In all cases, the provider of information of the linked websites
568
is liable for the content and accuracy of the information provided. At the point in time
569
when the links were placed, no infringements of the law were recognisable to us. As soon
570
as an infringement of the law becomes known to us, we will immediately remove the
571
link in question.
572
 
573
 
574 11 zero_gravi
#### Proprietary  Notice
575 9 zero_gravi
 
576 2 zero_gravi
"Windows" is a trademark of Microsoft Corporation.
577
 
578
"Artix" and "Vivado" are trademarks of Xilinx Inc.
579
 
580 11 zero_gravi
"Cyclone", "Quartus Prime", "Quartus Prime Lite" and "Avalon Bus" are trademarks of Intel Corporation.
581 2 zero_gravi
 
582 11 zero_gravi
"Artix" and "Vivado" are trademarks of Xilinx, Inc.
583
 
584 2 zero_gravi
"iCE40", "UltraPlus" and "Lattice Radiant" are trademarks of Lattice Semiconductor Corporation.
585
 
586 13 zero_gravi
"AXI" and "AXI-Lite" are trademarks of Arm Holdings plc.
587 2 zero_gravi
 
588
 
589 11 zero_gravi
## Acknowledgement
590 9 zero_gravi
 
591 11 zero_gravi
[RISC-V](https://riscv.org/) - Instruction Sets Want To Be Free :heart:
592
 
593 2 zero_gravi
[![Continous Integration provided by Travis CI](https://travis-ci.com/images/logos/TravisCI-Full-Color.png)](https://travis-ci.com/stnolting/neorv32)
594
 
595
Continous integration provided by [Travis CI](https://travis-ci.com/stnolting/neorv32) and powered by [GHDL](https://github.com/ghdl/ghdl).
596
 
597
 
598
![Open Source Hardware Logo https://www.oshwa.org](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/oshw_logo.png)
599
 
600
This project is not affiliated with or endorsed by the Open Source Initiative (https://www.oshwa.org / https://opensource.org).
601
 
602 12 zero_gravi
.
603 2 zero_gravi
 
604 6 zero_gravi
Made with :coffee: in Hannover, Germany.

powered by: WebSVN 2.1.0

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