刷新流水线
只要在流水线输入端数据可用,流水线就会持续执行。如果没有可供处理的数据,流水线就会停滞。如下图所示,Input Data
Valid
信号转为低电平,表示没有更多有效的输入数据。当此信号变为高电平状态后,即表示有新数据可供处理,那么流水线就会继续操作。
在某些情况下,最好采用可“清空”或可“刷新”的流水线。提供 flush
选项即可执行此操作。当“刷新”流水线时,如果没有新输入可用(由流水线起始位置的数据 valid
信号来判定),流水线就会停止读取,但仍会继续处理并关闭后续每个流水线阶段,直至最终输入已处理至流水线输出为止。
如下文所述,本工具会自动选择正确的流水线样式,用于给定的流水打拍循环或函数。但您可使用 syn.compile.pipeline_style
配置命令指定流水线样式来覆盖此默认行为。
您也可以使用 PIPELINE 编译指示或指令为函数或循环指定流水线样式。该选项适用于编译指示或指令的特定范围,不更改 syn.compile.pipeline_style
分配的全局默认设置。
stp
和 flp
类型的流水线都使用标准流水线逻辑,其中硬件流水线使用各种阻塞信号来使流水线停滞。这些阻塞信号常变为高扇出信号线的驱动程序,在物理阶段数量较多的流水线和处理大量数据的流水线上尤其如此。此类高扇出信号线一旦创建后,就会成为时序收敛问题的主要原因,这些问题在 RTL/逻辑综合或布局布线期间无法修复。为解决此问题,我们创建了名为“自由运行的流水线”(或称为 frp
)。自由运行的流水线是适用于处理含阻塞信号操作的流水线的最高效的架构。原因在于
- 它完全消除了与寄存器使能的阻塞信号连接
- 它是完全可刷新的流水线,允许为无效传输事务生成气泡
- 不同于先前分发扇出(跨触发器)的架构,此架构可以减少扇出
- 它不依赖综合和/或布局布线最优化(如触发器克隆)
- 它创建的结构有助于 PnR,在此结构中,不仅缩短了连线长度,也减少了高扇出
但减少扇出也有代价:
- 阻塞输出端口所需的 FIFO 缓冲器大小导致额外增加资源使用量。
- 这些阻塞输出端口上存在多路复用器延迟
- 由于提前确认正压触发器导致可能影响性能
frp
) 只能从 DATAFLOW 区域内部调用。frp
样式无法应用于在顺序区域或流水打拍区域内调用的循环。流水线类型
下表汇总了该工具内可用的三种类型的流水线。该工具会自动选择正确的流水线样式,用于给定的流水打拍循环或函数。如果流水线搭配 hls::tasks
一起使用,那么会自动选中刷新流水线 (FLP) 样式以避免死锁。如果流水线控制需要高扇出并且满足其他自由运行要求,那么本工具会选择自由运行的流水线 (FRP) 样式以限制高扇出。最后,如果出现上述任一情况,则选中标准流水线 (STP) 样式。
名称 | 停滞的流水线 | 自由运行/可刷新的流水线 | 可刷新的流水线 |
---|---|---|---|
用例 |
|
|
如需可刷新的流水线以换取更好的性能或避免死锁,则可使用此项。 |
编译指示/指令 |
#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
|
缺点 |
|
|
|
优点 |
|
|
|
syn.compile.enable_auto_rewind
配置命令时,刷新流水线 (flp
) 与 PIPELINE 编译指示或指令中指定的 rewind 选项兼容。