.. _litex-vexriscv:

LiteX VexRiscv
##############

LiteX VexRiscv is an example of a system on a chip (SoC) that consists of
a `VexRiscv processor <https://github.com/SpinalHDL/VexRiscv>`_
and additional peripherals. This setup can be generated using
`Zephyr on LiteX VexRiscv (reference platform)
<https://github.com/litex-hub/zephyr-on-litex-vexriscv>`_
or `LiteX SoC Builder <https://github.com/enjoy-digital/litex>`_
and can be used on various FPGA chips.
The bitstream (FPGA configuration file) can be obtained using both
vendor-specific and open-source tools, including the
`F4PGA toolchain <https://f4pga.org/>`_.

The ``litex_vexriscv`` board configuration in Zephyr is meant for the
LiteX VexRiscv SoC implementation generated for the
`Digilent Arty A7-35T or A7-100T Development Boards
<https://store.digilentinc.com/arty-a7-artix-7-fpga-development-board-for-makers-and-hobbyists>`_
or `SDI-MIPI Video Converter <https://github.com/antmicro/sdi-mipi-video-converter>`_.

.. image:: img/litex_vexriscv.jpg
   :align: center
   :alt: LiteX VexRiscv on Digilent Arty 35T Board

LiteX is based on
`Migen <https://m-labs.hk/gateware/migen/>`_/`MiSoC SoC builder <https://github.com/m-labs/misoc>`_
and provides ready-made system components such as buses, streams, interconnects,
common cores, and CPU wrappers to create SoCs easily. The tool contains
mechanisms for integrating, simulating, and building various designs
that target multiple chips of different vendors.
More information about the LiteX project can be found on
`LiteX's website <https://github.com/enjoy-digital/litex>`_.

VexRiscv is a 32-bit implementation of the RISC-V CPU architecture
written in the `SpinalHDL <https://spinalhdl.github.io/SpinalDoc-RTD/>`_.
The processor supports M, C, and A RISC-V instruction
set extensions, with numerous optimizations that include multistage
pipelines and data caching. The project provides many optional extensions
that can be used to customize the design (JTAG, MMU, MUL/DIV extensions).
The implementation is optimized for FPGA chips.
More information about the project can be found on
`VexRiscv's website <https://github.com/SpinalHDL/VexRiscv>`_.

To run the ZephyrOS on the VexRiscv CPU, it is necessary to prepare the
bitstream for the FPGA on a Digilent Arty A7-35 Board or SDI-MIPI Video Converter. This can be achieved
using the
`Zephyr on LiteX VexRiscv <https://github.com/litex-hub/zephyr-on-litex-vexriscv>`_
reference platform. You can also use the official LiteX SoC Builder.

Bitstream generation
********************

Zephyr on LiteX VexRiscv
========================
Using this platform ensures that all registers addresses are in the proper place.
All drivers were tested using this platform.
In order to generate the bitstream,
proceed with the following instruction:

1. Clone the repository and update all submodules:

   .. code-block:: bash

      git clone https://github.com/litex-hub/zephyr-on-litex-vexriscv.git
      cd zephyr-on-litex-vexriscv
      git submodule update --init --recursive

   Generating the bitstream for the Digilent Arty A7-35 Board requires F4PGA toolchain installation. It can be done by following instructions in
   `this tutorial <https://f4pga-examples.readthedocs.io/en/latest/getting.html>`_.

   In order to generate the bitstream for the SDI-MIPI Video Converter, install
   oxide (yosys+nextpnr) toolchain by following
   `these instructions <https://github.com/gatecat/prjoxide#getting-started---complete-flow>`_.

#. Next, get all required packages and run the install script:

   .. code-block:: bash

      apt-get install build-essential bzip2 python3 python3-dev python3-pip
      ./install.sh

#. Add LiteX to path:

   .. code-block:: bash

      source ./init

#. Set up the F4PGA environment (for the Digilent Arty A7-35 Board):

   .. code-block:: bash

      export F4PGA_INSTALL_DIR=~/opt/f4pga
      export FPGA_FAM="xc7"
      export PATH="$F4PGA_INSTALL_DIR/$FPGA_FAM/install/bin:$PATH";
      source "$F4PGA_INSTALL_DIR/$FPGA_FAM/conda/etc/profile.d/conda.sh"
      conda activate $FPGA_FAM

#. Generate the bitstream for the Arty 35T:

   .. code-block:: bash

      ./make.py --board=arty --variant=a7-35 --build --toolchain=symbiflow

#. Generate the bitstream for the Arty 100T:

   .. code-block:: bash

      ./make.py --board=arty --variant=a7-100 --build --toolchain=symbiflow

#. Generate the bitstream for the SDI-MIPI Video Converter:

   .. code-block:: bash

      ./make.py --board=sdi_mipi_bridge --build --toolchain=oxide

Official LiteX SoC builder
==========================
You can also generate the bitstream using the `official LiteX repository <https://github.com/enjoy-digital/litex>`_.
In that case you must also generate a dts overlay.

1. Install Migen/LiteX and the LiteX's cores:

   .. code-block:: bash

      wget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py
      chmod +x litex_setup.py
      ./litex_setup.py --init --install --user (--user to install to user directory) --config=(minimal, standard, full)

#. Install the RISC-V toolchain:

   .. code-block:: bash

      pip3 install meson ninja
      ./litex_setup.py --gcc=riscv

#. Build the target:

   .. code-block:: bash

      ./litex-boards/litex_boards/targets/digilent_arty.py --build --timer-uptime --csr-json csr.json

#. Generate the dts and config overlay:

   .. code-block:: bash

      ./litex/litex/tools/litex_json2dts_zephyr.py --dts overlay.dts --config overlay.config csr.json

Programming and booting
*************************

Building
========

Applications for the ``litex_vexriscv`` board configuration can be built as usual
(see :ref:`build_an_application`).
In order to build the application for ``litex_vexriscv``, set the ``BOARD`` variable
to ``litex_vexriscv``.

If you were generating bitstream with the official LiteX SoC builder you need to pass an additional argument:

.. code-block:: bash

   west build -b litex_vexriscv path/to/app -DDTC_OVERLAY_FILE=path/to/overlay.dts

Booting
=======

To upload the bitstream to Digilent Arty A7-35 you can use `xc3sprog <https://github.com/matrix-io/xc3sprog>`_ or
`openFPGALoader <https://github.com/trabucayre/openFPGALoader>`_:

.. code-block:: bash

   xc3sprog -c nexys4 digilent_arty.bit

.. code-block:: bash

   openFPGALoader -b arty_a7_100t digilent_arty.bit

Use `ecpprog <https://github.com/gregdavill/ecpprog>`_ to upload the bitstream to SDI-MIPI Video Converter:

.. code-block:: bash

   ecpprog -S antmicro_sdi_mipi_video_converter.bit

You can boot from a serial port using litex_term (replace `ttyUSBX` with your device) , e.g.:

.. code-block:: bash

   litex_term /dev/ttyUSBX --speed 115200 --kernel zephyr.bin
