本章节概括的各项最优化技巧可供您用于指导 Vitis HLS 生成可满足所期望的性能和面积目标的宏架构。使用 Vitis HLS 时可以将不同的最优化指令应用于设计,包括:
- 任务流水打拍,允许在当前任务完成前即开始执行下一项任务。
- 指定完成函数、循环和区域的目标时延。
- 指定使用的资源数量限制。
- 覆盖代码中的固有或隐含依赖关系,以允许执行特定操作。例如,如果可以放弃或忽略初始数据值(例如在视频流中),则允许对存储器先读取后写入,前提是这样可提高性能。
- 指定 I/O 协议以确保函数实参可以连接到具有相同 I/O 协议的其它硬件块。注释: Vitis HLS 自动确定任何子函数使用的 I/O 协议。您不能控制这些端口,只能指定端口是否寄存。
根据对设计应用最优化的方式来演示最优化技巧:
您可使用各种 HLS 编译指示,将最优化指令作为编译器的编译指示直接添加到源代码中,或者也可以使用 Tcl set_directive
命令在 Tcl 脚本中应用最优化指令,并在编译期间通过解决方案来使用该 Tcl 脚本,如 添加编译指示和指令 中所述。下表列出了 Vitis HLS 提供的最优化指令(作为编译指示或 Tcl 指令)。
指令 | 描述 |
---|---|
AGGREGATE | AGGREGATE 编译指示用于将任一结构体的所有元素都组合到一个单宽矢量中,以允许同时读取和写入该结构体的所有成员。 |
ALIAS | ALIAS 编译指示支持在 Vitis HLS 中通过定义缓冲器内指针之间的距离来执行数据依赖关系分析。 |
ALLOCATION | 用于指定所使用的运算、实现或函数的数量限制。这样会强制共享硬件资源并可能增大时延。 |
ARRAY PARTITION | 把大型阵列分区为多个较小阵列或分区为单独的寄存器,以改善数据访问并消除块 RAM 瓶颈。 |
ARRAY_RESHAPE | 把阵列从多元素阵列重塑为字宽更宽的阵列。用于在不增加使用的块 RAM 数量的前提下提升块 RAM 访问。 |
BIND_OP |
用于为 RTL 中的运算定义特定的实现。 |
BIND_STORAGE |
用于为 RTL 中的存储元素或存储器定义特定的实现。 |
DATAFLOW | 支持任务层次的流水打拍,允许函数和循环并发执行。用于最优化吞吐量和/或时延。 |
DEPENDENCE | 用于提供可克服循环进位依赖关系并允许循环流水打拍(或以更低的时间间隔进行流水打拍)的其它信息。 |
DISAGGREGATE | 将结构体细分为各独立元素。 |
EXPRESSION_BALANCE | 允许关闭自动表达式平衡。 |
INLINE | 内联函数,移除该层次的函数层级。用于跨越函数边界实现逻辑最优化,通过减少函数调用开销来改善时延/时间间隔。 |
INTERFACE | 指定如何根据函数描述创建 RTL 端口。 |
LATENCY | 允许指定最小和最大时延约束。 |
LOOP_FLATTEN | 允许把嵌套循环折叠为已改善时延的单一循环。 |
LOOP_MERGE | 合并连续循环,以缩短总体时延、增加共享和提升逻辑最优化。 |
LOOP_TRIPCOUNT | 用于含变量边界的循环。提供估算的循环迭代计数。这对综合没有影响,只对报告功能有影响。 |
OCCURRENCE | 在对函数或循环进行流水打拍时使用,用于指定某个位置的代码执行速度低于外围函数或循环中的代码执行速度。 |
PIPELINE | 允许在单一循环或函数内重叠执行运算,从而缩短启动时间间隔。 |
PROTOCOL | 此命令用于指定代码区域(协议区域),除非代码中明确指定,否则 Vitis HLS 不会在其中插入时钟操作。 |
RESET | 本指令用于在特定状态变量(全局或静态)上添加或移除复位。 |
STABLE | 用于指示在数据流区域的入口和出口处生成同步时,可忽略某个该数据流区域的变量输入或输出。 |
STREAM | 指定在数据流最优化期间将特定阵列作为 FIFO 或 RAM 存储器通道来实现。使用 hls::stream 时,STREAM 最优化指令用于覆盖 hls::stream 的配置。 |
TOP | 综合的顶层函数在工程设置中指定。该指令可用于将任意函数指定为综合的顶层函数。这样即可允许将相同工程内的不同解决方案指定为综合的顶层函数,而无需创建新工程。 |
UNROLL | 展开 for 循环以创建循环主体的多个实例,随后即可独立调度其指令。 |
除了最优化指令外,Vitis HLS 还提供了多条配置命令,这些命令可能影响综合结果的性能。如需了解有关使用配置命令的详细信息,请参阅 设置配置选项。下表反映了其中部分命令。
GUI 指令 | 描述 |
---|---|
Config Array Partition | 用于判断包括全局阵列在内的阵列分区方式,以及分区是否会影响阵列端口。 |
Config Compile | 控制综合专用最优化功能,例如自动循环流水打拍和浮点运算最优化。 |
Config Dataflow | 用于指定数据流最优化中的默认存储器通道和 FIFO 深度。 |
Config Interface | 用于控制与顶层函数实参无关联的 I/O 端口,允许从最终 RTL 中去除未使用的端口。 |
Config Op | 配置指定运算的默认时延和实现。 |
Config RTL | 提供对输出 RTL 的控制权,包括文件和模块命名、复位样式和 FSM 编码。 |
Config Schedule | 判断综合调度阶段的工作量以及输出消息的详细程度。 |
Config Storage | 配置指定存储类型的默认时延和实现。 |
Config Unroll | 配置展开循环的默认循环次数阈值。 |