| .. _Development:GettingStarted: | |
| Getting Started with F4PGA Toolchain development | |
| ################################################ | |
| .. IMPORTANT:: | |
| This documentation explains the first steps in the development of the toolchain itself: generating definitions about | |
| the primitives and routing infrastructure of the architectures. | |
| If you are looking for the **user documentation**, i.e. how to generate bitstreams from HDL designs, please look at | |
| :doc:`f4pga:index` and :doc:`examples:index` instead. | |
| .. WARNING:: | |
| Generating Architecture Definition files is expected to take a long time to build, even on fast machines. | |
| To run the tests in this repository, please make sure these resources are available: | |
| * Memory: 5.5G | |
| * Disk space: 20G | |
| This section provides an introduction on how to get started with the development of the F4PGA toolchain. | |
| Each FPGA architecture has its own toolchain backend that will be called during build. | |
| The aim of this repository is to gather the knowledge from those backends and generate useful human and machine readable | |
| documentation to be used by tools such as yosys, vpr and/or vpr. | |
| See `Project X-Ray <https://prjxray.readthedocs.io/en/latest/>`_ | |
| and `Project Trellis <https://prjtrellis.readthedocs.io/en/latest/>`_ for more information. | |
| In order to generate architecture definitions, any intermediate file format or bitstreams, you can use one of the | |
| toolchain tests in this repository. | |
| The following steps describe the whole process: | |
| Prepare the environment | |
| ======================= | |
| Clone the repository: | |
| .. sourcecode:: bash | |
| git clone https://github.com/f4pga/f4pga-arch-defs.git | |
| Bootstrap an isolated Conda environment with all the necessary dependencies: | |
| .. sourcecode:: bash | |
| cd f4pga-arch-defs | |
| make env | |
| .. HINT:: | |
| 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 the tests | |
| =============== | |
| While different architectures provide different build targets, there are some targets that should exist for all | |
| architectures. | |
| 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 the desired 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/xilinx/xc7/tests/counter | |
| make counter_arty_bit | |
| If you use ``Ninja``, the target is accessible from the root of the build directory: | |
| .. sourcecode:: bash | |
| cd build | |
| ninja counter_arty_bit | |
| .. NOTE:: | |
| Test design target 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``. | |
| There are targets to run multiple tests at once: | |
| .. sourcecode:: bash | |
| # Build all demo bitstreams, targetting all architectures | |
| make all_demos | |
| # Build all Xilinx 7-series demo bitstreams | |
| make all_xc7 | |
| # Build all Lattice ICE40 demo bitstreams | |
| make all_ice40 | |
| # Build all QuickLogic demo bitstreams | |
| make all_quicklogic | |
| 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 the bitstreams | |
| =================== | |
| The last step to test the whole flow is to load the bitstream to your platform. | |
| The final output file can be found in the appropriate test directory, i.e: | |
| ``build/xilinx/xc7/tests/counter/counter_arty/artix7-xc7a50t-arty-swbut-roi-virt-xc7a50t-arty-swbut-test/top.bit`` | |
| Programming tools used in F4PGA are either provided as a conda package during the environment setup, or are automatically | |
| downloaded and referenced by ``CMake``. | |
| 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 | |
| Find further details about loading bitstreams in :ref:`f4pga:GettingStarted:LoadingBitstreams`. |