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

Subversion Repositories neorv32

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

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

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