pragma HLS allocation - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

描述

指定相应限制,以便对已实现的内核中的资源分配加以限制。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 inlineset_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