描述
syn.directive.performance 适用于循环和循环嵌套,需要已知循环次数才能判定性能。如果您的循环包含可变循环计数,则必须同时指定 syn.directive.tripcount。
syn.directive.performance 允许您指定高层次约束:target_ti 或 target_tl。该指令允许您定义循环的连续启动之间的时钟周期数。该指令允许工具推断更低层次的 UNROLL、PIPELINE、ARRAY_PARTITION 和 INLINE 指令,以达成所期望的结果。syn.directive.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 个周期。
syn.directive.inline 会自动应用于 II=1 的任意流水打拍循环内部的函数,以改善吞吐量。如果您应用 PERFORMANCE 编译指示,那么该工具还会触发自动内联优化。如果您应用某条指令,并且该指令推断的流水线 II=1,那么该工具也会触发自动内联优化。您可使用 syn.directive.inline off 来为特定函数禁用此操作。传输事务时间间隔是循环的启动时间间隔 (II) 乘以迭代次数或循环次数:target_ti = II * loop tripcount。反之,target_ti = 频率 (Hz) / 每秒操作数。
例如,假设某个图像处理函数每次调用都处理一帧,且吞吐量目标为 60 fps。该函数的目标吞吐量即为每秒 60 次调用。如果时钟频率为 180 MHz,则 target_ti 为 180M/60,或每次函数调用 3 百万个时钟周期。
语法
指定已标记的循环的指令。
syn.directive.performance=<location> [Options]
其中:
<location> 以 function/loop_label 格式来指定循环。
选项
-
target_ti=<value> - 指定目标传输事务时间间隔是循环完成一次迭代的时钟周期数。传输事务时间间隔是指从循环或嵌套循环的第一项传输事务开始到该循环的下一项传输事务开始之间的时钟周期数。<value> 可取整数、浮点或由该工具解析为整数的常量表达式。注释: 如果发生截位,该工具会返回警告。
-
target_tl=<value> -
指定目标时延是循环完成所有迭代的时钟周期数。传输事务时延即为循环的首次迭代开始与该循环的最后一次迭代完成之间的时间间隔。<value> 可取整数、浮点或由该工具解析为整数的常量表达式。
- unit=[sec | cycle]
- 指定与
target_ti值或target_tl值关联的单位。此单位可取秒数或时钟周期数。当指定的单位为秒数时,您可用表示纳秒 (ns)、皮秒 (ps) 或微秒 (us) 的相应的值来指定该单位。
示例 1
标记为 loop_1 的循环的目标传输事务时间间隔为 4 个时钟周期:
syn.directive.performance=loop_1 target_ti=4