HyperFlex 架构(1):介绍与设计摘要
HyperFlex FPGA 架构支持 Hyper-Retiming、Hyper-Pipelining 和 Hyper-Optimization 三种设计技术,使 Stratix 10 和 Agilex FPGA 系列产品能够达到最高的时钟频率。
HyperFlex 架构 FPGA
| HyperFlex 架构器件 | HyperFlex 架构描述 |
|---|---|
| Stratix 10 FPGA / Agilex FPGA 系列 | 一种 “Registers Everywhere” 的架构,在器件核心的布线以及所有功能块的输入端中都嵌入了可以 Bypass 的 Hyper-Register。布线信号可以先经过寄存器再输出,也可以旁路寄存器直接进入多路选择器,从而在 Agilex 7、Agilex 5、Agilex 3 和 Stratix 10 器件中提升带宽、面积和功耗效率。 |
图 1 示意的是 Hyper-Register 在 FPGA 内部的整体分布。每个 ALM 的功能块输入处和布线通道中都分布了额外的寄存器。
图 2 是单个可旁路 Hyper-Register 的结构。一个寄存器配合一个由 CRAM 配置位控制的多路选择器,决定信号是否经过该寄存器。
概念
| 概念 | 描述 |
|---|---|
| Critical Chain | 任何阻止寄存器 retiming 的设计条件。限制因素可以包括一条链中的多条 register-to-register 路径。Critical chain 及其所属时钟域的 fMAX 受限于 register-to-register 路径的平均延迟,以及不可分割电路元素(如布线走线)的量化延迟。使用 Fast Forward 编译来打破 critical chain。 |
| Fast Forward Compilation | 生成针对具体设计的时序收敛建议,以及在消除每个时序限制后的前瞻性(forward-looking)性能结果。 |
| Hyper-Aware Design Flow | 通过 Hyper-Retiming、Hyper-Pipelining、Fast Forward 编译和 Hyper-Optimization,使 HyperFlex 架构 FPGA 达到最高性能的设计流程。 |
| Hyperflex FPGA Architecture | 在核心 fabric 中各处都包含了额外寄存器(称为 Hyper-Register)的器件核心架构。Hyper-Register 提供了更高的带宽和更好的面积与功耗效率。 |
| Hyper-Optimization | 通过实施 Fast Forward 编译所建议的关键 RTL 变更来提升设计性能的设计过程,例如将逻辑结构重构为功能等效的前馈(feed-forward)或预计算(pre-compute)路径,以替代长的组合反馈路径。 |
| Hyper-Pipelining | 通过在 ALM 寄存器之间的互连中增加额外的流水线级来消除长布线延迟的设计过程。该技术允许设计在更高的时钟频率下运行。 |
| Hyper-Retiming | 在 Fast Forward 编译期间,Hyper-Retiming 会先试探性地(speculatively)将信号从寄存器中移除,使网表具有可移动性(mobility),以便进行 retiming。 |
| Multiple Corner Timing Analysis | 对多个"时序角"(timing corner cases)进行分析,以验证设计在不同电压、工艺和温度条件下的工作状态。Fast-corner 分析假定最佳时序条件。 |
RTL 设计
本章介绍了在 HyperFlex 架构 FPGA 上达到最高时钟频率所需的 RTL 设计技术。HyperFlex 架构 FPGA 支持的时钟频率远高于前几代 FPGA。
避免 RTL 设计规则违规可以提高设计的可靠性、时序性能和逻辑利用率。Quartus Prime 软件包含 Design Assistant 设计规则检查工具,可帮助避免设计规则违规。这些规则包括专门针对 HyperFlex 架构 FPGA 设计的 Hyper-Retimer Readiness Rules(HRR),具体内容见 Design Assistant 设计规则检查章节。
高速设计方法
将设计迁移到 HyperFlex 架构需要应用高速设计的最佳实践,以获得最大收益并保持功能正确性。HyperFlex 架构 FPGA 的高速设计方法学要求设计对延迟不敏感(latency-insensitive),以支持额外的流水线级,并避免限制性能的环路。以下高速设计最佳实践对 HyperFlex FPGA 收益最大:
- 设定高速目标
- 实验与迭代
- 独立编译设计组件
- 优化设计子模块
- 避免广播信号
设定速度目标
为了获得最佳效率,速度目标应尽可能设定得高。HyperFlex 架构的 LUT 本质上一个微型 ROM,能够每秒进行十亿次查找。如果让这个 LUT 工作在 156 MHz,只用了其 15% 的容量。
在设定高速目标的同时,还需要在能够完成时序收敛的速度和实际系统所需速度之间保持足够的余量。从一开始就留有 margin 来处理时序收敛,要比后续再处理容易得多。
速度与时序收敛
时序收敛失败发生在电路实际性能低于设计 fMAX 要求时。如果目标 FPGA 器件有充足的可用资源用于逻辑布局,时序收敛会更容易,所需的处理时间也更少。
慢速电路的时序收敛并不比快速电路更容易,因为慢速电路通常在寄存器之间包含更多的组合逻辑。当一条路径包含很多节点时,Fitter 必须将节点放置在远离彼此的地方,导致显著的布线延迟。相比之下,深度流水线化的电路对布局的依赖要小得多,这简化了时序收敛。
在创建设计时使用合理的时序余量。当向系统中添加逻辑时,设计的各个部分可能会相互接触并干扰。给系统增加压力通常对速度不利。在设计初期留出足够的时序余量有助于缓解这个问题。
速度与延迟
表 3 展示了各种类型电路的面积随总线宽度增长的速率。各电路函数的面积复杂度用大 O 表示法标注,范围从亚线性(sub-linear)的 log(N) 到超线性(super-linear)的 N*N。
表 3:总线宽度对面积的影响
| 电路功能 | 复杂度 | 16 | 32 | 64 | 128 | 256 |
|---|---|---|---|---|---|---|
| log N | log N | 4 | 5 | 6 | 7 | 8 |
| Mux | N | 5 | 11 | 21 | 43 | 85 |
| ripple add | N | 16 | 32 | 64 | 128 | 256 |
| barrel shift | N*log N | 64 | 160 | 384 | 896 | 2048 |
| Crossbar | N*log N | 80 | 352 | 1344 | 5504 | 21760 |
| N*N | N*N | 256 | 1024 | 4096 | 16384 | 65536 |
通常,当总线宽度翻倍时,电路组件的面积增长超过 2 倍。对于像 mux 这样的简单电路,面积随总线宽度亚线性增长。将 mux 的总线宽度减半,面积收益略差于线性比例。ripple adder 的面积随总线宽度线性增长。
更复杂的电路,如 barrel shifter 和 crossbar,面积随总线宽度超线性增长。如果将 barrel shifter、crossbar 或其他复杂电路的总线宽度减半,面积收益可能显著优于一半,接近二次方比例。对于所有输入影响所有输出的电路,增加总线宽度会导致二次方增长。这意味着,如果利用速度提升来对半宽总线进行处理,所产生的设计面积将不到原来的一半。
在处理流式数据路径(streaming datapath)时,寄存器的数量可以作为流水线延迟的比特数近似值。将宽度减半,就有机会在不增加延迟的前提下将流水线级数翻倍。这种更高性能通常需要的额外寄存器数量远低于翻倍,从而产生"延迟收益"(latency profit)。
实验与迭代
如果设计性能最初未能达到要求,应尝试不同的设置和设计变更。Altera FPGA 的可重编程性允许通过实验来达到目标。随着技术需求随时间推移而增长,设计性能通常会变得不足。例如,将现有设计元素以更宽的参数化应用到新的环境中,速度性能很可能会下降。
在对电路时序进行实验时,不存在永久性风险——即使临时破坏电路来收集数据点也不会有问题。可以在功能上不合法的位置添加寄存器,以确定对整体时序的影响。如果测试电路达到了时序目标,就可以将精力放在设计布局规划上。
如果即使在大量插入寄存器后电路仍然太慢,可以重新考虑设计中更基础的部分。使用更高或更低的速度等级,或将电路压缩到 Logic Lock 区域中,都是研究性能的好方法。
独立编译组件
为了尽早识别和优化性能瓶颈,可以将设计的子组件作为独立实体进行编译。单独的组件编译允许在隔离环境中测试和优化组件,无需整个系统的运行时开销和复杂性。
为每个组件建立所需速度的余量。例如,当目标是 20% 的时序余量时,19.5% 余量的组件就是不合格的。时序余量目标应基于组件的上下文来设定。例如,对于一个占用芯片一半面积的高级别组件,可以允许 10% 的时序余量。但如果规则不够明确,余量就可能被侵蚀。
使用 Chip Planner 来可视化系统级视图。以下 Chip Planner 视图显示了一个组件占用了器件上 5% 的逻辑(中央橙色区域)和 25% 的 M20K 块(红色条纹)。
从 Chip Planner 系统视图来看,资源比例本身没什么问题。然而,明显的布线拥塞(routing congestion)是存在的。橙色区域的内存控制逻辑需要跨越很大的物理范围才能连接到所有内存块。该设计在单独工作时可以正常运作,但当无关的逻辑单元占据了中间的布线区域时,就会出现问题。重构这个模块,让控制逻辑在物理上分布得更均匀,能够缓解这个高层级的问题。
优化子模块
在设计优化过程中,可以将关键路径隔离到大型设计的一个或两个子模块中,然后单独编译这些子模块。编译部分设计可以缩短编译时间,并允许将精力集中在对关键部分的优化上。
避免广播信号
尽量避免使用广播信号。广播信号是高扇出的控制网络,会在路径之间产生很大的延迟差异。路径延迟差异使 Compiler 难以找到合适的寄存器位置,从而导致延迟路径不平衡。应使用流水线来解决这个问题,并复制寄存器来驱动广播信号。
广播信号需要传输很长的距离才能到达各个寄存器。由于那些扇出的寄存器可能在布局中分散在各处,应使用手动寄存器复制来改善布局。流水线阶段的正确放置对性能有显著影响。
在图 4 的"次优广播信号流水线"中,黄色框标出了为了帮助时序而在模块中插入的寄存器。该模块将输出广播到多个收发器通道。这些额外的寄存器可能不足以改善时序,因为最后一个寄存器级扇出到器件宽范围内的多个目的地。
图 5 的"最优广播信号流水线"展示了一个更好的方法:复制最后一个流水线寄存器,将每个副本放置在目标模块中(本例中是收发器通道)。这种方法可以实现更好的布局和时序。改进的原因是每个通道的流水线寄存器放置有助于缩短黄色模块中最后一个寄存器级与收发器中寄存器之间的距离。
除了复制最后一个流水线寄存器之外,还可以应用 dont_merge 综合属性,以防止这些复制出的寄存器在综合过程中被合并,否则会抵消所有收益。
Compiler 会在可能的情况下自动添加流水线级并将寄存器移入 Hyper-Register。也可以使用手动流水线来获得更好的布局结果。
Hyper-Retiming(促进寄存器移动)
Fitter 的 Retime 阶段可以通过 retiming(移动)的方式将 ALM 寄存器移入布线 fabric 中的 Hyper-Register,从而平衡寄存器链。Retime 阶段还通过将寄存器跨组合逻辑向前和向后移动来执行时序优化(sequential optimization)。通过平衡一组寄存器中每一级之间的传播延迟,retiming 缩短了关键路径,减小了时钟周期,提高了工作频率。
Retime 阶段在 Fitter 处理过程中运行,将寄存器移动到理想的 Hyper-Register 位置。这个 Hyper-Retiming 过程只需要很少的设计工作,就能带来 1.1~1.3x 的性能提升。
在图 6 的"跨 LUT 移动寄存器"中,左侧是 retiming 之前的寄存器位置,最差路径延迟为两级 LUT。右侧是 retiming 之后的寄存器位置,最差路径延迟缩减为一级 LUT。
当 Compiler 无法对一个寄存器进行 retiming 时,就构成了 retiming restriction。这类限制限制了设计的 fMAX。在设计的关键性能部分尽量减少 retiming restriction,才能达到最高性能。
