URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk/docs/datasheet
- from Rev 73 to Rev 74
- ↔ Reverse comparison
Rev 73 → Rev 74
/cpu.adoc
125,14 → 125,11
:sectnums: |
=== RISC-V Compatibility |
|
The NEORV32 CPU passes the rv32_m/I, rv32_m/M, rv32_m/C, rv32_m/privilege, and |
rv32_m/Zifencei tests of the official RISC-V Architecture Tests (GitHub). The port files for the |
NEORV32 processor are located in the repository's `sw/isa-test` folder. |
The NEORV32 CPU passes the tests of the _RISC-V Architecture Test Framework_. This framework is used to check |
RISC-V implementations for compatibility with the official RISC-V ISA specifications. |
The NEORV32 port of this test framework has been moved to a separate repository: |
https://github.com/stnolting/neorv32-verif |
|
[NOTE] |
See section https://stnolting.github.io/neorv32/ug/#_risc_v_architecture_test_framework[User Guide: RISC-V Architecture Test Framework] |
for information how to run the tests on the NEORV32. |
|
.**RISC-V `rv32_m/C` Tests** |
................................... |
Check cadd-01 ... OK |
180,7 → 177,7
Check bltu-01 ... OK |
Check bne-01 ... OK |
Check fence-01 ... OK |
Check jal-01 ... OK |
Check jal-01 ... IGNORED <1> |
Check jalr-01 ... OK |
Check lb-align-01 ... OK |
Check lbu-align-01 ... OK |
210,6 → 207,7
-------------------------------- |
OK: 39/39 RISCV_TARGET=neorv32 RISCV_DEVICE=I XLEN=32 |
................................... |
<1> Test is skipped due to a GHDL simulation issue. |
|
.**RISC-V `rv32_m/M` Tests** |
................................... |
659,9 → 657,9
halted until a valid interrupt request occurs. To wake up again, at least one interrupt source has to |
be enabled via the <<_mie>> CSR and the global interrupt enable flag in <<_mstatus>> has to be set. |
|
If the <<_mstatus>> `TW` bis is cleared the `wfi` instruction is also allowed to execute when in user-mode. |
This is always the case if user-mode is not implemented. If the `TW` bit is set the execution of `wfi` in |
user-mode will raise an illegal instruction exception. |
[NOTE] |
Executing the `wfi` instruction is user-mode will raise an illegal instruction exception if |
<<_mstatus>>.`TW` is set. |
|
|
==== **`Zicntr`** CPU Base Counters |
839,21 → 837,22
| ALU | `C` | `c.addi4spn` `c.nop` `c.addi` `c.li` `c.addi16sp` `c.lui` `c.andi` `c.sub` `c.xor` `c.or` `c.and` `c.add` `c.mv` | 2 |
| ALU | `I/E` | `slli` `srli` `srai` `sll` `srl` `sra` | 3 + SAfootnote:[Shift amount.]/4 + SA%4; FAST_SHIFTfootnote:[Barrel shift when `FAST_SHIFT_EN` is enabled.]: 4; TINY_SHIFTfootnote:[Serial shift when `TINY_SHIFT_EN` is enabled.]: 2..32 |
| ALU | `C` | `c.srli` `c.srai` `c.slli` | 3 + SAfootnote:[Shift amount (0..31).]; FAST_SHIFTfootnote:[Barrel shifter when `FAST_SHIFT_EN` is enabled.]: |
| Branches | `I/E` | `beq` `bne` `blt` `bge` `bltu` `bgeu` | Taken: 5 + MLfootnote:[Memory latency.]; Not taken: 3 |
| Branches | `C` | `c.beqz` `c.bnez` | Taken: 5 + MLfootnote:[Memory latency.]; Not taken: 3 |
| Jumps / Calls | `I/E` | `jal` `jalr` | 4 + ML |
| Jumps / Calls | `C` | `c.jal` `c.j` `c.jr` `c.jalr` | 4 + ML |
| Memory access | `I/E` | `lb` `lh` `lw` `lbu` `lhu` `sb` `sh` `sw` | 4 + ML |
| Memory access | `C` | `c.lw` `c.sw` `c.lwsp` `c.swsp` | 4 + ML |
| Memory access | `A` | `lr.w` `sc.w` | 4 + ML |
| Multiplication | `M` | `mul` `mulh` `mulhsu` `mulhu` | 2+32+2; FAST_MULfootnote:[DSP-based multiplication; enabled via `FAST_MUL_EN`.]: 4 |
| Division | `M` | `div` `divu` `rem` `remu` | 2+32+2 |
| CSR access | `Zicsr` | `csrrw` `csrrs` `csrrc` `csrrwi` `csrrsi` `csrrci` | 3 |
| System | `I/E` | `fence` | 3 |
| Branches | `I/E` | `beq` `bne` `blt` `bge` `bltu` `bgeu` | Taken: 5 + (ML-1)footnote:[Memory latency.]; Not taken: 3 |
| Branches | `C` | `c.beqz` `c.bnez` | Taken: 5 + (ML-1); Not taken: 3 |
| Jumps / Calls | `I/E` | `jal` `jalr` | 5 + (ML-1) |
| Jumps / Calls | `C` | `c.jal` `c.j` `c.jr` `c.jalr` | 5 + (ML-1) |
| Memory access | `I/E` | `lb` `lh` `lw` `lbu` `lhu` `sb` `sh` `sw` | 5 + (ML-2) |
| Memory access | `C` | `c.lw` `c.sw` `c.lwsp` `c.swsp` | 5 + (ML-2) |
| Memory access | `A` | `lr.w` `sc.w` | 5 + (ML-2) |
| MulDiv | `M` | `mul` `mulh` `mulhsu` `mulhu` | 2+32+2; FAST_MULfootnote:[DSP-based multiplication; enabled via `FAST_MUL_EN`.]: 4 |
| MulDiv | `M` | `div` `divu` `rem` `remu` | 2+32+2 |
| System | `Zicsr` | `csrrw` `csrrs` `csrrc` `csrrwi` `csrrsi` `csrrci` | 3 |
| System | `Zicsr` | `ecall` `ebreak` | 3 |
| System | `Zicsr`+`C` | `c.break` | 3 |
| System | `Zicsr` | `mret` `wfi` | 6 |
| System | `Zifencei` | `fence.i` | 3 + ML |
| System | `Zicsr`+`C` | `c.break` | 3 |
| System | `Zicsr` | `wfi` | 3 |
| System | `Zicsr` | `mret` `dret` | 5 |
| Fence | `I/E` | `fence` | 4 + ML |
| Fence | `Zifencei` | `fence.i` | 4 + ML |
| Floating-point - artihmetic | `Zfinx` | `fadd.s` | 110 |
| Floating-point - artihmetic | `Zfinx` | `fsub.s` | 112 |
| Floating-point - artihmetic | `Zfinx` | `fmul.s` | 22 |
871,7 → 870,7
| Bit-manipulation - carry-less multiply | `B(Zbc)` | `clmul` `clmulh` `clmulr` | 3 + 32 |
| Custom instructions (CFU) | `Zxcfu` | - | min. 4 |
| | | | |
| _Illegal instructions_ | `Zicsr` | - | 2 |
| _Illegal instructions_ | `Zicsr` | - | min. 2 |
|======================= |
|
[NOTE] |
969,38 → 968,38
[cols="3,6,5,14,11,4,4"] |
[options="header",grid="rows"] |
|======================= |
| Prio. | `mcause` | [RISC-V] | ID [C] | Cause | `mepc` | `mtval` |
| Prio. | `mcause` | [RISC-V] | ID [C] | Cause | `mepc` | `mtval` |
7+^| **Synchronous Exceptions** |
| 1 | `0x00000000` | 0.0 | _TRAP_CODE_I_MISALIGNED_ | instruction address misaligned | **PC** | **ADR** |
| 2 | `0x00000001` | 0.1 | _TRAP_CODE_I_ACCESS_ | instruction access bus fault | **PC** | **ADR** |
| 3 | `0x00000002` | 0.2 | _TRAP_CODE_I_ILLEGAL_ | illegal instruction | **PC** | **INST** |
| 4 | `0x0000000B` | 0.11 | _TRAP_CODE_MENV_CALL_ | environment call from M-mode | **PC** | **0** |
| 5 | `0x00000008` | 0.8 | _TRAP_CODE_UENV_CALL_ | environment call from U-mode | **PC** | **0** |
| 6 | `0x00000003` | 0.3 | _TRAP_CODE_BREAKPOINT_ | breakpoint instruction | **PC** | **PC** |
| 7 | `0x00000006` | 0.6 | _TRAP_CODE_S_MISALIGNED_ | store address misaligned | **PC** | **ADR** |
| 8 | `0x00000004` | 0.4 | _TRAP_CODE_L_MISALIGNED_ | load address misaligned | **PC** | **ADR** |
| 9 | `0x00000007` | 0.7 | _TRAP_CODE_S_ACCESS_ | store access bus fault | **PC** | **ADR** |
| 10 | `0x00000005` | 0.5 | _TRAP_CODE_L_ACCESS_ | load access bus fault | **PC** | **ADR** |
| 1 | `0x00000000` | 0.0 | _TRAP_CODE_I_MISALIGNED_ | instruction address misaligned | **PC** | **ADR** |
| 2 | `0x00000001` | 0.1 | _TRAP_CODE_I_ACCESS_ | instruction access bus fault | **PC** | **ADR** |
| 3 | `0x00000002` | 0.2 | _TRAP_CODE_I_ILLEGAL_ | illegal instruction | **PC** | **INST** |
| 4 | `0x0000000B` | 0.11 | _TRAP_CODE_MENV_CALL_ | environment call from M-mode (`ecall`) | **PC** | **0** |
| 5 | `0x00000008` | 0.8 | _TRAP_CODE_UENV_CALL_ | environment call from U-mode (`ecall`) | **PC** | **0** |
| 6 | `0x00000003` | 0.3 | _TRAP_CODE_BREAKPOINT_ | software breakpoint (`ebreak`) | **PC** | **0** |
| 7 | `0x00000006` | 0.6 | _TRAP_CODE_S_MISALIGNED_ | store address misaligned | **PC** | **ADR** |
| 8 | `0x00000004` | 0.4 | _TRAP_CODE_L_MISALIGNED_ | load address misaligned | **PC** | **ADR** |
| 9 | `0x00000007` | 0.7 | _TRAP_CODE_S_ACCESS_ | store access bus fault | **PC** | **ADR** |
| 10 | `0x00000005` | 0.5 | _TRAP_CODE_L_ACCESS_ | load access bus fault | **PC** | **ADR** |
7+^| **Asynchronous Exceptions (Interrupts)** |
| 11 | `0x80000010` | 1.16 | _TRAP_CODE_FIRQ_0_ | fast interrupt request channel 0 | **IPC** | **0** |
| 12 | `0x80000011` | 1.17 | _TRAP_CODE_FIRQ_1_ | fast interrupt request channel 1 | **IPC** | **0** |
| 13 | `0x80000012` | 1.18 | _TRAP_CODE_FIRQ_2_ | fast interrupt request channel 2 | **IPC** | **0** |
| 14 | `0x80000013` | 1.19 | _TRAP_CODE_FIRQ_3_ | fast interrupt request channel 3 | **IPC** | **0** |
| 15 | `0x80000014` | 1.20 | _TRAP_CODE_FIRQ_4_ | fast interrupt request channel 4 | **IPC** | **0** |
| 16 | `0x80000015` | 1.21 | _TRAP_CODE_FIRQ_5_ | fast interrupt request channel 5 | **IPC** | **0** |
| 17 | `0x80000016` | 1.22 | _TRAP_CODE_FIRQ_6_ | fast interrupt request channel 6 | **IPC** | **0** |
| 18 | `0x80000017` | 1.23 | _TRAP_CODE_FIRQ_7_ | fast interrupt request channel 7 | **IPC** | **0** |
| 19 | `0x80000018` | 1.24 | _TRAP_CODE_FIRQ_8_ | fast interrupt request channel 8 | **IPC** | **0** |
| 20 | `0x80000019` | 1.25 | _TRAP_CODE_FIRQ_9_ | fast interrupt request channel 9 | **IPC** | **0** |
| 21 | `0x8000001a` | 1.26 | _TRAP_CODE_FIRQ_10_ | fast interrupt request channel 10 | **IPC** | **0** |
| 22 | `0x8000001b` | 1.27 | _TRAP_CODE_FIRQ_11_ | fast interrupt request channel 11 | **IPC** | **0** |
| 23 | `0x8000001c` | 1.28 | _TRAP_CODE_FIRQ_12_ | fast interrupt request channel 12 | **IPC** | **0** |
| 24 | `0x8000001d` | 1.29 | _TRAP_CODE_FIRQ_13_ | fast interrupt request channel 13 | **IPC** | **0** |
| 25 | `0x8000001e` | 1.30 | _TRAP_CODE_FIRQ_14_ | fast interrupt request channel 14 | **IPC** | **0** |
| 26 | `0x8000001f` | 1.31 | _TRAP_CODE_FIRQ_15_ | fast interrupt request channel 15 | **IPC** | **0** |
| 27 | `0x8000000B` | 1.11 | _TRAP_CODE_MEI_ | machine external interrupt (MEI) | **IPC** | **0** |
| 28 | `0x80000003` | 1.3 | _TRAP_CODE_MSI_ | machine software interrupt (MSI) | **IPC** | **0** |
| 29 | `0x80000007` | 1.7 | _TRAP_CODE_MTI_ | machine timer interrupt (MTI) | **IPC** | **0** |
| 11 | `0x80000010` | 1.16 | _TRAP_CODE_FIRQ_0_ | fast interrupt request channel 0 | **IPC** | **0** |
| 12 | `0x80000011` | 1.17 | _TRAP_CODE_FIRQ_1_ | fast interrupt request channel 1 | **IPC** | **0** |
| 13 | `0x80000012` | 1.18 | _TRAP_CODE_FIRQ_2_ | fast interrupt request channel 2 | **IPC** | **0** |
| 14 | `0x80000013` | 1.19 | _TRAP_CODE_FIRQ_3_ | fast interrupt request channel 3 | **IPC** | **0** |
| 15 | `0x80000014` | 1.20 | _TRAP_CODE_FIRQ_4_ | fast interrupt request channel 4 | **IPC** | **0** |
| 16 | `0x80000015` | 1.21 | _TRAP_CODE_FIRQ_5_ | fast interrupt request channel 5 | **IPC** | **0** |
| 17 | `0x80000016` | 1.22 | _TRAP_CODE_FIRQ_6_ | fast interrupt request channel 6 | **IPC** | **0** |
| 18 | `0x80000017` | 1.23 | _TRAP_CODE_FIRQ_7_ | fast interrupt request channel 7 | **IPC** | **0** |
| 19 | `0x80000018` | 1.24 | _TRAP_CODE_FIRQ_8_ | fast interrupt request channel 8 | **IPC** | **0** |
| 20 | `0x80000019` | 1.25 | _TRAP_CODE_FIRQ_9_ | fast interrupt request channel 9 | **IPC** | **0** |
| 21 | `0x8000001a` | 1.26 | _TRAP_CODE_FIRQ_10_ | fast interrupt request channel 10 | **IPC** | **0** |
| 22 | `0x8000001b` | 1.27 | _TRAP_CODE_FIRQ_11_ | fast interrupt request channel 11 | **IPC** | **0** |
| 23 | `0x8000001c` | 1.28 | _TRAP_CODE_FIRQ_12_ | fast interrupt request channel 12 | **IPC** | **0** |
| 24 | `0x8000001d` | 1.29 | _TRAP_CODE_FIRQ_13_ | fast interrupt request channel 13 | **IPC** | **0** |
| 25 | `0x8000001e` | 1.30 | _TRAP_CODE_FIRQ_14_ | fast interrupt request channel 14 | **IPC** | **0** |
| 26 | `0x8000001f` | 1.31 | _TRAP_CODE_FIRQ_15_ | fast interrupt request channel 15 | **IPC** | **0** |
| 27 | `0x8000000B` | 1.11 | _TRAP_CODE_MEI_ | machine external interrupt (MEI) | **IPC** | **0** |
| 28 | `0x80000003` | 1.3 | _TRAP_CODE_MSI_ | machine software interrupt (MSI) | **IPC** | **0** |
| 29 | `0x80000007` | 1.7 | _TRAP_CODE_MTI_ | machine timer interrupt (MTI) | **IPC** | **0** |
|======================= |
|
|
/cpu_csr.adoc
304,6 → 304,7
3+| The `mtvec` CSR is compatible to the RISC-V specifications. It stores the base address for ALL machine |
traps. Thus, it defines the main entry point for exception/interrupt handling regardless of the actual trap |
source. The lowest two bits of this register are always zero and cannot be modified (= address mode only). |
Hence, the trap handler's base address has to be aligned to a 4-byte boundary. |
|======================= |
|
.Machine trap-handler base address |
422,8 → 423,8
| 0x343 | **Machine bad address or instruction** | `mtval` |
3+| Reset value: _UNDEFINED_ |
3+| The `mtval` CSR is compatible to the RISC-V specifications. When a trap is triggered, the CSR shows either |
the faulting address (for misaligned/faulting load/stores/fetch) or the faulting instruction itself (for illegal |
instructions). For interrupts the CSR is set to zero. |
the faulting address (for misaligned/faulting load/store/fetch) or the faulting (decompressed) instruction word itself (for illegal |
instructions). For all other exceptions (including interrupts) the CSR is set to zero. |
|======================= |
|
.Machine bad address or instruction register |
432,15 → 433,19
|======================= |
| Trap cause | `mtval` content |
| misaligned instruction fetch address or instruction fetch access fault | address of faulting instruction fetch |
| breakpoint | program counter (= address) of faulting instruction itself |
| misaligned load address, load access fault, misaligned store address or store access fault | program counter (= address) of faulting instruction itself |
| illegal instruction | actual instruction word of faulting instruction |
| misaligned load address, load access fault, misaligned store address or store access fault | program counter (= address) of faulting instruction |
| illegal instruction | actual instruction word of faulting instruction (decoded 32-bit instruction word if caused by a compressed instruction) |
| anything else including interrupts | _0x00000000_ (always zero) |
|======================= |
|
[IMPORTAN] |
[IMPORTANT] |
The NEORV32 `mtval` CSR is read-only. However, a write access will _NOT_ raise an illegal instruction exception. |
|
[NOTE] |
In case an invalid compressed instruction raised an illegal instruction exception, `mtval` will show the |
according de-compressed instruction word. To get the "real" 16-bit instruction that caused the exception |
perform a memory load using the address stored in <<_mepc>>. |
|
:sectnums!: |
===== **`mip`** |
|
/overview.adoc
139,10 → 139,7
├lib - Processor core library |
│├include - Header files (*.h) |
│└source - Source files (*.c) |
├image_gen - Helper program to generate NEORV32 executables |
├isa-test |
│├riscv-arch-test - RISC-V spec. compatibility test framework (submodule) |
│└port-neorv32 - Port files for the official RISC-V architecture tests |
├image_gen - Helper program to generate NEORV32 executables^ |
├ocd_firmware - Source code for on-chip debugger's "park loop" |
├openocd - OpenOCD on-chip debugger configuration files |
└svd - Processor system view description file (CMSIS-SVD) |
236,7 → 233,7
[cols="<2,<8"] |
[grid="topbot"] |
|======================= |
| HW version: | `1.6.8.3` |
| HW version: | `1.6.9.8` |
| Top entity: | `rtl/core/neorv32_cpu.vhd` |
| FPGA: | Intel Cyclone IV E `EP4CE22F17C6` |
| Toolchain: | Quartus Prime Lite 21.1 |
247,18 → 244,18
[options="header",grid="rows"] |
|======================= |
| CPU ISA Configuration | LEs | FFs | MEM bits | DSPs | _f~max~_ |
| `rv32e` | 900 | 388 | 512 | 0 | 121 MHz |
| `rv32i` | 904 | 388 | 1024 | 0 | 121 MHz |
| `rv32i_Zicsr` | 1425 | 673 | 1024 | 0 | 118 MHz |
| `rv32i_Zicsr_Zicntr` | 1778 | 803 | 1024 | 0 | 118 MHz |
| `rv32im_Zicsr_Zicntr` | 2244 | 978 | 1024 | 0 | 118 MHz |
| `rv32ima_Zicsr_Zicntr` | 2267 | 982 | 1024 | 0 | 118 MHz |
| `rv32imac_Zicsr_Zicntr` | 2453 | 994 | 1024 | 0 | 118 MHz |
| `rv32imacb_Zicsr_Zicntr` | 3270 | 1249 | 1024 | 0 | 118 MHz |
| `rv32imacbu_Zicsr_Zicntr` | 3286 | 1254 | 1024 | 0 | 118 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei` | 3278 | 1254 | 1024 | 0 | 118 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei_Zfinx` | 4536 | 1906 | 1024 | 7 | 115 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei_Zfinx_DebugMode` | 5989 | 2416 | 1024 | 7 | 110 MHz |
| `rv32e` | 830 | 400 | 512 | 0 | 129 MHz |
| `rv32i` | 834 | 400 | 1024 | 0 | 129 MHz |
| `rv32i_Zicsr` | 1328 | 678 | 1024 | 0 | 128 MHz |
| `rv32i_Zicsr_Zicntr` | 1614 | 808 | 1024 | 0 | 128 MHz |
| `rv32im_Zicsr_Zicntr` | 2087 | 983 | 1024 | 0 | 128 MHz |
| `rv32ima_Zicsr_Zicntr` | 2129 | 987 | 1024 | 0 | 128 MHz |
| `rv32imac_Zicsr_Zicntr` | 2338 | 992 | 1024 | 0 | 128 MHz |
| `rv32imacb_Zicsr_Zicntr` | 3175 | 1247 | 1024 | 0 | 128 MHz |
| `rv32imacbu_Zicsr_Zicntr` | 3186 | 1254 | 1024 | 0 | 128 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei` | 3187 | 1254 | 1024 | 0 | 128 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei_Zfinx` | 4450 | 1906 | 1024 | 7 | 123 MHz |
| `rv32imacbu_Zicsr_Zicntr_Zifencei_Zfinx_DebugMode` | 4825 | 2018 | 1024 | 7 | 123 MHz |
|======================= |
|
.**RISC-V Compliance** |
/soc.adoc
1376,18 → 1376,20
memories, an external memory interface and a bus infrastructure to interconnect all units. Additionally, the |
system implements an internal reset generator and a global clock generator/divider. |
|
|
**Internal Reset Generator** |
|
[IMPORTANT] |
Most processor-internal modules - except for the CPU and the watchdog timer - do not have a dedicated |
reset signal. However, all devices can be reset by software by clearing the corresponding unit's control |
register. The automatically included application start-up code (`crt0.S`) will perform a software-reset of all |
modules to ensure a clean system reset state. |
|
The hardware reset signal of the processor can either be |
triggered via the external reset pin (`rstn_i`, low-active) or by the internal watchdog timer (if implemented). |
Before the external reset signal is applied to the system, it is extended to have a minimal duration of eight |
clock cycles. |
The hardware reset signal of the processor can either be triggered via the external reset pin (`rstn_i`, low-active), |
by the internal watchdog timer (if implemented) or by the on-chip debugger. The external reset signal `rstn_i` |
is extended to be active for at least 4 cycles when triggered. |
|
|
**Internal Clock Divider** |
|
An internal clock divider generates 8 clock signals derived from the processor's main clock input `clk_i`. |
1410,6 → 1412,7
| Resulting clock: | _f/2_ | _f/4_ | _f/8_ | _f/64_ | _f/128_ | _f/1024_| _f/2048_| _f/4096_ |
|======================= |
|
|
**Peripheral / IO Devices** |
|
The processor-internal peripheral/IO devices are located at the end of the 32-bit address space at base |
1449,6 → 1452,7
[TIP] |
A CMSIS-SVD-compatible **System View Description (SVD)** file including all peripherals is available in `sw/svd`. |
|
|
**Interrupts of Processor-Internal Modules** |
|
Most peripheral/IO devices provide some kind of interrupt (for example to signal available incoming data). These |
1455,6 → 1459,7
interrupts are entirely mapped to the CPU's <<_custom_fast_interrupt_request_lines>>. Note that all these |
interrupt lines are high-active and are permanently triggered until the IRQ-causing condition is resolved. |
|
|
**Nomenclature for the Peripheral / IO Devices Listing** |
|
Each peripheral device chapter features a register map showing accessible control and data registers of the |
/soc_trng.adoc
26,11 → 26,17
`dieharder` battery of random number tests. More detailed information about the neoTRNG, it's architecture and a |
detailed evaluation of the random number quality can be found it it's repository: https://github.com/stnolting/neoTRNG |
|
.Platform Independent Architecture |
[NOTE] |
The TRNG features a platform independent architecture without FPGA-specific primitives, macros or |
attributes so it can be synthesized for _any_ FPGA. |
|
.Inferring Latches |
[NOTE] |
The synthesis tool might emit a warning like _"inferring latches for ... neorv32_trng ..."_. This is no problem |
as this is what we actually want (the TRNG is based on latches). |
|
|
**Using the TRNG** |
|
The TRNG features a single register for status and data access. When the _TRNG_CTRL_EN_ control register (`CTRL`) |
39,6 → 45,7
(_TRNG_CTRL_DATA_MSB_ : _TRNG_CTRL_DATA_LSB_). These bits always keep the latest valid data obtained from the TRNG |
entropy source. The _TRNG_CTRL_VALID_ bit is automatically cleared when reading the control register. |
|
.TRNG Reset |
[NOTE] |
The TRNG core does not provide a dedicated reset. In order to ensure correct operations, the TRNG should be |
disabled (=reset) by clearing the _TRNG_CTRL_EN_ and waiting some milliseconds before re-enabling it. |
/software.adoc
402,7 → 402,7
.Newlib Test/Demo Program |
[TIP] |
A simple test and demo program, which uses some of newlib's core functions (like `malloc`/`free` and `read`/`write`) |
is available in `sw/example_newlib_demo` |
is available in `sw/example/demo_newlib` |
|
|
:sectnums: |
445,11 → 445,12
The `crt0.S` start-up performs the following operations: |
|
[start=1] |
. Disable interrupts globally by clearing <<_mstatus>>`.mie`. |
. Initialize all integer registers `x1 - x31` (or just `x1 - x15` when using the `E` CPU extension) to a defined value. |
. Initialize all CPU core CSRs and also install a default "dummy" trap handler for _all_ traps. This handler catches all traps |
** All interrupt sources are disabled and all pending interrupts are cleared. |
. Initialize the global pointer `gp` and the stack pointer `sp` according to the <<_ram_layout>> provided by the linker script. |
. Initialize all CPU core CSRs and also install a default "dummy" trap handler for _all_ traps. This handler catches all traps |
during the early boot phase. |
. All interrupt sources are disabled and all pending interrupts are cleared. |
. Clear all counter CSRs and stop auto-increment. |
. Clear IO area: Write zero to all memory-mapped registers within the IO region (`iodev` section). If certain devices have not |
been implemented, a bus access fault exception will occur. This exception is captured by the dummy trap handler. |