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

Subversion Repositories neorv32

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

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
ISA Specification Version 2.1** 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
| [Pre-build 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
| [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 9 zero_gravi
### Limitations to be fixed
69 7 zero_gravi
 
70
* No exception is triggered in `E`-mode when using registers above `x15` yet
71 11 zero_gravi
* `misa` CSR is read-only; no dynamic enabling/disabling of implemented CPU extensions during runtime
72 7 zero_gravi
 
73
 
74 9 zero_gravi
### To-Do / Wish List
75 7 zero_gravi
 
76 9 zero_gravi
- Synthesis results for more platforms
77 7 zero_gravi
- Port Dhrystone benchmark
78
- Implement atomic operations (`A` extension)
79
- Implement co-processor for single-precision floating-point operations (`F` extension)
80
- Implement user mode (`U` extension)
81
- Make a 64-bit branch
82
- Maybe port an RTOS (like [freeRTOS](https://www.freertos.org/) or [RIOT](https://www.riot-os.org/))
83
 
84
 
85
 
86 2 zero_gravi
## Features
87
 
88
### Processor Features
89
 
90 11 zero_gravi
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_processor.png)
91
 
92 8 zero_gravi
  - RISC-V-compliant `rv32i` or `rv32e` CPU with optional `C`, `E`, `M`, `Zicsr` and `rv32Zifencei` extensions
93 2 zero_gravi
  - GCC-based toolchain ([pre-compiled rv32i and rv32 etoolchains available](https://github.com/stnolting/riscv_gcc_prebuilt))
94 3 zero_gravi
  - Application compilation based on [GNU makefiles](https://github.com/stnolting/neorv32/blob/master/sw/example/blink_led/makefile)
95 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)
96
  - Detailed [datasheet](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/NEORV32.pdf) (pdf)
97 2 zero_gravi
  - Completely described in behavioral, platform-independent VHDL – no primitives, macros, etc.
98
  - Fully synchronous design, no latches, no gated clocks
99
  - Small hardware footprint and high operating frequency
100 7 zero_gravi
  - Highly customizable processor configuration
101 2 zero_gravi
  - Optional processor-internal data and instruction memories (DMEM/IMEM)
102 7 zero_gravi
  - _Optional_ internal bootloader with UART console and automatic SPI flash boot option
103
  - _Optional_ machine system timer (MTIME), RISC-V-compliant
104
  - _Optional_ universal asynchronous receiver and transmitter (UART)
105
  - _Optional_ 8/16/24/32-bit serial peripheral interface controller (SPI) with 8 dedicated chip select lines
106
  - _Optional_ two wire serial interface controller (TWI), compatible to the I²C standard
107
  - _Optional_ general purpose parallel IO port (GPIO), 16xOut & 16xIn, with pin-change interrupt
108
  - _Optional_ 32-bit external bus interface, Wishbone b4 compliant (WISHBONE)
109
  - _Optional_ watchdog timer (WDT)
110
  - _Optional_ PWM controller with 4 channels and 8-bit duty cycle resolution (PWM)
111
  - _Optional_ GARO-based true random number generator (TRNG)
112
  - _Optional_ core-local interrupt controller with 8 channels (CLIC)
113
  - _Optional_ dummy device (DEVNULL) (can be used for *fast* simulation console output)
114 2 zero_gravi
 
115
### CPU Features
116
 
117 11 zero_gravi
![neorv32 Overview](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/neorv32_cpu.png)
118
 
119
The CPU is [compliant](https://github.com/stnolting/neorv32_riscv_compliance) to the
120
[official RISC-V specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf) including a subset of the
121 2 zero_gravi
[RISC-V privileged architecture specifications](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/riscv-spec.pdf).
122
 
123 11 zero_gravi
More information regarding the CPU including a detailed list of the instruction set and the available CSRs can be found in
124
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).
125
 
126
 
127
**General**:
128
  * No hardware support of unaligned accesses - they will trigger and exception
129
  * Two stages in-order pipeline (FETCH, EXECUTE); each stage uses a multi-cycle processing scheme
130
 
131
 
132 3 zero_gravi
**RV32I base instruction set** (`I` extension):
133 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`
134 7 zero_gravi
  * Jump and branch instructions: `JAL` `JALR` `BEQ` `BNE` `BLT` `BGE` `BLTU` `BGEU`
135 2 zero_gravi
  * Memory instructions: `LB` `LH` `LW` `LBU` `LHU` `SB` `SH` `SW`
136 8 zero_gravi
  * System instructions: `ECALL` `EBREAK` `FENCE`
137 2 zero_gravi
 
138 3 zero_gravi
**Compressed instructions** (`C` extension):
139 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`
140 7 zero_gravi
  * Jump and branch instructions: `C.J` `C.JAL` `C.JR` `C.JALR` `C.BEQZ` `C.BNEZ`
141 2 zero_gravi
  * Memory instructions: `C.LW` `C.SW` `C.LWSP` `C.SWSP`
142
  * Misc instructions: `C.EBREAK` (only with `Zicsr` extension)
143
 
144 3 zero_gravi
**Embedded CPU version** (`E` extension):
145 2 zero_gravi
  * Reduced register file (only the 16 lowest registers)
146
  * No performance counter CSRs
147
 
148 3 zero_gravi
**Integer multiplication and division hardware** (`M` extension):
149 2 zero_gravi
  * Multiplication instructions: `MUL` `MULH` `MULHSU` `MULHU`
150
  * Division instructions: `DIV` `DIVU` `REM` `REMU`
151
 
152 8 zero_gravi
**Privileged architecture / CSR access** (`Zicsr` extension):
153 2 zero_gravi
  * Privilege levels: `M-mode` (Machine mode)
154
  * CSR access instructions: `CSRRW` `CSRRS` `CSRRC` `CSRRWI` `CSRRSI` `CSRRCI`
155 8 zero_gravi
  * System instructions: `MRET` `WFI`
156 2 zero_gravi
  * Counter CSRs: `cycle` `cycleh` `time` `timeh` `instret` `instreth` `mcycle` `mcycleh` `minstret` `minstreth`
157 11 zero_gravi
  * Machine CSRs: `mstatus` `misa`(read-only!) `mie` `mtvec` `mscratch` `mepc` `mcause` `mtval` `mip` `mimpid` `mhartid`
158 2 zero_gravi
  * Custom CSRs: `mfeatures` `mclock` `mispacebase` `mdspacebase` `mispacesize` `mdspacesize`
159
  * Supported exceptions and interrupts:
160
    * Misaligned instruction address
161
    * Instruction access fault
162
    * Illegal instruction
163 4 zero_gravi
    * Breakpoint (via `ebreak` instruction)
164 2 zero_gravi
    * Load address misaligned
165
    * Load access fault
166 4 zero_gravi
    * Store address misaligned
167 2 zero_gravi
    * Store access fault
168 4 zero_gravi
    * Environment call from M-mode (via `ecall` instruction)
169 11 zero_gravi
    * Machine software interrupt `msi`
170 9 zero_gravi
    * Machine timer interrupt `mti` (via MTIME unit)
171
    * Machine external interrupt `mei` (via CLIC unit)
172 2 zero_gravi
 
173 8 zero_gravi
**Privileged architecture / FENCE.I** (`Zifencei` extension):
174
  * System instructions: `FENCE.I`
175
 
176 2 zero_gravi
 
177
## FPGA Implementation Results
178
 
179
This chapter shows exemplary implementation results of the NEORV32 processor for an **Intel Cyclone IV EP4CE22F17C6N FPGA** on
180
a DE0-nano board. The design was synthesized using **Intel Quartus Prime Lite 19.1** ("balanced implementation"). The timing
181 4 zero_gravi
information is derived from the Timing Analyzer / Slow 1200mV 0C Model. If not otherwise specified, the default configuration
182 2 zero_gravi
of the processor's generics is assumed. No constraints were used.
183
 
184 11 zero_gravi
### CPU
185
 
186 6 zero_gravi
Results generated for hardware version: `1.0.0.0`
187 2 zero_gravi
 
188
| CPU Configuration   | LEs        | FFs      | Memory bits | DSPs   | f_max   |
189
|:--------------------|:----------:|:--------:|:-----------:|:------:|:-------:|
190 6 zero_gravi
| `rv32i`             |       1027 |      474 |       2048  | 0 (0%) | 111 MHz |
191
| `rv32i` + `Zicsr`   |       1721 |      868 |       2048  | 0 (0%) | 104 MHz |
192
| `rv32im` + `Zicsr`  |       2298 |     1115 |       2048  | 0 (0%) | 103 MHz |
193
| `rv32imc` + `Zicsr` |       2557 |     1138 |       2048  | 0 (0%) | 103 MHz |
194
| `rv32emc` + `Zicsr` |       2342 |     1005 |       1024  | 0 (0%) | 100 MHz |
195 2 zero_gravi
 
196 6 zero_gravi
### Processor-Internal Peripherals and Memories
197 2 zero_gravi
 
198 11 zero_gravi
Results generated for hardware version: `1.0.5.0`
199
 
200 2 zero_gravi
| Module   | Description                                     | LEs | FFs | Memory bits | DSPs |
201
|:---------|:------------------------------------------------|:---:|:---:|:-----------:|:----:|
202 4 zero_gravi
| BOOT ROM | Bootloader ROM (4kB)                            |   3 |   1 |      32 768 |    0 |
203 6 zero_gravi
| DEVNULL  | Dummy device                                    |   3 |   1 |           0 |    0 |
204 2 zero_gravi
| DMEM     | Processor-internal data memory (8kB)            |  12 |   2 |      65 536 |    0 |
205 6 zero_gravi
| GPIO     | General purpose input/output ports              |  38 |  33 |           0 |    0 |
206 2 zero_gravi
| IMEM     | Processor-internal instruction memory (16kb)    |   7 |   2 |     131 072 |    0 |
207 11 zero_gravi
| MTIME    | Machine system timer                            | 269 | 166 |           0 |    0 |
208 6 zero_gravi
| PWM      | Pulse-width modulation controller               |  76 |  69 |           0 |    0 |
209
| SPI      | Serial peripheral interface                     | 206 | 125 |           0 |    0 |
210
| TRNG     | True random number generator                    | 104 |  93 |           0 |    0 |
211
| TWI      | Two-wire interface                              |  78 |  44 |           0 |    0 |
212
| UART     | Universal asynchronous receiver/transmitter     | 151 | 108 |           0 |    0 |
213 2 zero_gravi
| WDT      | Watchdog timer                                  |  57 |  45 |           0 |    0 |
214
 
215
 
216 11 zero_gravi
### Exemplary FPGA Setups
217 6 zero_gravi
 
218 11 zero_gravi
Exemplary implementation results for different FPGA platforms. The processor setup uses *all provided peripherals*,
219
all CPU extensions (`rv32imc` + `Zicsr` + `Zifencei`, no `E` extension), no external memory interface and only internal
220
instruction and data memories. IMEM uses 16kB and DMEM uses 8kB memory space. The setup top entity connects most of the
221
processor's [top entity](https://github.com/stnolting/neorv32/blob/master/rtl/core/neorv32_top.vhd) signals
222
to FPGA pins - except for the Wishbone bus and the external interrupt signals.
223 6 zero_gravi
 
224 11 zero_gravi
Results generated for hardware version: `1.0.1.1`
225 6 zero_gravi
 
226 11 zero_gravi
| Vendor  | FPGA                              | Board            | Toolchain               | Impl. strategy | LUT / LE   | FF / REG   | DSP    | Memory Bits  | BRAM / EBR | SPRAM    | Frequency   |
227
|:--------|:----------------------------------|:-----------------|:------------------------|:---------------|:-----------|:-----------|:-------|:-------------|:-----------|:---------|------------:|
228
| Intel   | Cyclone IV `EP4CE22F17C6N`        | Terasic DE0-Nano | Quartus Prime Lite 19.1 | balanced       | 3841 (17%) | 1866  (8%) | 0 (0%) | 231424 (38%) |          - |        - | 103 MHz     |
229
| Lattice | iCE40 UltraPlus `iCE40UP5K-SG48I` | Upduino v2.0     | Radiant 2.1 (LSE)       | default        | 5014 (95%) | 1952 (37%) | 0 (0%) |            - |   12 (40%) | 4 (100%) | c 20.25 MHz |
230
| Xilinx  | Artix-7 `XC7A35TICSG324-1L`       | Arty A7-35T      | Vivado 2019.2           | default        | 2312 (11%) | 1924  (5%) | 0 (0%) |            - |    8 (16%) |        - | c 100 MHz   |
231 2 zero_gravi
 
232 11 zero_gravi
**Notes**
233
* The Lattice iCE40 UltraPlus setup uses the FPGA's SPRAM memory primitives for the internal IMEM and DEMEM (each 64kb).
234
The FPGA-specific memory components can be found in the [`rtl/fpga_specific`](https://github.com/stnolting/neorv32/blob/master/rtl/fpga_specific/lattice_ice40up) folder.
235
* The clock frequencies marked with a "c" are constrained clocks. The remaining ones are `f_max` results from the place and route timing reports.
236
* 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
237
bootloader to store and automatically boot an application program after reset (both tested successfully).
238 2 zero_gravi
 
239
## Performance
240
 
241
### CoreMark Benchmark
242
 
243
The [CoreMark CPU benchmark](https://www.eembc.org/coremark) was executed on the NEORV32 and is available in the
244
[sw/example/coremark](https://github.com/stnolting/neorv32/blob/master/sw/example/coremark) project folder. This benchmark
245
tests the capabilities of a CPU itself rather than the functions provided by the whole system / SoC.
246
 
247 6 zero_gravi
Results generated for hardware version: `1.0.0.0`
248 2 zero_gravi
 
249
~~~
250
**Configuration**
251
Hardware:         32kB IMEM, 16kb DMEM, 100MHz clock
252
CoreMark:         2000 iterations, MEM_METHOD is MEM_STACK
253
CPU extensions:   `rv32i` or `rv32im` or `rv32imc`
254 11 zero_gravi
Used peripherals: UART for printing the results
255 2 zero_gravi
~~~
256
 
257
| __Configuration__ | __Optimization__ | __Executable Size__ | __CoreMark Score__ | __CoreMarks/MHz__ |
258
|:------------------|:----------------:|:-------------------:|:------------------:|:-----------------:|
259 6 zero_gravi
| `rv32i`           |      `-Os`       |     18 044 bytes    |       21.98        |       0.21        |
260
| `rv32i`           |      `-O2`       |     20 388 bytes    |        25          |       0.25        |
261
| `rv32im`          |      `-Os`       |     16 980 bytes    |        40          |       0.40        |
262
| `rv32im`          |      `-O2`       |     19 436 bytes    |       51.28        |       0.51        |
263
| `rv32imc`         |      `-Os`       |     13 076 bytes    |       39.22        |       0.39        |
264
| `rv32imc`         |      `-O2`       |     15 208 bytes    |        50          |       0.50        |
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
dividing the total number of required clock cycles (all of CoreMark
280 2 zero_gravi
– not only the timed core) by the number of executed instructions (`instret[h]` CSRs). The executables
281
were generated using optimization `-O2`.
282
 
283
| CPU / Toolchain Config. | Required Clock Cycles | Executed Instructions | Average CPI |
284
|:------------------------|----------------------:|----------------------:|:-----------:|
285 6 zero_gravi
| `rv32i`                 |        19 355 607 369 |         2 995 064 579 |     6.5     |
286
| `rv32im`                |         5 809 384 583 |           867 377 291 |     6.7     |
287
| `rv32imc`               |         5 560 220 723 |           825 898 407 |     6.7     |
288 2 zero_gravi
 
289
 
290
 
291
## Top Entity
292
 
293
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).
294
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
295
(except for the TWI signals, which are of type *std_logic*).
296
 
297
Use the generics to configure the processor according to your needs. Each generics is initilized with the default configuration.
298
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).
299
 
300
```vhdl
301
entity neorv32_top is
302
  generic (
303
    -- General --
304 8 zero_gravi
    CLOCK_FREQUENCY              : natural := 0; -- clock frequency of clk_i in Hz
305
    HART_ID                      : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom hardware thread ID
306
    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 2 zero_gravi
    -- RISC-V CPU Extensions --
309 8 zero_gravi
    CPU_EXTENSION_RISCV_C        : boolean := true;   -- implement compressed extension?
310
    CPU_EXTENSION_RISCV_E        : boolean := false;  -- implement embedded RF extension?
311
    CPU_EXTENSION_RISCV_M        : boolean := true;   -- implement muld/div extension?
312
    CPU_EXTENSION_RISCV_Zicsr    : boolean := true;   -- implement CSR system?
313
    CPU_EXTENSION_RISCV_Zifencei : boolean := true;   -- implement instruction stream sync.?
314 2 zero_gravi
    -- Memory configuration: Instruction memory --
315 8 zero_gravi
    MEM_ISPACE_BASE              : std_ulogic_vector(31 downto 0) := x"00000000"; -- base address of instruction memory space
316
    MEM_ISPACE_SIZE              : natural := 16*1024; -- total size of instruction memory space in byte
317
    MEM_INT_IMEM_USE             : boolean := true;    -- implement processor-internal instruction memory
318
    MEM_INT_IMEM_SIZE            : natural := 16*1024; -- size of processor-internal instruction memory in bytes
319
    MEM_INT_IMEM_ROM             : boolean := false;   -- implement processor-internal instruction memory as ROM
320 2 zero_gravi
    -- Memory configuration: Data memory --
321 8 zero_gravi
    MEM_DSPACE_BASE              : std_ulogic_vector(31 downto 0) := x"80000000"; -- base address of data memory space
322
    MEM_DSPACE_SIZE              : natural := 8*1024; -- total size of data memory space in byte
323
    MEM_INT_DMEM_USE             : boolean := true;   -- implement processor-internal data memory
324
    MEM_INT_DMEM_SIZE            : natural := 8*1024; -- size of processor-internal data memory in bytes
325 2 zero_gravi
    -- Memory configuration: External memory interface --
326 8 zero_gravi
    MEM_EXT_USE                  : boolean := false;  -- implement external memory bus interface?
327
    MEM_EXT_REG_STAGES           : natural := 2;      -- number of interface register stages (0,1,2)
328
    MEM_EXT_TIMEOUT              : natural := 15;     -- cycles after which a valid bus access will timeout (>=1)
329 2 zero_gravi
    -- Processor peripherals --
330 8 zero_gravi
    IO_GPIO_USE                  : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
331
    IO_MTIME_USE                 : boolean := true;   -- implement machine system timer (MTIME)?
332
    IO_UART_USE                  : boolean := true;   -- implement universal asynchronous receiver/transmitter (UART)?
333
    IO_SPI_USE                   : boolean := true;   -- implement serial peripheral interface (SPI)?
334
    IO_TWI_USE                   : boolean := true;   -- implement two-wire interface (TWI)?
335
    IO_PWM_USE                   : boolean := true;   -- implement pulse-width modulation unit (PWM)?
336
    IO_WDT_USE                   : boolean := true;   -- implement watch dog timer (WDT)?
337
    IO_CLIC_USE                  : boolean := true;   -- implement core local interrupt controller (CLIC)?
338
    IO_TRNG_USE                  : boolean := false;  -- implement true random number generator (TRNG)?
339
    IO_DEVNULL_USE               : boolean := true    -- implement dummy device (DEVNULL)?
340 2 zero_gravi
  );
341
  port (
342
    -- Global control --
343
    clk_i        : in  std_ulogic := '0'; -- global clock, rising edge
344
    rstn_i       : in  std_ulogic := '0'; -- global reset, low-active, async
345
    -- Wishbone bus interface (available if MEM_EXT_USE = true) --
346
    wb_adr_o     : out std_ulogic_vector(31 downto 0); -- address
347
    wb_dat_i     : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
348
    wb_dat_o     : out std_ulogic_vector(31 downto 0); -- write data
349
    wb_we_o      : out std_ulogic; -- read/write
350
    wb_sel_o     : out std_ulogic_vector(03 downto 0); -- byte enable
351
    wb_stb_o     : out std_ulogic; -- strobe
352
    wb_cyc_o     : out std_ulogic; -- valid cycle
353
    wb_ack_i     : in  std_ulogic := '0'; -- transfer acknowledge
354
    wb_err_i     : in  std_ulogic := '0'; -- transfer error
355
    -- GPIO (available if IO_GPIO_USE = true) --
356
    gpio_o       : out std_ulogic_vector(15 downto 0); -- parallel output
357
    gpio_i       : in  std_ulogic_vector(15 downto 0) := (others => '0'); -- parallel input
358
    -- UART (available if IO_UART_USE = true) --
359
    uart_txd_o   : out std_ulogic; -- UART send data
360
    uart_rxd_i   : in  std_ulogic := '0'; -- UART receive data
361
    -- SPI (available if IO_SPI_USE = true) --
362 6 zero_gravi
    spi_sck_o    : out std_ulogic; -- serial clock line
363
    spi_sdo_o    : out std_ulogic; -- serial data line out
364
    spi_sdi_i    : in  std_ulogic := '0'; -- serial data line in
365 2 zero_gravi
    spi_csn_o    : out std_ulogic_vector(07 downto 0); -- SPI CS
366
    -- TWI (available if IO_TWI_USE = true) --
367
    twi_sda_io   : inout std_logic := 'H'; -- twi serial data line
368
    twi_scl_io   : inout std_logic := 'H'; -- twi serial clock line
369
    -- PWM (available if IO_PWM_USE = true) --
370
    pwm_o        : out std_ulogic_vector(03 downto 0); -- pwm channels
371
    -- Interrupts (available if IO_CLIC_USE = true) --
372
    ext_irq_i    : in  std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request
373
    ext_ack_o    : out std_ulogic_vector(01 downto 0)  -- external interrupt request acknowledge
374
  );
375
end neorv32_top;
376
```
377
 
378
 
379
 
380
## Getting Started
381
 
382
This overview is just a short excerpt from the *Let's Get It Started* section of the NEORV32 documentary:
383
 
384
[![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)
385
 
386
 
387
### Building the Toolchain
388
 
389
At first you need the **RISC-V GCC toolchain**. You can either [download the sources](https://github.com/riscv/riscv-gnu-toolchain)
390
and build the toolchain by yourself, or you can download a prebuilt one and install it.
391
 
392
To build the toolchain by yourself, get the sources from the official [RISCV-GNU-TOOLCHAIN](https://github.com/riscv/riscv-gnu-toolchain) github page:
393
 
394
    $ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
395
 
396
Download and install the prerequisite standard packages:
397
 
398
    $ 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
399
 
400
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.
401
 
402
    $ export PATH:$PATH:/opt/riscv/bin
403
 
404
Then, simply run the following commands in the RISC-V GNU toolchain source folder (for the `rv32i` toolchain):
405
 
406
    riscv-gnu-toolchain$ ./configure --prefix=/opt/riscv --with-arch=rv32i –with-abi=ilp32
407
    riscv-gnu-toolchain$ make
408
 
409
After a while (hours!) you will get `riscv32-unknown-elf-gcc` and all of its friends in your `/opt/riscv/bin` folder.
410
 
411
 
412
### Using a Prebuilt Toolchain
413
 
414
Alternatively, you can download a prebuilt toolchain. I have uploaded the toolchain I am using to GitHub. This toolchain
415
has been compiled on a 64-bit x86 Ubuntu (Ubuntu on Windows). Download the toolchain of choice:
416
 
417
[https://github.com/stnolting/riscv_gcc_prebuilt](https://github.com/stnolting/riscv_gcc_prebuilt)
418
 
419
 
420 11 zero_gravi
### Dowload the NEORV32 and Create a Hardware Project
421 2 zero_gravi
 
422
Now its time to get the most recent version the NEORV32 Processor project from GitHub. Clone the NEORV32 repository using
423
`git` from the command line (suggested for easy project updates via `git pull`):
424
 
425
    $ git clone https://github.com/stnolting/neorv32.git
426
 
427 11 zero_gravi
Create a new project with your FPGA design tool of choice. Add all the `*.vhd` files from the [`rtl/core`](https://github.com/stnolting/neorv32/blob/master/rtl)
428 2 zero_gravi
folder to this project and add them to a **new library** called `neorv32`.
429
 
430 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
431
can use a simple [test setup](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates/neorv32_test_setup.vhd) (from the project's
432
[`rtl/top_templates`](https://github.com/stnolting/neorv32/blob/master/rtl/top_templates) folder) as top entity.
433
This test setup instantiates the processor, implements most of the peripherals and the basic ISA. Only the UART, clock, reset and some GPIO output sginals are
434
propagated (basically, its a FPGA "hello world" example):
435 2 zero_gravi
 
436
```vhdl
437 9 zero_gravi
  entity neorv32_test_setup is
438
    port (
439
      -- Global control --
440
      clk_i      : in  std_ulogic := '0'; -- global clock, rising edge
441
      rstn_i     : in  std_ulogic := '0'; -- global reset, low-active, async
442
      -- GPIO --
443
      gpio_o     : out std_ulogic_vector(7 downto 0); -- parallel output
444
      -- UART --
445
      uart_txd_o : out std_ulogic; -- UART send data
446
      uart_rxd_i : in  std_ulogic := '0' -- UART receive data
447
    );
448
  end neorv32_test_setup;
449 2 zero_gravi
```
450
 
451
 
452
### Compiling and Uploading One of the Example Projects
453
 
454 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
455 2 zero_gravi
`sw/example/blink_led` and run:
456
 
457
    neorv32/sw/example/blink_led$ make check
458
 
459 9 zero_gravi
The NEORV32 project includes some [example programs](https://github.com/stnolting/neorv32/tree/master/sw/example) from
460
which you can start your own application. Simply compile one of these projects. This will create a NEORV32
461
executable `neorv32_exe.bin` in the same folder.
462 2 zero_gravi
 
463
    neorv32/sw/example/blink_led$ make clean_all compile
464
 
465
Connect your FPGA board via UART to you computer and open the according port to interface with the NEORV32 bootloader. The bootloader
466
uses the following default UART configuration:
467
 
468
- 19200 Baud
469
- 8 data bits
470
- 1 stop bit
471
- No parity bits
472
- No transmission / flow control protocol (raw bytes only)
473
- Newline on `\r\n` (carriage return & newline)
474
 
475 9 zero_gravi
Use the bootloader console to upload the `neorv32_exe.bin` file and run your application image.
476 2 zero_gravi
 
477 9 zero_gravi
```
478
  << NEORV32 Bootloader >>
479
 
480
  BLDV: Jul  6 2020
481
  HWV:  1.0.1.0
482
  CLK:  0x0134FD90 Hz
483
  MHID: 0x0001CE40
484
  MISA: 0x42801104
485
  CONF: 0x03FF0035
486
  IMEM: 0x00010000 bytes @ 0x00000000
487
  DMEM: 0x00010000 bytes @ 0x80000000
488
 
489
  Autoboot in 8s. Press key to abort.
490
  Aborted.
491
 
492
  Available CMDs:
493
   h: Help
494
   r: Restart
495
   u: Upload
496
   s: Store to flash
497
   l: Load from flash
498
   e: Execute
499
  CMD:> u
500
  Awaiting neorv32_exe.bin... OK
501
  CMD:> e
502
  Booting...
503
 
504
  Blinking LED demo program
505
```
506 2 zero_gravi
 
507 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).
508 2 zero_gravi
 
509
 
510
 
511 9 zero_gravi
## Contribute
512 2 zero_gravi
 
513 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
514
to open a [new issue](https://github.com/stnolting/neorv32/issues).
515 2 zero_gravi
 
516 9 zero_gravi
If you want to get involved you can also directly drop me a line (mailto:stnolting@gmail.com).
517
Please also check out the project's [code of conduct](https://github.com/stnolting/neorv32/tree/master/CODE_OF_CONDUCT.md).
518 2 zero_gravi
 
519
 
520 9 zero_gravi
 
521 11 zero_gravi
## Legal
522 2 zero_gravi
 
523 11 zero_gravi
This is project is released under the BSD 3-Clause license. No copyright infringement intended.
524
Other implied or used projects might have different licensing - see their documentation to get more information.
525
 
526
#### Citation
527
 
528 2 zero_gravi
If you are using the NEORV32 Processor in some kind of publication, please cite it as follows:
529
 
530
> S. Nolting, "The NEORV32 Processor", github.com/stnolting/neorv32
531
 
532 9 zero_gravi
#### BSD 3-Clause License
533 2 zero_gravi
 
534
Copyright (c) 2020, Stephan Nolting. All rights reserved.
535
 
536
Redistribution and use in source and binary forms, with or without modification, are
537
permitted provided that the following conditions are met:
538
 
539
1. Redistributions of source code must retain the above copyright notice, this list of
540
conditions and the following disclaimer.
541
2. Redistributions in binary form must reproduce the above copyright notice, this list of
542
conditions and the following disclaimer in the documentation and/or other materials
543
provided with the distribution.
544
3. Neither the name of the copyright holder nor the names of its contributors may be used to
545
endorse or promote products derived from this software without specific prior written
546
permission.
547
 
548
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
549
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
550
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
551
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
552
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
553
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
554
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
555
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
556
OF THE POSSIBILITY OF SUCH DAMAGE.
557
 
558
 
559 9 zero_gravi
#### Limitation of Liability for External Links
560
 
561
Our website contains links to the websites of third parties („external links“). As the
562
content of these websites is not under our control, we cannot assume any liability for
563
such external content. In all cases, the provider of information of the linked websites
564
is liable for the content and accuracy of the information provided. At the point in time
565
when the links were placed, no infringements of the law were recognisable to us. As soon
566
as an infringement of the law becomes known to us, we will immediately remove the
567
link in question.
568
 
569
 
570 11 zero_gravi
#### Proprietary  Notice
571 9 zero_gravi
 
572 2 zero_gravi
"Windows" is a trademark of Microsoft Corporation.
573
 
574
"Artix" and "Vivado" are trademarks of Xilinx Inc.
575
 
576 11 zero_gravi
"Cyclone", "Quartus Prime", "Quartus Prime Lite" and "Avalon Bus" are trademarks of Intel Corporation.
577 2 zero_gravi
 
578 11 zero_gravi
"Artix" and "Vivado" are trademarks of Xilinx, Inc.
579
 
580 2 zero_gravi
"iCE40", "UltraPlus" and "Lattice Radiant" are trademarks of Lattice Semiconductor Corporation.
581
 
582
"AXI4" and "AXI4-Lite" are trademarks of Arm Holdings plc.
583
 
584
 
585 11 zero_gravi
## Acknowledgement
586 9 zero_gravi
 
587 11 zero_gravi
[RISC-V](https://riscv.org/) - Instruction Sets Want To Be Free :heart:
588
 
589 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)
590
 
591
Continous integration provided by [Travis CI](https://travis-ci.com/stnolting/neorv32) and powered by [GHDL](https://github.com/ghdl/ghdl).
592
 
593
 
594
![Open Source Hardware Logo https://www.oshwa.org](https://raw.githubusercontent.com/stnolting/neorv32/master/docs/figures/oshw_logo.png)
595
 
596
This project is not affiliated with or endorsed by the Open Source Initiative (https://www.oshwa.org / https://opensource.org).
597
 
598 11 zero_gravi
\
599 2 zero_gravi
 
600 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.