描述
指定相应限制,以便对已实现的内核中的资源分配加以限制。ALLOCATION 编译指示或指令可限制用于实现特定函数、循环或运算的 RTL 实例和硬件资源的数量。ALLOCATION 编译指示是在代码的函数、循环或区域主体内部指定的。
例如,如果 C 语言代码包含函数 foo_sub
的 4 个实例,那么 ALLOCATION 编译指示可确保最终 RTL 中仅有 foo_sub
的 1 个实例。C 语言函数的全部 4 个实例都是使用相同 RTL 块来实现的。这样即可减少函数所使用的资源量,但由于共享这些资源,故而对性能会产生负面影响。
对于 ALLOCATION 还可指定模板函数,只需指定函数指针代替函数名称即可,如下示例所示。
C 语言代码中的运算(例如,加法、乘法、阵列读取和写入)均可通过 ALLOCATION 编译指示来加以限制。
语法
将编译指示置于函数、循环或区域的主体内适用的位置。
重要: 以下实参顺序至关重要。
<type>
作为运算或函数必须位于 allocation
关键字之后。#pragma HLS allocation <type> instances=<list> limit=<value>
其中:
-
<type>
- 可指定以下任一类型:
-
function
- 指定分配适用于
instances=
列表中的函数。该函数可以是原始 C 语言或 C++ 语言代码中的任意函数,但满足下列任一类型的函数除外:- 由
pragma HLS inline
或set_directive_inline
命令内联的函数,或者 - 由 Vitis HLS 工具自动内联的函数。
- 由
-
operation
- 指定分配适用于
instances=
列表中的运算。
-
-
instances=<list>
- 指定来自 C 代码的函数名称或运算符。
要获取可使用
ALLOCATION
编译指示加以限制的运算符的完整列表,请参阅 config_op 命令。 -
limit=<value>
- (可选)指定要在内核中使用的实例的限制。
示例 1
在设计中具有函数 foo
的多个实例的情况下,此示例用于将硬件内核的 RTL 中的 foo
实例数量限制为 2。
#pragma HLS allocation function instances=foo limit=2
示例 2
将函数 my_func
的实现中使用的乘法器运算数量限制为 1。此限制不适用于超出 my_func
范围的任意乘法器或者可能位于 my_func
的子函数内的乘法器。
提示: 要限制任何子函数实现过程中使用的乘法器数量,请在子函数上指定分配指令,或将子函数内联到
my_func
函数中。void my_func(data_t angle) { #pragma HLS allocation operation instances=mul limit=1 ... }
示例 3
ALLOCATION 编译指示还可在模板函数上使用,如下所示。标识通常基于函数名称,但对于模板函数,标识则基于函数指针:
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