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 的资料,不是所有流水线的通用实现要求。
常见取舍:更多阶段不一定更好
- 时序与延迟:分段可能缩短关键路径,但增加周期数;绝对延迟还取决于最终时钟周期,需一起比较。
- 面积与控制复杂度:增加寄存器、有效位和缓存;复位、使能、分支合流与异常恢复也要重新对齐。
- 数据路径与反压路径:数据逻辑已分段,长 ready 链或高扇出控制仍可能成为关键路径。
- 资源与实现条件:DSP、RAM 的端口与内部寄存器选项、布局布线、工具优化和时钟约束会影响结果,需按目标器件验证。
因此不能承诺“加流水线必然提升性能”。如果瓶颈在存储器、接口或算法依赖,增加阶段可能只带来额外延迟和资源占用。仿真用于确认功能及握手,实现后的静态时序和资源报告用于判断收益。
验证时先检查什么
用单笔、连续输入、空拍及持续/间歇反压覆盖流水线填充、排空和停顿;逐笔核对数据顺序,确认没有丢失、重复或控制错位。复位清除有效状态,并明确在途事务如何处理。固定延迟接口检查准确周期,弹性接口则同时记录握手和等待时间,不把停顿当作计算错误。
延伸阅读
信息来源
- https://www.intel.com/content/www/us/en/docs/oneapi-fpga-add-on/developer-guide/2024-0/concepts-of-fpga-hardware-design.html
- https://docs.amd.com/r/en-US/ug1483-model-composer-sys-gen-user-guide/AXI4-Stream-Support-in-Model-Composer
- https://www.intel.com/content/www/us/en/docs/programmable/683609/22-1/streaming-pipeline-stage.html