Loop Dependency Inter 
=====================

This Example demonstrates the HLS pragma ‘DEPENDENCE’.Using ‘DEPENDENCE’
pragma, user can provide additional dependency details to the compiler
by specifying if the dependency in consecutive loop iterations on buffer
is true/false, which allows the compiler to perform unrolling/pipelining
to get better performance.

**KEY CONCEPTS:** Inter Dependence

**KEYWORDS:** DEPENDENCE, inter, WAR

This example demonstrates how extra information about dependency can be
specified for variables in consecutive loop iterations using
``#pragma HLS DEPENDENCE``. It allows the ``V++`` to recognize
dependencies and optimize the loop executions.

For example here ``linebuf`` has ``false inter dependency`` which means
each iteration of loop is independent for ``linebuf`` access.

``#pragma HLS DEPENDENCE`` allows compiler to ignore dependency of
linebuf and generate a pipeline with lower II count. If user does not
provide this pragma, by default compiler assumes dependency exists on
linebuf between iterations. As a result, compiler schedules unoptimized
design with larger II factor which in turn leads to slow performance.

.. code:: cpp

   #pragma HLS ARRAY_PARTITION variable = linebuf dim = 1 complete
   VConvH:
       for (int col = 0; col < height; ++col) {
       VConvW:
           for (int row = 0; row < width; ++row) {
              #pragma HLS DEPENDENCE variable=linebuf inter false
              #pragma HLS PIPELINE
               int in_val = inStream.read();
               int out_val = 0;
           VConv:
               for (int i = 0; i < K; i++) {
                   int vwin_val = i < (K - 1) ? linebuf[i][row] : in_val;
                   out_val += vwin_val * vcoeff[i];

                   if (i > 0)
                       linebuf[i - 1][row] = vwin_val;
               }
               outStream << out_val;
           }
       }
   }

EXCLUDED PLATFORMS
------------------

Platforms containing following strings in their names are not supported
for this example :

::

   zc702
   zc706

DESIGN FILES
------------

Application code is located in the src directory. Accelerator binary
files will be compiled to the xclbin directory. The xclbin directory is
required by the Makefile and its contents will be filled during
compilation. A listing of all the files in this example is shown below

::

   src/host.cpp
   src/vconv.cpp
   src/vconv.h

COMMAND LINE ARGUMENTS
----------------------

Once the environment has been configured, the application can be
executed by

::

   ./host <vconv XCLBIN>