| .. zephyr:board:: neorv32 |
| |
| Overview |
| ******** |
| |
| The NEORV32 is an open-source RISC-V compatible processor system intended as a |
| ready-to-go auxiliary processor within larger SoC designs or as a stand-alone |
| customizable microcontroller. |
| |
| For more information about the NEORV32, see the following websites: |
| |
| - `The NEORV32 RISC-V Processor GitHub`_ |
| - `The NEORV32 RISC-V Processor Datasheet`_ |
| - `The NEORV32 RISC-V Processor User Guide`_ |
| |
| The currently supported version is 1.8.6. |
| |
| Supported Features |
| ================== |
| |
| The ``neorv32`` board configuration can be used a generic definition for NEORV32 |
| based boards. Customisation to fit custom NEORV32 implementations can be done |
| using :ref:`devicetree overlays <use-dt-overlays>`. |
| |
| Zephyr currently supports the following hardware features of the NEORV32 |
| Processor (SoC): |
| |
| +-----------+------------+-------------------------------------+ |
| | Interface | Controller | Driver/Component | |
| +===========+============+=====================================+ |
| | INTC | on-chip | interrupt controller | |
| +-----------+------------+-------------------------------------+ |
| | MTIME | on-chip | system timer | |
| +-----------+------------+-------------------------------------+ |
| | GPIO | on-chip | gpio, non-interrupt | |
| +-----------+------------+-------------------------------------+ |
| | UART | on-chip | serial port-polling; | |
| | | | serial port-interrupt | |
| +-----------+------------+-------------------------------------+ |
| | TRNG | on-chip | entropy | |
| +-----------+------------+-------------------------------------+ |
| |
| The default board configuration for the NEORV32 Processor (SoC) can be found in |
| the defconfig file: :file:`boards/riscv/neorv32/neorv32_defconfig`. |
| |
| System Clock |
| ============ |
| |
| The default board configuration assumes a system clock of 100 MHz. The clock |
| frequency can be overridden by changing the ``clock-frequency`` property of the |
| ``cpu0`` devicetree node. |
| |
| CPU |
| === |
| |
| The default board configuration assumes the NEORV32 CPU implementation has the |
| following RISC-V ISA extensions enabled: |
| |
| - C (Compresses Instructions) |
| - M (Integer Multiplication and Division) |
| - Zicsr (Control and Status Register (CSR) Instructions) |
| |
| Internal Instruction Memory |
| =========================== |
| |
| The default board configuration assumes the NEORV32 SoC implementation has a 64k |
| byte internal instruction memory (IMEM) for code execution. The size of the |
| instruction memory can be overridden by changing the ``reg`` property of the |
| ``imem`` devicetree node. |
| |
| Internal Data Memory |
| ==================== |
| |
| The default board configuration assumes the NEORV32 SoC implementation has a 32k |
| byte internal data memory (DMEM). The size of the data memory can be overridden |
| by changing the ``reg`` property of the ``dmem`` devicetree node. |
| |
| Serial Port |
| =========== |
| |
| The default configuration assumes the NEORV32 SoC implements UART0 for use as |
| system console. |
| |
| .. note:: |
| |
| The default configuration uses a baud rate of 19200 to match that of the |
| standard NEORV32 bootloader. The baudrate can be changed by modifying the |
| ``current-speed`` property of the ``uart0`` devicetree node. |
| |
| True Random-Number Generator |
| ============================ |
| |
| The True Random-Number Generator (TRNG) of the NEORV32 is supported, but |
| disabled by default. For NEORV32 SoC implementations supporting the TRNG, |
| support can be enabled by setting the ``status`` property of the ``trng`` |
| devicetree node to ``okay``. |
| |
| Programming and Debugging |
| ************************* |
| |
| First, configure the FPGA with the NEORV32 bitstream as described in the NEORV32 |
| user guide. |
| |
| Next, build and flash applications as usual (see :ref:`build_an_application` and |
| :ref:`application_run` for more details). |
| |
| Configuring a Console |
| ===================== |
| |
| Use the following settings with your serial terminal of choice (minicom, putty, |
| etc.): |
| |
| - Speed: 19200 |
| - Data: 8 bits |
| - Parity: None |
| - Stop bits: 1 |
| |
| Flashing via JTAG |
| ================= |
| |
| Here is an example for building and flashing the :zephyr:code-sample:`hello_world` application |
| for the NEORV32 via JTAG. Flashing via JTAG requires a NEORV32 SoC |
| implementation with the On-Chip Debugger (OCD) and bootloader enabled. |
| |
| .. note:: |
| |
| If the bootloader is not enabled, the internal instruction memory (IMEM) is |
| configured as ROM which cannot be modified via JTAG. |
| |
| .. zephyr-app-commands:: |
| :zephyr-app: samples/hello_world |
| :board: neorv32 |
| :goals: flash |
| |
| The default board configuration uses an :ref:`openocd-debug-host-tools` |
| configuration similar to the example provided by the NEORV32 project. Other |
| JTAGs can be used by providing further arguments when building. Here is an |
| example for using the Flyswatter JTAG: |
| |
| .. zephyr-app-commands:: |
| :zephyr-app: samples/hello_world |
| :board: neorv32 |
| :goals: flash |
| :gen-args: -DBOARD_RUNNER_ARGS_openocd="--config;interface/ftdi/flyswatter.cfg;--config;neorv32.cfg;--cmd-pre-init;'adapter speed 2000'" |
| |
| After flashing, you should see message similar to the following in the terminal: |
| |
| .. code-block:: console |
| |
| *** Booting Zephyr OS build zephyr-vn.n.nn *** |
| Hello World! neorv32 |
| |
| Note, however, that the application was not persisted in flash memory by the |
| above steps. It was merely written to internal block RAM in the FPGA. It will |
| revert to the application stored in the block RAM within the FPGA bitstream |
| the next time the FPGA is configured. |
| |
| The steps to persist the application within the FPGA bitstream are covered by |
| the NEORV32 user guide. If the :kconfig:option:`CONFIG_BUILD_OUTPUT_BIN` is enabled and |
| the NEORV32 ``image_gen`` binary is available, the build system will |
| automatically generate a :file:`zephyr.vhd` file suitable for initialising the |
| internal instruction memory of the NEORV32. |
| |
| In order for the build system to automatically detect the ``image_gen`` binary |
| it needs to be in the :envvar:`PATH` environment variable. If not, the path |
| can be passed at build time: |
| |
| .. zephyr-app-commands:: |
| :zephyr-app: samples/hello_world |
| :board: neorv32 |
| :goals: build |
| :gen-args: -DCMAKE_PROGRAM_PATH=<path/to/neorv32/sw/image_gen/> |
| |
| Uploading via UART |
| ================== |
| |
| If the :kconfig:option:`CONFIG_BUILD_OUTPUT_BIN` is enabled and the NEORV32 |
| ``image_gen`` binary is available, the build system will automatically generate |
| a :file:`zephyr_exe.bin` file suitable for uploading to the NEORV32 via the |
| built-in bootloader as described in the NEORV32 user guide. |
| |
| Debugging via JTAG |
| ================== |
| |
| Here is an example for the :zephyr:code-sample:`hello_world` application. |
| |
| .. zephyr-app-commands:: |
| :zephyr-app: samples/hello_world |
| :board: neorv32 |
| :goals: debug |
| |
| Step through the application in your debugger, and you should see a message |
| similar to the following in the terminal: |
| |
| .. code-block:: console |
| |
| *** Booting Zephyr OS build zephyr-vn.n.nn *** |
| Hello World! neorv32 |
| |
| .. _The NEORV32 RISC-V Processor GitHub: |
| https://github.com/stnolting/neorv32 |
| |
| .. _The NEORV32 RISC-V Processor Datasheet: |
| https://stnolting.github.io/neorv32/ |
| |
| .. _The NEORV32 RISC-V Processor User Guide: |
| https://stnolting.github.io/neorv32/ug/ |