描述
在 C/C++ 语言描述中,所有操作均按顺序执行。如无限制资源的任何指令(如 set_directive_allocation
),则 Vitis HLS 会尝试最大限度减小时延并提高并发。数据依赖关系可对此加以限制。例如,访问阵列的函数或循环必须先完成对阵列的所有读写访问后才能完成操作。这样会阻止下一个使用该数据的函数或循环开始操作。
但函数或循环中的操作可在前一个函数或循环尚未完成其所有操作时就开始操作。syn.directive.dataflow
用于指定要对函数或循环执行的数据流最优化,用于提高 RTL 实现的并发。指定 syn.directive.dataflow
后,HLS 工具会分析顺序函数或循环之间的数据流,并基于乒乓 RAM 或 FIFO 创建通道,以允许使用者 (consumer) 函数或循环在生产者 (producer) 函数或循环完成前即开始操作。这样即可允许函数或循环并行操作,从而降低时延,并提升 RTL 吞吐量。
如果未指定启动时间间隔(任一函数或循环与下一个函数或循环的开始时间间隔的周期数),那么 Vitis HLS 会尝试最大限度减小启动时间间隔,且数据一旦可用即开始操作。要使 DATAFLOW 最优化正常工作,数据必须逐一流经设计中的每个任务。以下编码样式会阻止 HLS 工具执行的 DATAFLOW
最优化。
- 单一生产者使用者违例
- 任务间的反馈
- 任务的有条件执行
- 含多个退出条件的循环
重要: 如果存在上述任一编码样式,则 HLS 工具会发出一条消息,且不会执行 DATAFLOW 最优化。
最后,DATAFLOW 最优化不含任何分层实现。如果子函数或循环包含可能受益于 DATAFLOW 最优化的其他任务,那么您必须对该循环、子函数或子函数的内联应用 DATAFLOW 最优化。
语法
syn.directive.dataflow=<location> disable_start_propagation
-
<location>
是数据流最优化的执行位置(格式为function[/label]
)。 -
disable_start_propagation
:禁用起始 FIFO 的创建,起始 FIFO 用于向内部进程传输起始令牌。此类 FIFO 有时可能会成为性能瓶颈。
示例
指定 DATAFLOW 最优化在函数 foo
内执行。
syn.directive.dataflow=foo