Architecture exploration is generally the first stage of any architecture design, and there are several ways to explore FPGA architectures.
This tutorial will explain how to explore FPGA architecture using application benchmarking.
This tutorial will detail how to evaluate the performance of different architectures for a given set of applications to understand which one is the most suitable.
..note:: We are not exploring the architecture of the application/design for FPGA implementation, but the architecture of the FPGA itself.
Application Benchmarks
^^^^^^^^^^^^^^^^^^^^^^
The architecture exploration process starts with a set of applications that expects FPGA architecture customization.
In the case of generic FPGA design, this benchmark suit may consist of applications from various domains.
In this tutorial, we selected the following few designs from the `VTR benchmarks`.
#.**ch_intrinsics** : Memory Init
#.**diffeq1** : Arithematic Unit
#.**diffeq2** : Arithematic Unit
#.**sha** : Cryptography
You will find these benchamrks in ``openfpga_flow/benchmarks/vtr_benchmark/`` directory.
Candidate Architectures
^^^^^^^^^^^^^^^^^^^^^^^
The base candidate architectures are selected for evaluating the performance of the above applications and later iteratively analyzed and modified to improve overall performance. These base architectures are (in the case of OpenFPGA) modeled in an architecture XML file. The XML-based description enables the modeling of hundreds of different architectures in a human-readable format. In this tutorial, we will modify the `Flexible Logic Block` (FLE) of the FPGA to understand its impact on the application performance.
The arch0 uses ten 6-input LUTs in each CLB, whereas the arch1 replaces the a fixed LUT-6 with fracturable LUT which can be operated in 1x LUT6 or 2x LUT5 mode.
#.**arch0:** k6_N10_tileable.xml
#.**arch1:** k6_frac_N10_tileable.xml
Create OpenFPGA Task
^^^^^^^^^^^^^^^^^^^^
OpenFPGA works on the task-based structure, where you create a directory with a name of your choice, which consists of the file ``config/task.conf``.
This file contains all the configuration variables (such as architecture, benchmarks, synthesis parameters, flow type etc.).
A ``task`` is executed using the ``run-task`` command
Lets create the OpenFPGA task from the template with above settings. Following code with create a directory/task named ``lab1`` from ``frac-lut-arch-explore`` template.
..code-block:: bash
# create-task <new_task_dir_name> <template_name>
create-task lab1 frac-lut-arch-explore
tree lab1 # To check content of the copied task
# lab1/
# ├── config
# │ └── task.conf
# ├── k6_frac_N10_tileable.xml
# ├── k6_N10_tileable.xml
# └── vtr_benchmark_template_script.openfpga
task.conf
~~~~~~~~~
``OpenFPGA_SHELL`` section defines common template script used in this flow.