myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA 流水线入门:吞吐率、延迟与数据反压

myfpga.com.cn 编辑部 · 2026-10-05

流水线把一条数据通路分成多个由寄存器隔开的阶段,让不同数据同时处于不同阶段。它可以缩短某些寄存器间的组合路径,但不自动保证更高频率、更高系统吞吐率或更低单笔延迟。先明确目标,再决定在哪里插入寄存器。

划分寄存器:数据和控制一起移动

考虑 y=(a+b)×c。未分段的寄存器间路径可能包含加法和乘法;一种划分是:

输入寄存器 → 加法 → 中间寄存器 → 乘法 → 输出寄存器
                 同时寄存 c ────────↑

中间寄存器保存和数,也要保存同一笔输入的 c。否则乘法可能把上一笔和数与下一笔 c 混在一起。数据有效位、编号、包尾或异常标志同样要对齐;发生停顿时,它们也需与数据一起保持或前进。

划分点不必按代码行数平均分配,应关注实际组合延迟、布线和资源边界。上述结构是概念示例,不指定乘法器映射,也没有规定具体接口延迟;DSP 内部寄存器或多周期运算会改变最终划分。

吞吐率和延迟是两个指标

延迟描述一笔数据从被接受到结果出现或被接收所需的时间;需先写清起止事件。吞吐率描述单位时间完成多少笔数据。启动间隔 II 则表示连续两笔新输入之间的最小启动周期数。

概念背景见 Intel 的 FPGA 硬件设计说明。下面另设一个理想接口示例:以输入、输出握手为测量边界,延迟固定为 3 个周期、II=1,无反压且输入连续。

时钟边沿编号 输入被接受 输出被接收
0 A —
1 B —
2 C —
3 D A
4 E B
5 F C

A 等待 3 个周期,但流水线填满后可以每周期完成一笔,不是每 3 周期才完成一笔。若时钟周期为 T,这个示例的单笔延迟是 3T,稳态吞吐率为 1/T。这些是示例条件下的推导,不是器件性能数据。

理想情况下吞吐率可按 f_clk/II 估算;实际还受输入空闲、输出停顿、存储带宽及共享资源限制。多加寄存器不会消除算法中的循环依赖,也不会自动改变 II。

反压:没有位置就先别接收

以下使用同一时钟域、当拍握手的 ready/valid 约定:在时钟有效边沿,valid && ready 为真才发生传输。valid 表示发送方持有有效数据,ready 表示接收方能接受。

若 valid=1、ready=0,本拍没有传输,发送方保留 valid 和当前数据及关联控制信息,直到完成握手。发送方不能以“接收方先给 ready”为发布 valid 的前提,以免双方互等。AXI4-Stream 使用这一类规则,参见 AMD 的接口说明;其他接口可能有不同的 ready 延迟约定,不能直接套用。

边沿  valid  ready  数据  结果
 10      1      0    A   等待,保留 A
 11      1      0    A   继续等待
 12      1      1    A   接收 A
 13      1      1    B   可接收下一笔 B

反压传播到上游后,新输入的接受率下降,单笔实际延迟也可能增加。可停顿流水线可以逐级保持数据;不能停顿的计算单元则需要在接受输入前预留足够的输出缓存。不能把 ready 简单打一拍就认为问题解决:上游在获知停止前可能继续送入数据,需要缓冲吸收这些在途数据。

接口流水线的处理依赖具体协议和实现,例如 Intel 的 Avalon Streaming 流水级说明区分数据和 ready 路径的寄存方式;它是具体 IP 的资料,不是所有流水线的通用实现要求。

常见取舍:更多阶段不一定更好

因此不能承诺“加流水线必然提升性能”。如果瓶颈在存储器、接口或算法依赖,增加阶段可能只带来额外延迟和资源占用。仿真用于确认功能及握手,实现后的静态时序和资源报告用于判断收益。

验证时先检查什么

用单笔、连续输入、空拍及持续/间歇反压覆盖流水线填充、排空和停顿;逐笔核对数据顺序,确认没有丢失、重复或控制错位。复位清除有效状态,并明确在途事务如何处理。固定延迟接口检查准确周期,弹性接口则同时记录握手和等待时间,不把停顿当作计算错误。

延伸阅读

信息来源