Description
Specifies restrictions to limit resource allocation in the implemented kernel. The ALLOCATION pragma or directive can limit the number of RTL instances and hardware resources used to implement specific functions, loops, or operations. The ALLOCATION pragma is specified inside the body of a function, a loop, or a region of code.
For example, if the C source has four instances of a function
foo_sub
, the ALLOCATION pragma can ensure that there is only one
instance of
foo_sub
in the final RTL. All four instances of
the C function are implemented using the same RTL block. This reduces resources used by the
function, but negatively impacts performance by sharing those resources.
Template functions can also be specified for ALLOCATION by specifying the function pointer instead of the function name, as shown in the examples below.
The operations in the C code, such as additions, multiplications, array reads, and writes, can also be limited by the ALLOCATION pragma.
Syntax
| Form | Syntax |
|---|---|
| Pragma |
#pragma HLS allocation <type>
instances=<list> limit=<value>
|
| Config File |
syn.directive.allocation=[OPTIONS]
<loc> <instances> limit=<int> type=[function\|operation]
|
| Tcl |
set_directive_allocation [OPTIONS]
<loc> <instances> -limit <int> -type
[function\|operation]
|
<type>
as operation or function must follow the
allocation
keyword.
#pragma HLS allocation <type> instances=<list>
limit=<value>
Options
-
<type> -
The type is specified as one of the following:
-
function -
Specifies that the allocation applies to the functions listed in
the
instances=list. The function can be any function in the original C or C++ code that has not been:-
Inlined by the
pragma HLS inline, or theset_directive_inlinecommand, or - Inlined automatically by the Vitis HLS tool.
-
Inlined by the
-
operation -
Specifies that the allocation applies to the operations listed
in the
instances=list.
-
-
instances=<list> -
Specifies the names of functions from the C code, or operators.
For a complete list of operations that can be limited using the
ALLOCATIONpragma, refer to the Op Binding command. -
limit=<value> - Optionally specifies the limit of instances to be used in the kernel.
Example 1
Given a design with multiple instances of function
foo
, this example limits the number of instances of
foo
in the RTL for the hardware kernel to two.
#pragma HLS allocation function instances=foo limit=2
Example 2
Limits the number of multiplier operations used in the implementation of
the function
my_func
to one. This limit does not apply to
any multipliers outside of
my_func
, or multipliers that
might reside in sub-functions of
my_func
.
my_func
.
void my_func(data_t angle) {
#pragma HLS allocation operation instances=mul limit=1
...
}
Example 3
The ALLOCATION pragma can also be used on template functions as shown below. The identification is generally based on the function name, but in the case of template functions it is based on the function pointer:
template <typename DT>
void foo(DT a, DT b){
}
// The following is valid
#pragma HLS ALLOCATION function instances=foo<DT>
...
// The following is not valid
#pragma HLS ALLOCATION function instances=foo