描述
指定最小时延值或最大时延值,用于完成函数、循环和区域。
- 时延
- 生成输出所需的时钟周期数。
- 函数时延
- 函数计算并返回所有输出值所需的时钟周期数。
- 循环时延
- 执行所有循环迭代的周期数。
Vitis HLS 始终尝试将设计中的时延最小化。指定 LATENCY 编译指示时,工具行为如下所示:
- 当时延大于最小值时,或者小于最大值时:满足约束。不再执行进一步优化。
- 当时延小于最小值时:如果 HLS 工具可以实现小于最小指定值的时延,那么它可将时延扩展至指定值,这样可能增加共享。
- 当时延大于最大值时:如果 HLS 工具无法调度到最大限值范围内,那么它会尽力实现指定约束。如果仍无法满足最大时延,则会发出警告,并以超出最大限值前提下可实现的最小时延来生成设计。
提示: 您还可以使用 LATENCY 编译指示来限制该工具寻找最优解决方案的范围。为代码中的作用域(包括循环、函数或区域)指定时延约束即可减少该作用域内的可能的解决方案数量,从而改善工具运行时间。如需了解更多信息,请参阅 改善综合运行时间和容量。
如果要限制所有循环迭代的总时延,应将时延指令应用于包含整个循环的区域,如以下示例所示:
Region_All_Loop_A: {
#pragma HLS latency max=10
Loop_A: for (i=0; i<N; i++)
{
..Loop Body...
}
}
在此情况下,即使展开循环,时延指令仍会对所有循环操作设置最大限制。
如果 Vitis HLS 无法满足最大时延约束,它会放宽时延约束,并尝试尽可能实现最佳结果。
如果设置最小时延约束,并且 Vitis HLS 生成的设计时延低于所需的最小值,它会插入虚拟时钟周期以满足最小时延。
语法
请在代码的函数、循环或区域的边界内必须对时延加以管理的位置处布局该编译指示。
#pragma HLS latency min=<int> max=<int>
其中:
-
min=<int>
- (可选)指定代码的函数、循环或区域的最小时延。
-
max=<int>
- (可选)指定代码的函数、循环或区域的最大时延。
注释: 虽然最小值和最大值均描述为可选,但必须至少指定二者之一。
示例 1
指定 foo
函数采用最小时延值 4 和最大时延值 8。
int foo(char x, char a, char b, char c) {
#pragma HLS latency min=4 max=8
char y;
y = x*a+b+c;
return y
}
示例 2
如以下示例所示,loop_1
指定为采用最大时延 12。将编译指示置于循环主体内,如图所示。
void foo (num_samples, ...) {
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
#pragma HLS latency max=12
...
result = a + b;
}
}
示例 3
以下示例会创建代码区域和分组信号,这些区域和信号需要在同一时钟周期内通过指定 0 时延来进行更改。
// create a region { } with a latency = 0
{
#pragma HLS LATENCY max=0 min=0
*data = 0xFF;
*data_vld = 1;
}