描述
PERFORMANCE 编译指示或指令支持您指定高层次约束 target_ti
或 target_tl
来定义循环的连续启动之间的时钟周期数,并允许该工具推断达成期望结果所需的低层次 UNROLL、PIPELINE、ARRAY_PARTITION 和 INLINE 指令。PERFORMANCE 编译指示或指令不保证将达成指定的值,仅作为目标。
target_ti
是循环连续启动之间的时间间隔,或者启动循环的首次迭代与下一次启动循环的首次迭代之间的时间间隔。在以下代码示例中,target_ti=T
意味着在 L1
的 2 次连续迭代之间,L2
循环启动的目标时间间隔应为 100 个周期。
const int T = 100;
L1: for (int i=0; i<N; i++)
L2: for (int j=0; j<M; j++){
pragma HLS performance target_ti=T
...
}
target_tl
是循环启动与结束之间的时间间隔,或者循环的首次迭代开始与循环的最后一次迭代完成之间的时间间隔。例如,在前述代码示例中,target_tl=T
意味着对于 L1
的单次迭代,L2
循环的目标完成时间应为 100 个周期。
#pragma HLS INLINE off
来为特定函数禁用此操作。传输事务时间间隔是循环的启动时间间隔 (II) 乘以迭代次数或循环次数:target_ti = II * loop tripcount。反之,target_ti
= 频率 (Hz) / 每秒操作数。
例如,假定图像处理函数每次调用处理一帧,吞吐量目标为 60 fps,则此函数的目标吞吐量为每秒 60 次调用。如果时钟频率为 180 MHz,则 target_ti
为 180M/60,或每次函数调用 3 百万个时钟周期。
语法
将编译指示置于循环边界内或嵌套循环的外层循环边界内。
#pragma HLS performance target_ti=<value> target_tl=<value> unit=[sec|cycle]
其中:
-
target_ti=<value>
- 指定目标传输事务时间间隔定义为代码的函数、循环或区域完成一次迭代的时钟周期数。<value> 可指定为整数、浮点或由该工具解析为整数的常量表达式。 注释: 如果发生截位,则返回警告。
-
target_tl=<value>
-
指定目标时延定义为循环完成所有迭代的时钟周期数。传输事务时延定义为循环的首次迭代开始与该循环的最后一次迭代完成之间的时间间隔。<value> 可指定为整数、浮点或由该工具解析为整数的常量表达式。
- unit=[sec | cycle]
- 指定与
target_ti
值或target_tl
值关联的单位。此单位可指定为秒数或时钟周期数。当指定的单位为秒数时,可用表示纳秒 (ns)、皮秒 (ps) 或微秒 (us) 的相应的值来指定单位。
示例 1
指定外层函数的目标传输事务时间间隔为 1000 个时钟周期。
for (int i =0; i < 1000; ++i) {
#pragma HLS performance target_ti=1000
for (int j = 0; j < 8; ++j) {
int tmp = b_buf[j].read();
b[i * 8 + j] = tmp + 2;
}
}