pragma HLS pipeline - 2022.1 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2022-06-07
Version
2022.1 简体中文

描述

允许并发执行操作,以缩短函数或循环的启动时间间隔 (II)。流水线的默认风格是由 config_compile -pipeline_style 命令定义的,但可在 PIPELINE 编译指示或指令内进行覆盖。

流水打拍函数或循环每 <N> 个时钟周期即可处理新输入,其中 <N> 是该循环或函数的 II。如果 II 为 1,则表示每个时钟周期都处理新输入。您可通过为编译指示使用 II 选项来指定启动时间间隔。

Vitis HLS 使用 PIPELINE 编译指示或指令时的默认行为是根据指定的时钟周期约束,为设计生成最小 II。除非指定 II 选项,否则重点强调满足时序,而不是实现 II。

如果 Vitis HLS 工具无法使用指定 II 创建设计,那么它会发出警告,并以可能的最低 II 创建设计。

随后,您可利用警告消息来分析此设计,以判定必须采取哪些步骤才能创建满足所需启动时间间隔的设计。

循环流水打拍允许以并发方式来实现循环的操作,如下图所示。在此图中,(A) 显示了默认顺序操作,每次输入读操作间存在 3 个时钟周期 (II = 3),并且需要经过 8 个时钟周期后才会执行最后一次输出写操作。(B) 显示的流水打拍操作表明每次读操作之间有 1 个时钟周期 (II=1),并且距离最后的写操作有 4 个周期。

图 1. 循环流水打拍
重要: 循环进位依赖关系会阻碍流水打拍。使用 DEPENDENCE 编译指示或指令可提供附加信息,这些信息可用于克服循环进位依赖关系,并支持循环流水打拍(或以较低时间间隔进行流水打拍)。

语法

将 C 语言源代码中的编译指示置于函数或循环的主体内。

#pragma HLS pipeline II=<int> off rewind style=<value>

其中:

II=<int>
指定期望的流水线启动时间间隔。HLS 工具会尝试满足此请求。根据数据依赖关系,实际结果的启动时间间隔可能更大。
off
可选关键字。关闭特定循环或函数的流水线。当使用 config_compile -pipeline_loops 对循环进行全局流水打拍时,可使用该选项来为特定循环禁用流水打拍。
rewind
可选关键字。支持回绕,如 回绕已流水打拍的循环以保障性能 中所述。这样即可支持持续性循环流水打拍,但在循环执行结束与下一次执行开始之间没有暂停。仅当顶层函数内只有一个循环(或完美循环嵌套)时,回绕才有效。循环前的代码段:
  • 被视为初始化。
  • 在流水线中仅执行一次。
  • 无法包含任何条件操作符 (if-else)。
    提示: 仅针对流水打拍循环才支持此功能:针对流水打拍函数不支持。
style=<stp | frp | flp>
指定要用于指定的函数或循环的流水线类型。如需了解有关流水线风格的更多信息,请参阅 刷新流水线。流水线类型包括:
stp
停止流水线。仅当输入数据可用时才运行,否则停滞。这是默认设置,也是 Vitis HLS 用于循环和函数流水打拍的流水线类型。无需可刷新流水线时,请使用此类型。例如,没有导致停滞的性能或死锁问题时即可用。
flp
该选项将流水线定义为可刷新流水线,如 刷新流水线 中所述。此类型的流水线通常耗用更多资源和/或可能 II 较大,因为无法在流水线迭代间共享资源。
frp
自由运行的可刷新流水线。即使输入数据不可用也可运行。如果由于流水线控制信号扇出减少而导致需要更好的时序,或者如果需要提升性能以免死锁,则可使用此类型。但此流水线风格可能功耗更大,因为即使没有数据也会对流水线寄存器进行计时。
重要: 这是提示,而非硬性约束。工具会检查设计启用流水打拍的条件。部分循环可能不遵循特定风格,如果需要,工具会还原为默认风格 (stp)。

示例

在此示例中,func 函数按启动时间间隔 1 来进行流水打拍。

void func { a, b, c, d} {
  #pragma HLS pipeline II=1
  ...
}