|  | .. _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`. |