blob: bdf18eac23a44cff77792ad110d36c7daa1b5f20 [file] [log] [blame] [edit]
Getting Started with F4PGA Toolchain development
################################################
.. warning::
This documentation explains the first steps in the development of the toolchain itself.
If you are looking for the **user documentation**, please look at :doc:`examples:index` instead.
This section provides an introduction on how to get started with the development of the F4PGA toolchain.
In order to generate a bitstream (or any intermediate file format), you can use one of the toolchain tests.
The following steps describe the whole process:
Clone repository
================
.. sourcecode:: bash
git clone https://github.com/chipsalliance/f4pga-arch-defs.git
Prepare environment
===================
Download all the necessary packages, tools and databases into an isolated conda environment:
.. sourcecode:: bash
cd f4pga-arch-defs
make env
This also checks out all the submodules and generates the build system (``Make`` or ``Ninja``) from the CMake configuration.
If you want to use the ``Ninja`` build tool add this line before calling ``make env``:
.. sourcecode:: bash
export CMAKE_FLAGS="-GNinja"
Build example
=============
While different architectures provide different build targets, there are some targets that should exist for all architectures.
Each architecture has its own toolchain backend that will be called during build.
(See `Project X-Ray <https://prjxray.readthedocs.io/en/latest/>`_
and `Project Trellis <https://prjtrellis.readthedocs.io/en/latest/>`_ for more information)
For development purposes a set of test designs are included for each supported architecture.
In order to perform a build of a test design with the ``Make`` build system enter the appropriate test build directory
specific to your target architecture and invoke desired make target.
Assuming that you would like to generate the bitstream ``.bit`` file with the counter example for the Arty board, which
uses Xilinx Artix-7 FPGA, you will execute the following:
.. sourcecode:: bash
cd build/xc/xc7/tests/counter
make counter_arty_bit
If you use ``Ninja`` then the target is accessible from root build directory:
.. sourcecode:: bash
cd build
ninja counter_arty_bit
.. note::
Test design targets names are based on the following naming convention: ``<design>_<platform>_<target_step>``, where ``<target_step>`` is the actual step to be done, e.g.: ``bit``, ``place``, ``route``, ``prog``.
.. warning::
Generating architecture files is expected to take a long time to build, even on fast machines.
To build all demo bitstreams there are 3 useful targets:
.. sourcecode:: bash
# Build all demo bitstreams, targetting all architectures
make all_demos
# Build all 7-series demo bitstreams
make all_xc7
# Build all ice40 demo bitstreams
make all_ice40
Specific bitstreams can be built by specifying their target name, followed by a suffix specifying the desired output.
For example, the LUT-RAM test for the RAM64X1D primative is called `dram_test_64x1d`.
Example targets are:
.. sourcecode:: bash
# Just run synthesis on the input Verilog
make dram_test_64x1d_eblif
# Complete synthesis and place and route the circuit
make dram_test_64x1d_route
# Create the output bitstream (including synthesis and place and route)
make dram_test_64x1d_bin
# Run bitstream back into Vivado for timing checks, etc.
make dram_test_64x1d_vivado
Load bitstream
==============
The last step is to load the bitstream to your platform.
The final output file can be found in the appropriate test directory, i.e:
``build/xc/xc7/tests/counter/counter_arty/artix7-xc7a50t-arty-swbut-roi-virt-xc7a50t-arty-swbut-test/top.bit``
For every board the loading process may be different and different tools will be required.
``OpenOCD`` is the most widely used tool for loading bitstream in the F4PGA Toolchain.
It is provided as a conda package during the environment setup and ``CMake`` keeps track of its executable.
Other programming tools used in F4PGA that are automatically downloaded and referenced by ``CMake`` are ``tinyfpgab``
and ``tinyprog``.
For convenience the ``prog`` targets are provided for loading the bitstream, e.g.:
.. sourcecode:: bash
make counter_arty_prog
or for ``Ninja``:
.. sourcecode:: bash
ninja counter_arty_prog
.. note::
Loading the bitstream into an FPGA can be done outside of the F4PGA.
There are multiple tools for loading bitstreams into FPGA development boards.
Typically, each tool supports a specific target family or the lines of products of a vendor.
Some of the most known are listed in :ref:`hdl/constraints: Programming and debugging <constraints:ProgDebug>`.
OpenFPGALoader
--------------
OpenFPGALoader is an universal utility for programming the FPGA devices that is a great alternative to OpenOCD.
It supports many different boards with FPGAs based on the architectures including xc7, ECP5, iCE40 and many more.
It can utilize a variety of the programming adapters based on JTAG, DAP interface, ORBTrace, DFU and FTDI chips.
Installing OpenFPGALoader
*************************
OpenFPGALoader is available in several packaging solutions.
It can be installed with distribution specific package managers on Arch Linux and Fedora.
There are also prebuilt packages available in `conda <https://anaconda.org/litex-hub/openfpgaloader>`__
or packages in tool :gh:`repository <trabucayre/openFPGALoader/releases>`.
OpenFPGALoader can also be built from sources.
For installation guidelines using both prebuilt packages and building from source please refer to instructions in
:gh:`readme <trabucayre/openFPGALoader/blob/master/INSTALL.md>`.
Usage
*****
For programming the FPGA use one of these commands:
.. sourcecode:: bash
openFPGALoader -b <board> <bitstream> # (e.g. arty)
openFPGALoader -c <cable> <bitstream> # (e.g. digilent)
openFPGALoader -d <device> <bitstream> # (e.g. /dev/ttyUSB0)
You can also list the supported boards, cables and fpgas:
.. sourcecode:: bash
openFPGALoader --list-boards
openFPGALoader --list-cables
openFPGALoader --list-fpga
If you encounter any issues, please refer to the :gh:`OpenFPGALoader README <trabucayre/openFPGALoader#readme>` as it
provides more useful information on the usage of the tool.