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

Subversion Repositories neorv32

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

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