描述
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