描述
将该编译指示手动应用于循环,用于指定循环执行的迭代总数。
重要: LOOP_TRIPCOUNT 编译指示或指令仅用于分析,不影响综合结果。
Vitis HLS 工具会报告每个循环的总时延,即执行循环的所有迭代的时钟周期数。因此,循环时延即为循环迭代次数(或循环次数)的函数。
循环次数可为常量值。它取决于循环表达式(例如,x < y)中使用的变量值或循环内使用的控制语句。在某些情况下,HLS 工具无法判定循环次数,因此时延未知。在此类情况下,用于判定循环次数的变量可能是:
- 输入实参,或者
- 采用动态运算计算所得的变量。
在以下示例中,for 循环的最大迭代次数由输入 num_samples
的值来确定。在 C 语言函数中不定义 num_samples
的值,该值从外部进入函数。
void foo (num_samples, ...) {
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
...
result = a + b;
}
}
如果循环时延未知或者无法计算,那么 LOOP_TRIPCOUNT 编译指示会要求您指定循环迭代次数的最小、最大和平均值。这样该工具即可分析循环时延给报告中的设计总时延造成的影响,并帮助您为设计决定合适的优化措施。
提示: 如果使用 C 语言断言宏来限制循环变量的大小,那么 Vitis HLS 可将其用于定义循环限制以供报告之用,并根据这些限制创建大小精确的硬件。
语法
将 C 语言源代码中的编译指示置于循环的主体内。
#pragma HLS loop_tripcount min=<int> max=<int> avg=<int>
其中:
-
max= <int>
- 指定循环迭代次数的最大值。
-
min=<int>
- 指定循环迭代次数的最小值。
-
avg=<int>
- 指定循环迭代次数的平均值。
示例
在以下示例中,函数 foo
中的 loop_1
的最小循环次数指定为 12,最大循环次数则为 16:
void foo (num_samples, ...) {
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
#pragma HLS loop_tripcount min=12 max=16
...
result = a + b;
}
}