刷新流水线和流水线类型 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

刷新流水线

只要在流水线输入端数据可用,流水线就会持续执行。如果没有可供处理的数据,流水线就会停滞。如下图所示,Input Data Valid 信号转为低电平,表示没有更多有效的输入数据。当此信号变为高电平状态后,即表示有新数据可供处理,那么流水线就会继续操作。

图 1. 含停滞的循环流水打拍

在某些情况下,最好采用可“清空”或可“刷新”的流水线。提供 flush 选项即可执行此操作。当“刷新”流水线时,如果没有新输入可用(由流水线起始位置的数据 valid 信号来判定),流水线就会停止读取,但仍会继续处理并关闭后续每个流水线阶段,直至最终输入已处理至流水线输出为止。

如下文所述,本工具会自动选择正确的流水线样式,用于给定的流水打拍循环或函数。但您可使用 syn.compile.pipeline_style 配置命令指定流水线样式来覆盖此默认行为。

您也可以使用 PIPELINE 编译指示或指令为函数或循环指定流水线样式。该选项适用于编译指示或指令的特定范围,不更改 syn.compile.pipeline_style 分配的全局默认设置。

stpflp 类型的流水线都使用标准流水线逻辑,其中硬件流水线使用各种阻塞信号来使流水线停滞。这些阻塞信号常变为高扇出信号线的驱动程序,在物理阶段数量较多的流水线和处理大量数据的流水线上尤其如此。此类高扇出信号线一旦创建后,就会成为时序收敛问题的主要原因,这些问题在 RTL/逻辑综合或布局布线期间无法修复。为解决此问题,我们创建了名为“自由运行的流水线”(或称为 frp)。自由运行的流水线是适用于处理含阻塞信号操作的流水线的最高效的架构。原因在于

  • 它完全消除了与寄存器使能的阻塞信号连接
  • 它是完全可刷新的流水线,允许为无效传输事务生成气泡
  • 不同于先前分发扇出(跨触发器)的架构,此架构可以减少扇出
  • 它不依赖综合和/或布局布线最优化(如触发器克隆)
  • 它创建的结构有助于 PnR,在此结构中,不仅缩短了连线长度,也减少了高扇出

但减少扇出也有代价:

  • 阻塞输出端口所需的 FIFO 缓冲器大小导致额外增加资源使用量。
  • 这些阻塞输出端口上存在多路复用器延迟
  • 由于提前确认正压触发器导致可能影响性能
重要: 自由运行的流水线 (frp) 只能从 DATAFLOW 区域内部调用。frp 样式无法应用于在顺序区域或流水打拍区域内调用的循环。

流水线类型

下表汇总了该工具内可用的三种类型的流水线。该工具会自动选择正确的流水线样式,用于给定的流水打拍循环或函数。如果流水线搭配 hls::tasks 一起使用,那么会自动选中刷新流水线 (FLP) 样式以避免死锁。如果流水线控制需要高扇出并且满足其他自由运行要求,那么本工具会选择自由运行的流水线 (FRP) 样式以限制高扇出。最后,如果出现上述任一情况,则选中标准流水线 (STP) 样式。

表 1. 流水线类型
名称 停滞的流水线 自由运行/可刷新的流水线 可刷新的流水线
用例
  • 如果流水线控制上不存在因扇出过高而导致的时序问题,则可使用此项
  • 如无需可刷新流水线(如不存在因停滞而导致的性能或死锁问题),则可使用此项
  • 如果由于从流水线控制到寄存器使能的扇出,而需要更好的时序,则可使用此项
  • 如需可刷新的流水线以换取更好的性能或避免死锁,则可使用此项
  • 只能从数据流区域调用。
如需可刷新的流水线以换取更好的性能或避免死锁,则可使用此项。
编译指示/指令 #pragma HLS pipeline style=stp #pragma HLS pipeline style=frp #pragma HLS pipeline style=flp
全局设置 syn.compile.pipeline_style=stp(默认) syn.compile.pipeline_style=frp syn.compile.pipeline_style=flp
缺点
  • 不可刷新,因此可能:
    • 导致数据流中出现更多死锁
    • 如果缺少下一次迭代的输入,则会阻止交付计算所得的输出
  • 由于流水线控制上扇出过高导致时序问题
  • 由于输出上添加的 FIFO,资源增加量中等
  • 需至少一个阻塞 I/O(串流或 ap_hs)。
  • 并非所有流水打拍场景和 I/O 类型都受支持。
  • 可采用较大的 II
  • 由于 II>1 时共享更少,资源利用率更大
优点
  • 默认流水线。无使用约束。
  • 通常总体资源利用率最低。
  • 时序更好,因为
    • 扇出更少
    • 流水线控制逻辑更简单
  • 可刷新
  • 可刷新
  • 避免死锁
重要: 同时启用 syn.compile.enable_auto_rewind 配置命令时,刷新流水线 (flp) 与 PIPELINE 编译指示或指令中指定的 rewind 选项兼容。