Dataflow Using Array of HLS Stream

This is simple example of Multiple Stages Vector Addition to demonstrate Array of Stream usage in HLS C Kernel Code.

KEY CONCEPTS: Array of Stream

KEYWORDS: dataflow, hls::stream

This example demontrates the use of an array of HLS streams in kernels.

Kernel performs a number of vector additions. Initial vector is taken from the global memory and is written into a stream. Operator << is overloaded to perform a blocking write to a stream from a variable.

mem_rd:
   for (int i = 0; i < size; i++) {
      #pragma HLS PIPELINE II=1
      #pragma HLS LOOP_TRIPCOUNT min=c_size max=c_size
       inStream << input[i];
   }

Multiple additions are performed using the adder function which take the input from a stream and provide the output to another stream.

compute_loop:
    for (int i = 0; i < STAGES; i++) {
       #pragma HLS UNROLL
        adder(streamArray[i], streamArray[i + 1], incr, size);
    }

Finally, result is written back from stream to global memory buffer.

static void write_result(int *output, hls::stream<int> &outStream, int size) {
mem_wr:
    for (int i = 0; i < size; i++) {
       #pragma HLS PIPELINE II=1
       #pragma HLS LOOP_TRIPCOUNT min=c_size max=c_size
        output[i] = outStream.read();
    }
}

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/N_stage_adders.cpp
src/host.cpp

COMMAND LINE ARGUMENTS

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

./host <N_stage_Adders XCLBIN>