.. _run_fpga_task: OpenFPGA Task --------------- Tasks provide a framework for running the :ref:`run_fpga_flow` on multiple benchmarks, architectures, and set of OpenFPGA parameters. The structure of the framework is very similar to `VTR-Tasks `_ implementation with additional functionality and minor file extension changes. Task Directory ~~~~~~~~~~~~~~ The tasks are stored in a ``TASK_DIRECTORY``, which by default points to ``${OPENFPGA_PATH}/openfpga_flow/tasks``. Every directory or sub-directory in task directory consisting of ``../config/task.conf`` file can be referred to as a task. To create as task name called ``basic_flow`` following directory has to exist:: ${TASK_DIRECTORY}/basic_flow/conf/task.conf Similarly ``regression/regression_quick`` expect following structure:: ${TASK_DIRECTORY}/regression/regression_quick/conf/task.conf Running OpenFPGA Task: ~~~~~~~~~~~~~~~~~~~~~~ At a minimum ``open_fpga_flow.py`` requires following command-line arguments:: open_fpga_flow.py ... [] where: * ```` is the name of the task to run * ```` Other command line arguments described below Command-line Options ~~~~~~~~~~~~~~~~~~~~ .. option:: --maxthreads This option defines the number of threads to run while executing task. Each combination of architecture, benchmark and set of OpenFPGA Flow options runs in a individual thread. .. option:: --skip_thread_logs Passsing this option skips printing logs from each OpenFPGA Flow script run. .. option:: --exit_on_fail Passsing this option exits the OpenFPGA task script with returncode 1, if any threads fail to execute successfully. It is mainly used to while performing regression test. .. option:: --test_run This option allows to debug OpenFPGA Task script by skiping actual execution of OpenFPGA flow . Passing this option prints the list of commnad generated to execute using OpenFPGA flow. .. option:: --debug To enable detailed log printing. Creating a new OpenFPGA Task ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Create the folder ``${TASK_DIRECTORY}/`` - Create a file ``${TASK_DIRECTORY}//config/task.conf`` in it - Configure the task as explained in :ref:`Configuring a new OpenFPGA Task` Configuring a new OpenFPGA Task ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The task configuration file ``task.conf`` consists of ``GENERAL``, ``ARCHITECTURES``, ``BENCHMARKS``, ``SYNTHESIS_PARAM`` and ``SCRIPT_PARAM_`` sections. Declaring all the above sections are mandatory. .. note:: The configuration file supports all the OpenFPGA Variables refer :ref:`openfpga-variables` section to know more. Variable in the configuration file is declared as ``${PATH:}`` General Section ^^^^^^^^^^^^^^^ .. option:: fpga_flow== This option defines which OpenFPGA flow to run. By default ``yosys_vpr`` is executed. .. option:: power_analysis= Specifies whether to perform power analysis or not. .. option:: power_tech_file= Declares which tech XML file to use while performing Power Analysis. .. option:: spice_output= Setting up this variable generates Spice Netlist at the end of the flow. Equivalent of passing ``--vpr_fpga_spice`` command to :ref:`run_fpga_flow` .. option:: verilog_output= Setting up this variable generates Verilog Netlist at the end of the flow. Equivalent of passing ``--vpr_fpga_spice`` command to :ref:`run_fpga_flow` .. option:: timeout_each_job= Specifies the timeout for each :ref:`run_fpga_flow` execution. Default is set to ``20 min. `` Architectures Sections ^^^^^^^^^^^^^^^^^^^^^^ User can define the list of architecture files in this section. .. option:: arch= The ``arch_label`` variable can be any number of string without white-spaces. ``xml_architecture_file_path`` is path to the actual XML architecture file .. note:: In the final OpenFPGA Task result, the architecture will be referred by its ``arch_label``. Benchmarks Sections ^^^^^^^^^^^^^^^^^^^ User can define the list of benchmarks files in this section. .. option:: bench= The ``bench_label`` variable can be any number of string without white-spaces. ``xml_architecture_file_path`` is path to the actual XML architecture file For Example following code shows how to define a benchmarks, with a single file, multiple files and files added from a specific directory. .. code-block:: text [BENCHMARKS] # To declare single benchmark file bench_design1=${BENCH_PATH}/design/top.v # To declare multiple benchmark file bench_design2=${BENCH_PATH}/design/top.v,${BENCH_PATH}/design/sub_module.v # To add all files in specific directory to the benchmark bench_design3=${BENCH_PATH}/design/top.v,${BENCH_PATH}/design/lib/*.v .. note:: ``bench_label`` is referred again in ``Synthesis_Param`` section to provide additional information about benchmark Synthesis Parameter Sections ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ User can define extra parameters for each benchmark in the ``BENCHMARKS`` sections. .. option:: bench_top= This option defines the Top Level module name for ``bench_label`` benchmark. By default, the top-level module name is considered as a ``top``. .. option:: bench_yosys_tmpl= [TODO] .. option:: bench_chan_width= In case of running fixed channel width routing for each benchmark, this option defines the channel width to be used for ``bench_label`` benchmark .. option:: bench_act= In case of running ``blif_vpr_flow`` this option provides the activity files to be used to generate testbench for ``bench_label`` benchmark .. option:: bench_verilog= In case of running ``blif_vpr_flow`` with verification this option provides the source Verilog design for ``bench_label`` benchmark to be used while verification. Script Parameter Sections ^^^^^^^^^^^^^^^^^^^^^^^^^ The script parameter section lists set of commnad line pararmeters to be passed to :ref:`run_fpga_flow` script. The section name is defines as ``SCRIPT_PARAM_`` where `parameter_set_label` can be any word without white spaces. The section is referred with ``parameter_set_label`` in the final result file. For example following code Specifies the two sets (``Fixed_Routing_30`` and ``Fixed_Routing_50``) of :ref:`run_fpga_flow` arguments. .. code-block:: text [SCRIPT_PARAM_Fixed_Routing_30] # Execute fixed routing with channel with 30 fix_route_chan_width=30 [SCRIPT_PARAM_Fixed_Routing_50] # Execute fixed routing with channel with 50 fix_route_chan_width=50 Example Task Configuration File ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text [GENERAL] spice_output=false verilog_output=false power_analysis = true power_tech_file = ${PATH:TECH_PATH}/winbond90nm/winbond90nm_power_properties.xml timeout_each_job = 20*60 [ARCHITECTURES] arch0=${PATH:ARCH_PATH}/winbond90/k6_N10_rram_memory_bank_SC_winbond90.xml [BENCHMARKS] bench0=${PATH:BENCH_PATH}/MCNC_Verilog/s298/s298.v bench1=${PATH:BENCH_PATH}/MCNC_Verilog/elliptic/elliptic.v [SYNTHESIS_PARAM] bench0_top = s298 bench1_top = elliptic [SCRIPT_PARAM_Slack_30] min_route_chan_width=1.3 [SCRIPT_PARAM_Slack_80] min_route_chan_width=1.8