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

Subversion Repositories neorv32

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

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