摘要:自三十多年前问世以来,现场可编程门阵列(FPGAs)已被广泛用于实现来自不同领域的无数应用。由于其底层的硬件可重新配置性,与定制设计的芯片相比,FPGAs具有更快的设计周期和更低的开发成本。FPGA架构的设计涉及许多不同的设计选择,从高级架构参数到晶体管级实现细节,目标是制造高度可编程的器件,同时最小化可重新配置的面积和性能成本。随着应用需求和工艺技术能力的不断发展,FPGA架构也必须适应。在这篇文章中,我们回顾了现代商用FPGA架构的不同关键组件的演变,并阐明了它们的主要设计原则和实现挑战。
01 简介
现场可编程门阵列(FPGAs)是可重构的计算机芯片,可以通过编程实现任何数字硬件电路。如图1所述,FPGAs由不同类型的可编程块(逻辑、输入输出和其他)组成的阵列,这些可编程块可以使用预制的布线通道与它们之间的可编程开关灵活地互连。所有FPGA块的功能和布线开关的配置使用数百万个静态随机存取存储器(SRAM)单元来控制,这些SRAM在工作时被编程(即写入)以实现特定功能。用户用硬件描述语言(HDL)如Verilog或VHDL描述所需的功能,或者可能使用高级综合将C或OpenCL翻译成HDL。然后,使用复杂的计算机辅助设计(CAD)流程将HDL设计编译成比特流文件,用于对FPGA的所有配置SRAM单元进行编程。
与构建定制专用集成电路(ASIC)相比,FPGAs的非重复性工程成本低得多,上市时间也短得多。预制的现成的FPGA可以用来在几周内实现一个完整的系统,跳过了定制ASIC通常要经历的物理设计、布局、制造和验证阶段。它们还允许持续的硬件升级,以支持新功能或通过在现场部署后简单地加载新比特流来修复错误,因此称为现场可编程。这使得FPGAs成为中小型设计的引人注目的解决方案,特别是在当今市场产品周期快的情况下。FPGAs的比特级可重新配置性使得能够实现每个应用所需的精确硬件(例如:数据路径位宽、流水线级、并行计算单元的数量、存储子系统等。)而不是通用处理器(CPUs)或图形处理单元(GPUs)的固定的单一尺寸结构。因此,通过实现无指令流硬件[1]或覆盖有应用定制流水线和指令集的处理器[2],它们可以实现比CPU或GPU更高的效率。
这些优势促使FPGAs在许多应用领域采用,包括无线通信、嵌入式信号处理、网络、ASIC原型、高频交易等[3]–[7]。它们最近也被大规模部署在数据中心,以加速搜索引擎、数据包处理[9]和机器学习[10]等工作负载。然而,与ASIC相比,FPGA硬件的灵活性带来了效率成本。库恩和罗斯[11]表明,仅使用FPGA的电路比相应的ASIC实现平均大35倍,慢4倍。最近的一项研究[12]表明,对于大量使用其他FPGA(如随机存取存储器和数字信号处理器)的全功能设计,这一面积差距有所缩小,但仍为9倍。FPGA设计师试图尽可能地缩小这种效率差距,同时保持可编程性,使FPGA在广泛的应用中非常有用。
在这篇文章中,我们介绍了FPGA的关键原理,并强调了这些器件在过去30年的发展。图1显示了FPGAs如何从简单的可编程逻辑阵列和输入输出模块发展到复杂的异构多芯片系统,包括嵌入式模块存储、数字信号处理(DSP)模块、处理器子系统、各种高性能外部接口、系统级互连等。首先,我们简要概述了用于评估新的FPGA架构思想的CAD流程和方法。然后,我们详细介绍了一个FPGA的每个关键组件的架构挑战和设计原则。我们重点介绍了过去三十年来在这些组件的设计和实施方面的关键创新,以及正在进行的研究领域。
图1:早期具有可编程逻辑和IOs的FPGA架构与现代具有RAMs、DSPs和其他硬模块的异构FPGA架构相比。所有模块都使用比特级可编程布线进行互连
02 FPGA架构评估
如图2所示,FPGA架构评估流程由三个主要组件组成:一套基准应用、一个架构模型和一个CAD系统。与为特定功能构建的ASIC不同,FPGA是为许多用例设计的通用平台,其中一些用例甚至可能在FPGA构建时不存在。因此,在实现代表关键FPGA市场和应用领域的各种基准设计时,将根据效率来评估FPGA架构。通常,每个FPGA供应商都有一套精心选择的基准设计,这些设计是从专有系统实现和各种客户应用中收集的。还有几个开源基准套件,如经典的MCNC20[13]、VTR[14]和Titan23[15]套件,这些在学术FPGA架构和CAD研究中是常用的。虽然早期的学术FPGA研究使用了MCNC设计套件,但这些电路现在太小(数千个逻辑原语)和太简单(只有输入输出和逻辑),无法代表现代FPGA用例。VTR,尤其是Titan套件更大、更复杂,使它们更具代表性,但随着FPGA容量和应用复杂性的不断增长,通常需要新的基准套件。
图2:FPGA架构评估流程
评估流程的第二部分是FPGA架构模型。FPGA的设计涉及来自架构级组织的许多不同决策(例如块的数量和类型、线段长度的分布、逻辑簇和逻辑元件的大小)到晶体管级电路实现(例如可编程开关类型、布线缓冲器晶体管大小、寄存器实现)。还涉及到不同的实现风格;逻辑块和可编程布线被设计和布局为全定制的电路,而大多数硬化的块(例如DSP)分别为模块内核和外设混合了标准单元和全定制设计。一些模块(存储、输入输出)甚至包括重要的模拟电路。所有这些不同的组件都需要仔细建模,以评估整个FPGA架构。除了从每个组件的电路级实现中获得的面积、时序和功率模型之外,这通常使用架构描述文件来获取,架构描述文件指定不同的FPGA块和布线架构的组织和类型。
最后,使用可重定位的CAD系统,如VTR [14],将选定的基准应用映射到指定的FPGA架构上。这种CAD系统由一系列复杂的优化算法组成,这些算法将写在HDL中的基准综合为电路网表,将其映射到不同的FPGA块,将映射的块放置在FPGA上的特定位置,并使用指定的可编程布线架构在它们之间布线连接。然后,我们用由CAD系统产生的实现来评估几个关键指标。总面积是应用使用的FPGA块的总面积,以及其中包含的可编程布线。时序分析器找到通过块和布线的关键路径,以确定应用时钟的最大频率。功耗是根据使用的资源和信号切换速率来估计的。FPGAs从来不是为一个应用设计的,所以这些指标在所有基准中是平均的。最后,根据架构目标(例如高性能或低功率)。其他指标,如CAD工具运行时间以及CAD工具未能在一个架构上布线一些基准也经常被考虑。
例如,FPGA架构中的一组关键问题是: 在FPGA架构中应该硬化什么功能(即作为新的ASIC风格的块实现)?这个块应该有多灵活?FPGA芯片面积应该有多少专用于它?理想情况下,FPGA架构师希望以尽可能低的硅成本为尽可能多的应用提供硬化功能。与仅在可编程结构中实现相比,能够利用硬模块的应用将受益于更小、更快和更节能。这促使在硬模块中有更多的可编程性来捕获更多的用例;然而,更高的灵活性通常以更大的面积和降低的硬模块效率为代价。另一方面,如果应用电路不能使用硬模块,则浪费其硅面积;FPGA用户宁愿在未使用的硬模块区域有更多可用的通用逻辑块。还必须考虑这种新的硬模块对可编程布线的影响——它需要更多的互连还是会导致进出该块的布线路径变慢?为了评估一个特定的功能是否应该被硬化,硬化的成本和收益必须使用本节描述的流程根据经验进行量化。FPGA架构师在找到正确的设计选择组合之前,可能会尝试许多想法,这些设计选择在正确的位置添加了正确的可编程性,使这种新的硬模块取得了最终的胜利。
在下一节中,我们将详细介绍FPGAs的许多不同组件以及每个组件的关键架构问题。虽然我们描述了关键结果,但没有详细说明用于发现它们的实验方法,一般来说,它们来自类似于图2中的整体架构评估流程。
03 FPGA架构演进
>3.1 可编程序逻辑
最早的可重构计算器件是可编程逻辑(PAL)架构。如图3所示,PALs由一个“与”门阵列和另一个“或”门阵列组成,并且可以将布尔逻辑表达式实现为两级积和函数。PALs通过可编程开关实现可配置性,可编程开关选择每个与/或门的输入来实现不同的布尔表达式。因为无论实现什么逻辑功能,通过器件的延迟都是不变的,所以用于器件的设计工具非常简单。但是,PALs的扩展性不好;随着器件逻辑容量的增加,形成与/或阵列的导线变得越来越长、越来越慢,所需的可编程开关数量也呈二次增长。
图3:可编程阵列逻辑(PAL)架构,带有一个“与”阵列,馈入到“或”阵列。叉是可重新配置的开关,用于将任何布尔表达式编程为两级的积和函数
随后,复杂可编程逻辑器件(CPLDs)保留了与/或阵列作为基本逻辑元件,但试图以更复杂的设计工具为代价,通过在同一芯片上集成多个具有交叉互连的PALs来解决可扩展性挑战。不久之后,Xilinx在1984年首创了第一个基于查找表的(基于LUT的)FPGA,它由一系列基于SRAM的LUTs组成,它们之间有可编程的互连。这种类型的可重构器件显示出很好的可扩展性,与PALs和CPLDs中的与/或逻辑相比,LUTs实现了更高的面积效率。因此,基于LUT的架构变得越来越占优势,今天LUTs构成了所有商用FPGAs的基本逻辑元件。几项研究[16]–[18]尝试研究了用不同形式的可配置与门来替换LUTs:一种具有可编程输出/输入反转的与门的完整二进制树,称为与-反相器锥(AIC)。然而,当在[19]中进行全面评估时,基于AIC的FPGA架构比基于LUT架构面积大得多,延迟增益仅在关键路径较短小的基准上。
K-LUT可以通过在配置SRAM单元中存储真值表来实现任何K输入布尔函数。K个输入信号被用作多路复用器选择线,从真值表的个值中选择一个输出。图4(a)展示出了使用传输晶体管逻辑的4-LUT的晶体管级电路实现。除了输出缓冲器之外,还有一个内部缓冲级(如图4(a)中LUT的第二级和第三级之间所示),通常是为了减小当通过一串传输晶体管时的二次增加延迟而实现的。LUT的传输晶体管和内部/输出缓冲器的尺寸经过精心调整,以实现最佳的面积延迟积。经典的FPGA文献[20]将基本逻辑元件(BLE)定义为与输出寄存器耦合并旁路2:1多路复用器的K-LUT,如图4(c)所示。因此,一个BLE既可以实现一个触发器(FF),也可以实现一个带有寄存或未寄存输出的LUT触发器.如图4(d)所示,BLEs通常在逻辑块(LBs)中聚合,使得LBs包含N个BLEs以及局部互连。逻辑块中的局部互连由信号源(BLE输出和逻辑块输入)和目的地(BLE输入)之间的多路复用器组成。这些多路复用器通常被安排成形成局部完全交叉开关[21]或部分交叉开关[22]。在电路级,这些多路复用器通常由两级传输晶体管构成,后面是一个两级缓冲器,如图4(b)所示;在大多数情况下,这是FPGA多路复用器最有效的电路设计[23]。图4(d)还示出了形成可编程布线的开关和连接块多路复用器,其允许逻辑块相互连接;第三章第二节详细讨论了这种布线。
图4:(a) 在第二和第三LUT级之间具有内部缓冲器的4-LUT晶体管级实现(b) 两级多路复用器电路(c)基本逻辑单元(BLE)和(d)逻辑块内部结构
多年来,随着器件逻辑容量的增长,LUTs(K)和LBs (N)的大小逐渐增加。随着K的增加,更多的功能可以封装到单个LUT中,不仅减少了所需的LUTs数量,而且减少了关键路径上的逻辑级数量,从而提高了性能。此外,随着越来越多的连接通过增加N而被捕获到快速局部互连中,对LB间布线的需求减少。另一方面,LUT的面积随K成指数增长(由于2的k次方SRAM单元),其速度线性下降(因为多路复用器构成了具有周期性缓冲的K个传输晶体管的链)。如果LB局部互连实现为交叉开关,其大小会呈四次方增长,速度会随着LB中的BLEs数量呈线性下降。Ahmed和Rose[24]根据经验评估了这些权衡,并得出结论,4-6尺寸的LUT和3-10尺寸的BLEs为FPGA架构提供了最佳的面积延迟积,4-LUTs导致更好的面积,但6-LUTs产生更高的速度。历史上,Xilinx的第一个基于LUT的FPGA,1984年的XC2000系列,有一个只包含两个3-LUTs的LB(即N = 2,K = 3)。LB尺寸随着时间的推移逐渐增加,到1999年,Xilinx的Virtex系列包括四个4-LUTs,Altera的Apex 20K系列包括每个LB中的十个4-LUTs。
架构的下一个重大变化来自2003年的Altera,在他们的Stratix II架构中引入了可分割的LUT[25]。Ahmed和Rose在[24]中表明,10个6-LUTs的LB比10个4-LUTs的LB性能高14%,但面积高17%。可分割LUTs试图结合两者的优点,实现更大LUTs的性能和更小LUTs的面积效率。传统6-LUTs面积增加的一个主要因素是利用率低。Lewis et al.发现64%的嵌入式应用中的LUTs使用少于6个输入,浪费了一些6-LUT的功能[26]。一个可分割的{K,M}-LUT可以配置为一个大小为K的单个LUT,也可以分割为两个大小不超过K–1的LUTs,这些LUTs共同使用不超过K + M个不同的输入。图5(a)显示6-LUT内部由两个5-LUTs和一个2:1多路复用器组成。因此,几乎不需要任何电路(只有红色的附加输出)来允许6-LUTs作为共享相同输入的两个5-LUTs工作。然而,要求两个5-LUTs共享它们的所有输入将限制两者同时使用的频率。添加额外的布线端口,如图5(b),增加了可分割的6-LUT的面积,但更容易找到两个可以组合在一起的逻辑功能。Stratix II架构中的自适应逻辑模块(ALM)实现了一个{6,2}-LUT,它有8个输入和2个输出端口。因此,一个ALM可以实现y一个6-LUT或两个5-LUTs共享2个输入(因此总共有8个不同的输入)。成对的较小LUTs也可以在没有任何共享输入的情况下实现,例如两个4LUTs或一个5-LUT和一个3-LUT。利用可分割的6-LUT,在6-LUTs中实现了更大的逻辑功能,降低了关键路径上的逻辑级,实现了性能改进。另一方面,较小的逻辑功能可以打包在一起(每个只使用半个ALM),提高了面积效率。与基准的基于4 LUT的LB相比,LBin Stratix II不仅性能提高了15%,而且逻辑和布线面积也减少了2.6%。
图5: 6-LUT可分为两个5-查找表,其中(a)没有额外的输入端口,导致5个共享输入(A-E)或(b)两个额外的输入端口和转向多路复用器,导致只有2个共享输入(C,D)
Xilinx后来在其Virtex-5架构中采用了相关的可分割LUT方法。像Stratix II一样,Virtex-5 6-LUT可以分解成两个5-LUT。然而,Xilinx选择最小化增加的额外电路,以提高分割性,如图5(a)所示。——不添加额外的输入布线端口或转向多路复用器。这导致每个可分割LUT的面积更小,但是由于它们必须使用不超过5个不同的输入,所以将两个更小的LUTs打包在一起更加困难[27]。虽然Altera/Intel和Xilinx的后续架构也是基于可分割的6-LUTs,但最近的一项Microsemi研究[28]重新审视了4-LUT与6-LUT之间的效率权衡,该权衡针对的是比之前使用的更新的工艺技术、计算机辅助设计工具和设计。它表明,一个具有两个紧密耦合的4路LUTs的LUTs结构,一个馈送另一个,可以获得接近普通6-LUTs的性能,同时具有4路LUTs的面积和功率优势。就LB尺寸而言,Altera/Intel和Xilinx的FPGA架构在几代的时间里分别使用了10个和8个BLEs的相对较大的LB。然而,Xilinx最近宣布的Versal架构进一步将每个LB中的BLEs的数量增加到32[29]。这种大幅增长的原因有两个方面。首先,LB之间的线路延迟随着工艺的缩小而缩小,因此在LB的局部布线中捕获更多的连接越来越有利。其次,越来越大的FPGA设计往往会增加CAD工具的运行时间,但更大的LBs可以通过简化布局和LB间布线来帮助缓解这一趋势。
另一个重要的架构选择是每个BLE的FFs数量。早期的FPGA将一个(不可分割的)LUT与一个FPGA连接起来,如图4(c)所示。当他们转移到可分割的LUTs时,Altera/Intel和Xilinx架构都给每个BLE增加了第二个LUTs,这样就可以将分割后的LUT的两个输出都寄存,如图5(a)和5(b)所示。在Stratix V架构中,随着设计变得更加深入流水线化以实现更高的性能,每个BLE的FFs数量进一步从2个增加到4个,以适应对FFs不断增长的需求[30]。低成本多路复用电路允许在LUTs和FFs之间共享现有的输入,以避免增加更昂贵的布线端口。Stratix V将FFs实现为脉冲锁存器,而不是边沿触发的FFs。如图6(b)所示,这移除了主从锁存中的两个锁存器中的一个(图6(a)),减少寄存器延迟和面积。一个脉冲锁存器充当一个更便宜的FF,它的保持时间更长,因为它在非常短的脉冲期间而不是像传统的FF那样在时钟沿锁存数据输入。如果为每个FF建造一个脉冲发生器,每个FF的总面积将增加而不是减少。相反,Stratix V每个LB只包含两个可配置的脉冲发生器;LB中的40个脉冲锁存器中的每一个都选择哪个发生器提供它的脉冲输入。FPGA的CAD工具还可以对这些发生器的脉冲宽度进行编程,允许在源寄存器和目的寄存器之间借用有限的时间。更长的脉冲会进一步降低保持时间,但通常任何违反保持时间的情况都可以通过使用更长的布线路径来延迟信号的FPGA布线算法来解决。在Ultrascale+架构中,Xilinx还使用脉冲锁存器作为其FFs[31]。
图6:用于(a)主从正边沿触发触发器和(b)脉冲锁存器的电路
算术运算(加法和减法)在FPGA设计中非常常见: Murray等人.发现在一套FPGA设计中,22%的逻辑元件都在实现算法[32]。虽然这些操作可以用LUTs来实现,但行波进位加法器中的每个算术位都需要两个LUTs(一个用于求和输出,一个用于进位)。这导致了高逻辑利用率和缓慢的关键路径,因为串联的任何LUTs都要计算多位加法的进位.因此,所有现代的FPGA架构都在其逻辑块中包含了硬件算术电路。变体很多,但都有几个共同点。首先,为了避免增加昂贵的布线端口,算术电路重复使用LUT布线端口或由LUT输出馈送。其次,进位位在特殊的专用互连上传播,几乎没有或根本没有可编程性,因此关键的进位路径是快速的。最低成本的算术电路硬化了行波进位结构,并在LUTs上实现了较大的速度增益(在[32]中,32位加法器的速度增益为3.4)。硬化更复杂的结构,如进位跳跃加法器,进一步提高了速度(在[33]中,32位时速度增加了20%)。Xilinx的最新Versal架构硬化了8位超前进位加法器的进位逻辑(即加法只能从每八个BLE开始),而求和、传播和产生逻辑都是在可分割的6-LUTs中实现的,这些LUTs提供进位逻辑,如图7(a)所示[29]。这种组织允许每个逻辑元件实现1位算术。另一方面,最新的Intel Agilex架构可以为每个逻辑元件实现2位算术,逻辑元件之间的进位具有专用的互连,如图所示7(b)。它通过硬化2位进位跳跃加法器来实现这一点,该加法器由包含在6-LUT[34]中的4个4位LUTs馈送。Murray等人的研究[32]表明,与不可分割LUTs或每个逻辑元件一位算术的架构相比,可分割LUTs和两位算术的组合(类似于Altera/Intel FPGAs中采用的)特别有效。它还得出结论,在FPGA逻辑元件中专用的算术电路(即硬化加法器和进位链)分别将算术微基准电路和通用基准电路的平均性能提高了75%和15%。
图7:(a) Xilinx和(b) Altera/Intel FPGAs逻辑元件中的硬算术电路概述(红色)。A[i]和B[i]是两个加法操作数A和B的第i位。Xilinx LEs在查找表中计算进位传播和产生,而Altera/Intel使用查找表将输入传递给硬加法器。实现加法器时,未标记的输入未被使用
最近,深度学习(DL)已经成为许多终端用户应用的关键工作负载,其核心操作是乘加(MAC)。一般来说,MAC可以在数字信号处理器模块中实现,这将在第三章第五节中描述;然而,具有8位或更窄操作数的低精度MAC(在数字逻辑工作负载中变得越来越普遍)也可以在可编程逻辑中有效地实现[9]。LUTs用于生成乘法器阵列的部分积,然后是加法器树,以减少部分积并执行累加。因此,最近的多项研究[35]–[37]研究了如何增加FPGA逻辑结构中硬化加法器的密度,以提高其在实现算术繁重的应用(如DL加速)时的性能。[36]和[37]中的工作提出了多种不同的逻辑块架构,每个逻辑单元包含4位算术运算,排列在一个或两个具有不同配置的进位链中,而不是在类似Intel Stratix ALM中只有的2位算术运算。由于乘法器阵列中的高度输入共享,这些方案在实现乘法时不需要增加逻辑簇中的(相对昂贵的)布线端口的数量(即,对于N位乘法器,仅需要2N个输入来生成N平方部分积)。这些提议中最有希望的一个将MAC操作的密度提高了1.7倍,同时提高了速度。它还将一般基准测试所需的逻辑和布线面积减少了8%,突出了更多的算法密度对除了DL以外的应用是有益的。
>3.2 可编程布线
可编程布线通常占应用的结构面积和关键路径延迟的50%以上[38],因此其效率至关重要。可编程布线由预制接线段和可编程开关组成。通过将适当的开关序列编程为接通,任何功能块输出都可以连接到任何输入。FPGA布线架构主要有两类。分层次的FPGAs的灵感来源于这样一个事实,即设计本质上是分层的:高级模块实例化低级模块,并在它们之间连接信号。在设计层次中,相互靠近的模块之间的通信更加频繁,层次化的FPGA可以通过连接芯片小区域的短线来实现这些连接。如图8所示,为了与层次化的FPGA的更远的区域进行通信,一个连接(用红色突出显示)在穿过互连层次的不同级时通过多条线路和开关。这种风格的架构在许多早期的FPGAs中很受欢迎,如Altera的7K和Apex20K系列,但它会导致互连层次结构上层的线路非常长,随着工艺长度的缩减,这种导线的电阻越来越大,这就成了问题。严格的分层布线架构还会导致一些块在物理上靠得很近(例如图8中的蓝色块)仍然需要几根线和开关来连接。因此,它现在主要用于较小的FPGA,例如可以嵌入大型SoC设计中的FlexLogix FPGA IP核[39]。
图8:在层次化FPGAs中的布线架构
另一种类型的FPGA互连是岛式的,如图9所示。该架构由Xilinx首创,其灵感来源于这样一个事实,即水平和垂直定向线段的规则二维布局可以有效地布局。如图9所示,岛式布线包括三个部分:布线线段、将功能块输入连接到布线的连接块(多路复用器)和将布线连接在一起以实现更长布线的开关块(可编程开关).FPGA CAD工具中的布局引擎选择哪个功能块实现设计的每个元件,以最小化所需的布线。因此,大多数功能块之间的连接跨越很小的距离,并且可以用一些布线来实现,如图9中的红色连接所示。
图9:岛式布线架构。粗实线是走线,而虚线是可编程开关。连接块和开关块分别用黄色和绿色阴影表示
创建一个好的布线架构需要管理复杂的权衡。它应该包含足够多的可编程开关和线段,以使绝大多数电路都能实现;然而,过多的电线和开关浪费了面积。布线架构也应符合应用的需要:理想情况下,短连接将使用短导线,以最小化电容和版图面积,而长连接可以使用较长的布线段,以避免通过许多布线开关的额外延迟。一些布线架构参数包括:每个逻辑块输入或输出可以连接多少条布线线(Fc),每条布线线可以连接多少条其他布线线(Fs),布线线段的长度,布线开关模式,线路和开关本身的电气设计,以及每个通道的布线线数量[20]。例如在图9,Fc = 3,Fs = 3,通道宽度为4条导线,一些布线长度为1,而其他布线长度为2.针对目标应用和特定流程节点,全面评估这些权衡需要使用完整的CAD流程进行实验,详见第二节。
早期的岛式架构只包含了可编程开关之间穿过单个逻辑块的短线。后来的研究表明,这导致可编程开关比需要的多,并且在终止前使所有布线段跨越四个逻辑块将应用延迟减少40%,布线面积减少25% [40]。现代架构包括多种长度的接线段,以更好地满足短连接和长连接的需要,但最丰富的接线段仍然是中等长度,四个逻辑块是一种流行的选择。较长距离的连接可以使用较长的电线段来实现较低的延迟,但是在最近的工艺节点,跨越许多(例如16)逻辑模块必须在上部金属层上使用宽而厚的金属走线,以获得可接受的电阻[41]。这种长距离布线可以包含在金属叠层中的数量是有限的。为了更好地利用这种稀缺的布线,Intel的Stratix FPGAs允许长线段仅连接到短线段,而不是功能块输入或输出[42]。这在岛式的FPGA中创建了一种布线层次结构,其中短连接只使用较短的导线,而较长的连接通过短导线到达长导线网络。在岛式FPGA中使用层次化FPGA概念的另一个领域是逻辑块。如图4(d)所示,大多数逻辑块现在将多个BLEs与局部布线组合在一起。这意味着每个逻辑块都是层次化FPGA中的一个小簇;岛式布线连接成千上万个逻辑簇。
关于开关的最佳数量以及如何最好地安排开关,已经有了大量的研究。虽然有许多详细的选择,但还是出现了一些原则。首先,功能块引脚和导线(Fc)之间的连接性可能相对较低:通常只有10%或更少的导线经过引脚时会有开关与之连接。类似地,布线线路在其末端(Fs)可以连接的其他线路的数量也可以很少,但是它应该至少为3,以便信号可以在线路端点向左、向右或向右转向。逻辑簇中的局部布线(在第三章中第一节描述)允许在布线过程中交换一些块输入和一些块输出。通过利用这种额外的灵活性,并考虑多级可编程布线网络提供的所有选项,布线CAD工具即使在Fc和Fs值较低的情况下也可以实现较高的完成率。为CAD工具提供更多选项的开关模式也有助于布线;例如,Wilton开关模式确保遵循不同的通道序列,让布线器到达目的块附近的不同线段[43]。
可编程开关的电气设计也有多种选择,如图10。早期的FPGA使用由SRAM单元控制的传输门晶体管来连接导线。虽然这是传统CMOS工艺中可能的最小开关,但通过晶体管串联的走线延迟呈二次方增长,这使得它们对于大面积FPGA来说非常慢。添加一些三态缓冲开关会增加面积,但会提高速度[40]。如图4(b)所示,最近的FPGAs主要使用由传输门构建的多路复用器,其后是不能三态化的缓冲器。这种直接驱动开关中的传输晶体管可以很小,因为它们的负载很轻,而缓冲器可以更大,以驱动布线线段周围的大电容。这种直接驱动开关对开关模式产生了一个主要的限制:一根导线只能在一个点上被驱动,因此只有功能块输出和该点附近的布线导线才能馈送到布线多路复用器的输入,因此可能是信号源。尽管有这种限制,学术界和工业界都认为直接驱动开关由于其优越的电气特性而提高了面积和速度[42],[44]。例外情况是昂贵或稀有的导线,如在上层金属层的宽金属迹线上实现的长导线或第三章第七节中讨论的跨中介层导线。这些线路通常有多个三态缓冲器来驱动它们,因为这些较大的可编程开关的成本值得允许更灵活地使用这些昂贵的线路。
图10: SRAM控制的可编程开关的不同实现,使用传输晶体管(左)、三态缓冲器(中)或缓冲多路复用器(右)。
FPGA布线的一个主要挑战是,长导线的延迟没有随着工艺尺寸的缩小而改善,这意味着即使时钟频率上升,穿过芯片的延迟也会停滞或增加。这使得FPGA应用开发人员增加了他们设计中的流水线数量,从而允许长布线有多个时钟周期。为了使这种策略更加有效,一些FPGA制造商已经将寄存器集成到布线网络本身中。Intel的Stratix10器件允许每个布线驱动器(即多路复用器后接一个缓冲器)被配置为脉冲锁存器,如6(b)所示,从而充当延迟低但保持时间相对较差的寄存器。这允许在不使用昂贵的逻辑资源的情况下进行互连的深度管道化,代价是适度的面积和布线驱动器的延迟增加[45]。保持时间问题意味着在直接连续的Stratix布线开关中使用脉冲锁存器是不可能的,因此Intel在其下一代Agilex器件中改进了这种方法,只在三分之一的互连驱动器(以降低面积成本)上集成了当前的寄存器(保持时间更短)[34]。Xilinx的Versal器件不是通过互连集成寄存器,而是只在功能块的输入端添加旁路寄存器。与Intel的互连寄存器不同,这些输入寄存器功能齐全,具有时钟使能和清除信号[46]。
>3.3 可编程输入输出
FPGA包括独特的可编程IO结构,使它们能够与各种各样的其他器件通信,使FPGA成为许多系统的通信基础。对于一组物理接口来说,有计划地支持许多不同的IO接口和标准是一项挑战,因为它需要适应不同的电平、电气特性、时序规范和命令协议。可编程IO的价值和挑战都因FPGAs上用于IO的大面积空间而凸显出来。例如,Altera的Stratix II (90纳米)器件支持28种不同的IO标准,并将其20%(最大器件)至48%(最小器件)的芯片面积用于与IO相关的结构。
如图11所示,FPGAs采用多种方法[47]–[49]来应对这一挑战。首先,FPGA使用可以在一定电压范围内工作的IO缓冲器。这些IO被分组到组(bank)中(通常每个组大约50个IO),其中每个组都有一个单独的IO缓冲器线路。这允许不同的组工作不同的电压电平;例如一组的IO可以在1.8 V下工作,而另一组的IO可以在1.2 V下工作。第二,每个IO可以单独用于单端标准,或者成对的IO可以编程形成差分IO标准的正负线。第三,IO缓冲器由多个并行的上拉和下拉晶体管实现,因此它们的驱动强度可以通过启用或禁用不同数量的上拉/下拉晶体管来进行编程调整。通过将一些上拉或下拉晶体管编程为使能,即使没有输出被驱动,也可以将FPGA IOs编程为实现不同的片内端接电阻,以最小化信号反射。可编程延迟链提供了第四级可配置性,允许对进出IO缓冲器的信号时序进行精细的延迟调整。
除了电气和时序可编程性之外,FPGA IO模块还包含额外的硬化数字电路,以简化IO数据的捕获和传输。一般来说,SRAM控制的多路复用器可以旁路部分或全部这种硬化电路,允许FPGA用户选择给定设计和IO协议所需的硬化功能。图11第5部分显示了IO路径上的一些常见数字逻辑选项:捕获寄存器、双数据速率至单数据速率转换寄存器(与DDR存储器一起使用)和串行至并行转换器,允许以较低频率传输到结构。大多数FPGA现在还包含可旁路的高级块,这些块连接到一组IOs,并实现更高级别的协议,如DDR存储控制器。这些方法结合在一起,使通用FPGA的IO能够以高达3.2Gb/s的速度服务于许多不同的协议。
最高速度的IOs实现串行协议,如PCIe和以太网,将时钟嵌入数据转换,可以28 Gb/s或更高的速度工作。为了实现这些速度,FPGAs包括一组单独的差分IO,具有更低的电压和电气可编程性;它们只能用作串行收发器[50]。就像通用IOs一样,这些串行IOs在它们和结构之间有一系列高速硬化电路,其中一些可以选择旁路,以允许最终用户定制确切的接口协议。
总的来说,FPGA的IO设计非常具有挑战性,因为人们不仅需要快速IO,还需要可编程IO。此外,从IO接口分配非常高的数据带宽需要在结构中使用宽的软总线,这带来了额外的挑战,如第三章第六节所述。
图11:在FPGAs上实现可编程IOs的不同技术概述
>3.4 片上存储器
FPGA架构中第一种形式的片上存储元件是集成在FPGA逻辑块中的FFs,如第三章第一节所述。然而,随着FPGA逻辑容量的增长,它们被用来实现更大的系统,这些系统几乎总是需要存储来缓冲和重用芯片上的数据,因此非常需要更密集的片上存储,因为用寄存器和LUTs构建大RAM比(ASIC的)SRAM块密度低100多倍。与此同时,在FPGA上实现的应用的存储需求非常多样,包括(但不限于)用于FIR滤波器的小系数存储RAM、用于网络数据包的大缓冲区、用于类似处理器的模块的缓存和寄存器文件、用于指令的只读存储以及用于解耦计算模块的数百万个FIFO。这意味着在FPGA设计中没有普遍使用的单一RAM配置(容量、字宽、端口数量),这使得决定哪(些)种RAM块应该添加到FPGA中以使它们在广泛的应用中高效变得具有挑战性。第一个包含存储硬功能块的FPGA(块RAMs或BRAMs)是1995年的Altera Flex 10k[51]。它包括通过可编程布线连接到结构其余部分的小型(2kb)BRAM列。FPGA已经逐渐集成了更大、更多样的BRAM,典型的情况是,现代FPGA的大约25%的面积专用于BRAM[52]。
一个FPGA BRAM由一个基于SRAM的存储器组成,带有额外的外围电路,使它们更容易配置为多种用途,并将其连接到可编程布线。一个基于SRAM的BRAM通常是如图12所示。它由存储位的SRAM单元的二维阵列和大量外围电路组成,这些外围电路协调对这些单元的访问以进行读/写操作。为了简化读和写操作的时序,所有现代的FPGA BRAM都寄存了它们的所有输入。在写操作期间,列译码器激活写驱动器,写驱动器又根据要写入存储单元的输入数据对位线(BL和)充电。同时,行译码器激活由输入写地址指定的行的字线,将一行单元连接到它们的位线,以便它们被新数据覆盖。在读操作期间,BL和都被预充电到高电平,然后行译码器激活由输入读地址指定的行的字线。激活单元的内容导致BL和之间的电压略有差异,这种差异被感知放大器电路感知和放大,以产生输出数据[52]。
图12:一个传统的基于双端口SRAM的FPGA BRAM的组织和电路。以蓝色突出显示的组件在任何基于SRAM的存储模块中都很常见,而以绿色突出显示的组件是特定于FPGA的。该BRAM最大数据宽度为8位,但输出交叉开关配置为4位输出模式
设计FPGA BRAMs的主要架构决策是选择它们的容量、数据字宽度和读/写端口数量。更强大的BRAMs需要更多的硅面积,因此架构师必须仔细平衡BRAM设计选择,同时考虑应用电路中最常见的用例。SRAM单元占据的面积随BRAM电容线性增长,但外围电路的面积和布线端口的数量呈次线性增长。这意味着更大的BRAM具有更低的每比特面积,使得更大的片上缓冲更有效。另一方面,如果一个应用只需要很小的RAM,那么一个更大的BRAM的大部分容量可能会被浪费掉。同样,具有较大数据宽度的BRAM可以为下游逻辑提供更高的数据带宽。然而,它比同样容量但字宽更小的BRAM占用更多的面积,因为更大的数据字宽需要更多的灵敏放大器、写驱动器和可编程布线端口。最后,增加一个BRAM的读/写端口的数量会增加SRAM单元和外围电路的面积,但也会增加BRAM能够提供的数据带宽,并允许更多样的用途。例如,FIFO(在FPGA设计中普遍存在)需要一个读端口和一个写端口。双端口SRAM单元的实现细节显示在图12的底部。为SRAM单元实现第二个端口(端口B用红色突出显示)增加了两个晶体管,使SRAM单元的面积增加了33%。此外,第二个端口还需要一个额外的灵敏放大器、写驱动器和行译码器的复制(图12中的“读/写电路B”和“行译码器B”块)。如果两个端口都是读/写(r/w),我们还必须将可编程布线的端口数量增加一倍。
因为FPGA片上存储器必须满足在该FPGA上实现的每个应用的需求,所以向BRAM添加额外的可配置性以允许它们适应应用需求也是常见的[53],[54]。通过在存储器阵列的外围增加低成本多路复用电路,FPGA BRAMs被设计成具有可配置的宽度和深度。例如,在图12中,实际的SRAM阵列被实现为4×8位阵列,这意味着它自然存储8位数据字。通过在输出交叉开关上添加由3个地址位控制的多路复用器,并在其上的读/写电路上添加额外的解码和使能逻辑,该RAM还可以在8×4位、16×2位或32×1位模式下工作。宽度可配置译码器(WCnfg Dec.)在Vdd和地址位之间选择,如图12左上角所示,表示最大8位字节大小。多路复用器使用配置SRAM单元进行编程,并用于产生列选择(CS)和写使能(Wen)信号,分别控制灵敏放大器和写驱动器进行局部读和写操作。对于典型的BRAM大小(几kb或更多),这种额外宽度可配置电路的成本与传统SRAM阵列的成本相比很小,并且不需要任何额外的布线端口。
与传统存储块相比,FPGA的另一个独特组件是它们与可编程布线结构的接口。该接口一般被设计成类似于第三章第一节中描述的逻辑块;如果所有块类型都以类似的方式连接,那么创建一个平衡灵活性和成本的布线架构会更容易。连接块多路复用器,随后是某些FPGA中的局部交叉开关,形成BRAM输入布线端口,而其读输出驱动开关块多路复用器形成输出布线端口。这些布线接口的成本很高,尤其是对于小型BRAMs;它们分别占256Kb至8Kb的BRAM面积的5%至35%[55]。这促使尽可能减少通往BRAM的布线端口数量,同时又不影响其功能。表1总结了不同数量和类型的BRAM读写端口所需的布线端口数。例如,一个单端口BRAM (1r/w)需要W+log2(D)个输入端口用于写入数据和读/写地址,以及W个输出端口用于读取数据,其中W和D分别是最大的字宽和BRAM深度。该表显示,与简单的双端口(1r+1w)BRAM相比,真双端口(2r/w) BRAM多需要2W的端口,这显著增加了布线接口的成本。虽然真双端口存储适用于寄存器文件、缓存和共享存储开关,但FPGA上多端口RAM最常见的用途是用于FIFOs,它只需要一个读端口和一个写端口(1r+1w,而不是2r/w端口)。因此,FPGA BRAMs通常具有真双端口SRAM核,但在SRAM核(W)支持的全宽度下,只有足够的布线接口用于简单双端口模式,并将真正双端口模式的宽度限制为最大宽度的一半(W/2)。
表1:不同数量和类型的BRAM读/写端口所需的布线端口数(W:数据宽度,D:BRAM深度)
另一种降低额外BRAM成本的方法是多泵(multi-pump)存储块(即以设计逻辑其余部分所用频率的倍数运行BRAM)。通过这样做,物理上的单端口SRAM阵列可以实现逻辑上的多端口BRAM,而不需要增加额外的端口,正如在Tabula的时空架构中那样[56]。通过在软结构中建立时分多路复用逻辑,多泵也可以与传统的FPGA BRAM一起使用;然而,这导致了对时分多路复用逻辑的激进的时序约束,这可能使时序更加困难并增加编译时间。Altera在2000年代早期在其Mercury器件中引入了四端口BRAMs,以提高共享存储开关(用于数据包处理)和寄存器文件的效率[57]。然而,这一特性增加了BRAM的尺寸,并没有在后续的FPGA代中充分地用于证明它的内容。相反,设计人员使用各种技术将双端口FPGA BRAM和软件逻辑结合起来,在需要时制造高度移植的结构,尽管效率较低[58],[59]。我们请感兴趣的读者参考[52]和[55],了解BRAM核和外围电路设计的更多细节。
除了构建存储之外,FPGA供应商还可以添加电路,使设计人员能够将构成逻辑结构的LUTs重新调整为额外的存储块。逻辑块K-LUT中的真值表是2的k次方×1位只读存储器;当设计比特流被加载时,它们由配置电路写入一次。由于LUTs已经有了读电路(根据一个K位输入/地址读出一个存储值),只要增加设计者控制的写电路,它们就可以用作小型分布式基于LUT的RAM(LUT-RAMs)。然而,一个主要的问题是实现写功能所需的额外布线端口的数量,以便将LUT更改为LUT-RAM。例如,在最近的Altera/Intel架构中,ALM是一个6-LUT,它可以分为两个5-LUTs,有8个输入布线端口,如第三章第一节所述。这意味着它可以运行一个64×1位或32×2位的存储器,分别有6位或5位的读地址。这仅留下2或3个未使用的布线端口,如果我们想要在每个周期中读写(简单双端口模式),这对于写地址、数据和写使能(总共8个信号)是不够的,这是FPGA设计中最常用的RAM模式。为了克服这个问题,一个10ALM的完整逻辑块被配置为一个LUT-RAM,以缓冲控制电路和10ALM的地址位。写地址和写使能是通过从每个ALM中一个未使用的布线端口带来一个信号,并将结果地址和使能广播给所有ALM来组装的[60]。因此,一个逻辑块可以实现64×10位或32×20位的简单双端口RAM,但有一个限制,即单个逻辑块不能混合逻辑和LUT-RAM。Xilinx Ultrascale类似地将整个逻辑块转换为LUT-RAM,但是逻辑块中八个LUTs中的一个的所有布线端口都被重新用于驱动(广播)写地址和使能信号。因此,Xilinx逻辑块可以实现64×7位或32×14位简单双端口RAM,或稍宽的单端口存储(64×8位或32 ×16位)。避免额外的布线端口可以降低LUT-RAM的成本,但仍会增加一些面积。由于将50%以上的逻辑结构转换为LUT-RAM的设计非常罕见,Altera/Intel和Xilinx都选择在其最新的架构中仅使用一半的逻辑块LUT-RAM,从而进一步降低了面积成本。
在一个典型的设计中,设计者需要许多不同的RAM,所有这些都必须由芯片上的固定BRAM和LUT-RAM资源来实现。迫使设计人员为他们需要的每种存储配置确定组合BRAM和LUT-RAM的最佳方式,并编写verilog来实现它们将是非常困难的,而且还会将设计与特定的FPGA架构联系起来。相反,供应商的CAD工具包括一个RAM映射阶段,该阶段使用物理BRAM和芯片上的LUT-RAM在用户的设计中实现逻辑存储。存储映射器选择物理存储实现(即存储类型及其端口的宽度/数量/类型),并生成组合多个BRAM或LUT-RAM以实现每个逻辑存储所需的任何额外逻辑。图13给出了一个将具有2个读端口和1个写端口的逻辑2048×32位RAM映射到具有物理1024×8位双端口RAM的FPGA的示例。首先,四个物理存储并行组合在一起,形成更宽的存储,没有额外的逻辑。然后,使用软逻辑资源来执行两组四个物理BRAM的深度匹配,使得写和读地址的最高有效位分别用作写使能和读输出多路复用选择信号。最后,在这种情况下,我们需要两个读端口和一个写端口,而物理磁盘最多只能支持2个读/写端口。为了实现第二个读端口,整个结构被复制(见图13)或双泵,如前所述。[61],[62]描述了几种优化RAM映射的算法。
图13:将2048×32位2r+1w逻辑内存映射到具有1024×8位1r+1w物理内存的FPGA
在过去的25年里,FPGA的存储结构发生了很大的变化,并且变得越来越重要,因为FPGA上存储与逻辑的比例显著增加。图14显示了从350纳米Flex 10 K器件(1995年)到10纳米Aeilex器件(2019年)的Altera/Intel器件中存储位/逻辑元件(包括LUT-RAM)与逻辑元件数量的关系。随着时间的推移,FPGA的存储丰富程度逐渐增加,为了满足对更多位的需求,现代BRAM比最初的存储(2 kb)具有更大的容量(20 kb)。一些FPGA具有高度异构的RAM,以便提供一些对小型或宽逻辑RAM有效的物理RAM,以及对大型和相对窄的逻辑RAM有效的其他RAM。例如,Stratix (130 nm)有3种类型的BRAM,容量分别为512b、4kb和512kb。Stratix III中LUT-RAM (65纳米)的引入减少了对小型BRAM的需求,因此转移到了9 kb和144 kb BRAM的存储架构。Stratix V (28纳米)和更高版本的Intel器件已经转向LUT-RAM和单个中型BRAM(20kb)的组合,以简化FPGA版图以及RAM映射和放置。Tatsumura等人[52] 也呈现了Xilinx器件的片上存储器密度的类似趋势。与Intel相似,Xilinx的存储架构结合了LUT-RAM和一个中等大小的18 kbRAM,但也包括一个将两个BRAM结合到一个36kb块中的硬件电路。然而,Xilinx的最新器件还包括一个大的288 kb BRAM (UltraRAM),以更有效地处理非常大的缓冲区,这表明在最佳BRAM架构上仍然有广泛的共识。
图14:从350纳米Flex 10k(1995年)到10纳米Agilex(2019年)架构,Altera/Intel FPGAs每LE内存位的趋势。这些标签显示了每种架构中BRAM的大小
为了深入了解不同RAM块的相对面积和效率,表2显示了2048×72位逻辑RAM的资源使用、硅面积和频率,当它由Quartus(Altera/Intel FPGA的CAD流程)以多种方式在Stratix IV器件上实现时。硅面积的计算使用了已公布的Stratix III块面积[63],并将其从65纳米缩小至40纳米,因为Stratix III和IV具有相同的架构,但使用不同的工艺节点。由于这种逻辑RAM在Stratix IV上非常适合144kb的BRAM存储,所以当映射到一个144kb的BRAM时,它可以获得最佳的面积。有趣的是,映射到18个9 kb的BRAMs在硅面积上只有1.9 倍大(注意,输出宽度限制导致18个BRAMs,而不是可能预期的16个)。9 kb的BRAM实现实际上比144 kb的BRAM实现更快,因为较小的BRAM具有更高的最大工作频率。将如此大的逻辑存储映射到LUT-RAM是低效的,需要12.7倍更多的面积,并以40%的频率工作。最后,只映射到逻辑和布线源显示了片上存储的重要性:面积比144kb的BRAM大300倍多。虽然144 kb的BRAM对于这个单一的测试用例来说是最有效的,但是真正的设计有不同的逻辑RAM,对于小的或浅的存储来说,9 kb和LUT-RAM的选项将优于144 kb的BRAM,这激发了片上RAM资源的多样性。为了选择BRAM大小和最大字宽的最佳组合,需要一个RAM映射工具和工具来估计每个BRAM的面积、速度和功率[55]。已发表的对FPGA BRAM架构权衡的研究包括[30],[55],[64]。
表2:Stratix IV上使用BRAMs、LUT-RAMs和寄存器的2048×72位1r+1w RAM的实现结果
到目前为止,所有的商用FPGA在它们的BRAM中只使用基于SRAM的存储单元。由于工艺的变化,对更高密度的BRAM的需求使得存储更丰富的FPGA和SRAM的缩小变得越来越困难。一些学术研究(例如如[52],[65])已经探索了使用其他新兴的存储技术,如磁隧道结(MTJs)来构建FPGA存储块。根据[52],在相同的管芯尺寸下,基于MTJ的BRAMs可以将FPGA存储容量提高高达2.95倍;然而,它们会增加工艺复杂度。
>3.5 数字信号处理器模块
最初,商用FPGA架构中唯一的专用算法电路是进位链,以实现高效的加法器,如第三章第一节所述。因此,乘法器必须使用LUTs和进位链在软逻辑中实现,这导致了很大的面积和延迟损失。由于高乘法器密度的信号处理和通信应用构成了一个主要的FPGA市场,设计人员提出了新的实现方法来减轻软逻辑中乘法器实现的低效率。例如,无乘法器的分布式算术技术被用来在基于LUT的FPGAs上实现高效的有限脉冲响应滤波器(FIR)结构[66],[67]。
随着乘法器在关键应用领域的FPGA设计中的流行,以及它们在软逻辑中实现时较低的面积/延迟/功率效率,它们很快成为FPGA架构中专用电路硬化的候选对象。一个N位乘法器阵列由N平方个逻辑元件组成,只有2 N个输入和输出。因此,硬化乘法器逻辑的增益和可编程接口到FPGA布线结构的成本导致了净效率增益,并强烈主张在后续的FPGA架构中采用硬乘法器。如图15左上角所示,Xilinx推出了其Virtex-II架构,该架构采用了业界首款18×18位硬乘法器块[68]。为了简化与完全定制的FPGA结构的版图集成,这些乘法器在BRAM列旁边被排成列。为了进一步降低互连成本,乘法器块及其相邻的BRAM共享一些互连资源,限制了BRAM块的最大可用数据宽度。使用软逻辑资源,可以将多个硬18位乘法器组合成更大的乘法器或FIR滤波器。
图15:Altera/Intel和Xilinx FPGAs中的DSP块演进。增量添加的特征以红色突出显示
2002年,Altera采用了一种不同的方法,在其Stratix架构中引入了针对通信和信号处理领域的全功能DSP模块[42](参见图15中的第二个模块)。该DSP模块的主要设计理念是通过硬化DSP模块内部的更多功能,并增强其灵活性以允许更多应用使用它,从而最大限度地减少用于实现常见DSP算法的软逻辑资源的数量。与Virtex-II架构中的固定功能硬18位乘法器不同,Stratix DSP模块可高度配置,支持不同的操作模式和乘法精度。每个Stratix可变精度DSP模块跨越8行,可以实现8个9×9位乘法器、4个18×18位乘法器或1个36×36乘法器。
Altera选择的这些操作模式突出了设计FPGA硬模块的一个重要主题:通过添加低成本电路来增加这些模块的可配置性和实用性。例如,一个18×18乘法数组可以分解成两个9×9数组,它们一起使用相同数量的输入和输出(以及布线端口)。类似地,四个18×18乘法器可以使用廉价逻辑组合成一个36×36数组。图16显示了如何将一个18×18乘法器阵列分割成多个9×9阵列。通过将输入和输出引脚的数量增加一倍,它可以分成四个9×9阵列。然而,为了避免增加这些昂贵的布线接口,18×18阵列被分成两个9×9阵列(图中16的蓝色)。这是通过在由红色虚线指示的位置拆分部分积压缩器树,并将转换功能添加到右上角数组的边界单元格中来实现的,在图16中用十字标记。使用Baugh-Wooley算法[69]实现二进制有符号乘法(左下角的数组已经具有18×18数组的转换能力)。
图16:将一个18×18乘法器阵列分成两个具有相同数量输入/输出端口的9×9阵列
除了可分割的乘法器阵列之外,Stratix DSP还集成了一个加法器/输出块来执行求和和累加操作,以及可以配置为移位寄存器的硬化输入寄存器,移位寄存器之间具有专用的级联互连,以实现高效的FIR滤波器结构[70]。晶格最新的28纳米架构也有一个可变精度的DSP模块,可以实现相同的精度范围,此外,还分别为滤波器结构和视频处理应用提供特殊的一维和二维对称模式。Xilinx还采用了一种全功能的DSP块方法,在Virtex-4架构中引入了DSP48芯片[71]。每个DSP都有两个固定精度的18×18位乘法器,其功能与StratixDSP模块相似(例如输入级联、加法器/减法器/累加器)。Virtex-4还引入了级联加法器/累加器的能力,使用专用互连来实现具有硬化简化链的高速系统FIR滤波器。
N抽头FIR滤波器在信号样本X = {x0,x1,…,xT}和某些系数C = {c0,c1,…,c(n-1)}之间执行离散的一维卷积,这些系数表示所需滤波器的脉冲响应,如等式1所示。
实践中使用的许多FIR滤波器都是对称的,ci =c(n-i) ,i = 0至N/2。由于这种对称性,滤波器的计算可以重构为等式2所示。
图17显示脉动对称FIR滤波器电路的结构,这是无线基站中FPGAs的一个关键用例。Stratix和Virtex-4DSP模块都可以实现虚线框突出显示的部分,与在FPGA的软逻辑中实现它们相比,这导致了显著的效率增益。有趣的是,虽然FPGA CAD工具会自动在DSP块中实现乘法(*)运算,但它们通常不会利用任何高级DSP块功能(例如累加,用于FIR滤波器的脉动寄存器),除非设计者以适当的模式手动实例化DSP块。因此,使用更强大的DSP模块功能使设计更加轻便。
图17:脉动对称FIR滤波电路
Stratix IIIDSP模块类似于Stratix IIDSP模块,但如果将结果相加以限制输出布线接口的数量,则每半个DSP模块(而不是两个)可以实现四个18×18乘法器[72]。表3列出了对称和不对称的51抽头FIR滤波器的实现结果,在Stratix器件上使用和不使用硬件DSP模块。当不使用DSP块时,我们用两种不同的情况进行实验:固定的滤波器系数和运行时可以改变的滤波器系数。如果滤波器系数是固定的,则在软逻辑中实现的乘法器阵列通过综合部分积生成逻辑中对应于系数值中的零比特的部分而被优化。因此,与运行时可能改变的输入系数相比,它的资源利用率较低。对于对称滤波器,即使使用DSP模块,我们仍然需要使用一些软逻辑资源来实现输入级联链和预加法器,如图17所示。使用硬DSP模块在系数固定的情况下导致比使用软结构的面积效率多3倍。对于运行时可变的过滤器系数,这一差距增长到6.2倍。对于不对称滤波器,完整的FIR滤波器结构可以在DSP模块中实现,无需任何软逻辑资源。因此,对于固定系数和输入系数,面积效率差距分别增加到3.9倍和8.5倍。这些收益很大,但仍低于学术界通常引用的FPGA和ASIC[11]之间的35倍差距。这种差异部分是由于大多数应用电路中保留了一些软逻辑,但即使在FIR滤波器完全适合没有软逻辑的DSP块的情况下,面积减少也达到最大值8.5倍。低于[11]的35倍增益的主要原因是可编程布线的接口以及必须在DSP模块中实现的通用模块间可编程布线和多路复用器。在所有情况下,如表3所示,使用硬DSP模块导致大约2倍频率改善。
表3:Stratix IV上51抽头对称FIR滤波器的实现结果,使用和不使用硬化的DSP块
Altera和Xilinx的后续代FPGA架构仅见证了DSP块架构的微小变化。两家供应商的主要关注点是在不增加昂贵的可编程布线接口的情况下,微调关键应用领域的DSP模块功能。在Stratix V中,DSP块被极大地简化为支持两个18×18位乘法(无线基站信号处理中使用的关键精度)或一个27×27乘法(适用于单精度浮点尾数)。因此,更简单的Stratix V DSP块跨越了一个单一的行,这对于Altera的行冗余方案更友好。此外,添加了输入预加法器以及存储只读滤波器权重的嵌入式系数库[73],这允许实现图17中所示的整个对称滤波器结构,不需要任何软逻辑资源。另一方面,Xilinx在其Virtex-5 DSP48E芯片[74]中从18×18乘法器切换到25×18乘法器,之后他们合并了输入预加法器,并增强了加法器/累加单元,以支持Virtex-6DSP48E1芯片[75]中的位逻辑运算。然后,他们将乘法宽度再次增加到27×18位,并在Ultrascale系列DSP48E2芯片中的算术逻辑单元中增加了第四个输入[76]。
如图15所示,直到2009年,DSP模块架构的发展主要是由通信应用的要求驱动的,尤其是在无线基站中,很少有学术研究探索[77],[78]。最近,FPGAs被广泛应用于数据中心,以加速各种类型的工作负载,如搜索引擎和网络数据包处理[9]。此外,DL已经成为数据中心和边缘工作负载中许多应用的关键组件,而MAC是其核心算术运算。在这些新趋势的推动下,DSP模块架构朝着两个不同的方向发展。第一个方向针对高性能计算(HPC)领域,增加了对单精度浮点(fp32)乘法的本机支持。在此之前,FPGA供应商将为设计者提供IP核,这些核可以从定点DSP和大量软逻辑资源中实现浮点算法。这为FPGAs在高性能计算领域与CPU和GPU(有专用浮点单元)竞争创造了巨大的障碍。Intel的Arria10架构首次引入了本机浮点功能,其主要设计目标是避免DSP块面积的大幅增加[79]。通过将相同的接口重新用于可编程布线,不支持不常见的功能,如次法距、标志和多舍入方案,并最大限度地重用现有的定点硬件,块面积的增加仅限于10%(即总芯片面积增加0.5%)。下一代Xilinx通用架构的DSP58芯片也将支持浮点功能[80]。
第二个方向旨在增加低精度整数乘法的密度,特别是针对DL的推断工作负载。先前的工作已经证明了使用低精度定点算法(8位及以下)代替fp32,精度下降可以忽略不计或没有,但大大降低了硬件成本[81]–[83]。然而,所需的精度取决于模型,甚至可以在同一模型的不同层之间变化。因此,FPGA已经成为一种有吸引力的DL推断解决方案,因为它们能够实现定制精细的数据路径,与GPU相比具有更高的能效,与定制ASIC相比具有更低的开发成本。这导致学术研究人员和FPGA供应商研究向DSP模块添加对低精度乘法的本地支持。[84]的作者增强了类似Intel的DSP块的可分割性,以支持更多的int9和int4乘法和MAC操作,同时保持相同的DSP块布线接口并确保其向后兼容性。所提出的DSP块可以实现4个int9和8个int4乘法/MAC运算以及类似Arria-10的DSP块功能,代价是DSP块面积增加12%,这相当于总芯片面积仅增加0.6%。与不支持这些操作模式的带DSP的FPGA相比,该DSP块将8位和4位DL加速器的性能分别提高了1.3倍和1.6倍,同时将已利用的FPGA资源分别减少了15%和30%。另一项学术工作[85]通过在DSP48E2块中包含一个可分割的乘法器阵列来代替固定精度的乘法器,以支持int9、int4和int2精度,从而增强了类似Xilinx的DSP块。它还添加了FIFO寄存器文件和DSP模块之间的特殊专用互连,以实现更有效的标准、逐点和深度卷积层。此后不久,Intel宣布,下一代Agilex DSP块将与半精度浮点(fp16)和浮点(bfloat16)精度一起添加相同的int9操作模式[86]。此外,下一代Xilinx Versal架构将在其DSP58芯片中支持int8乘法[80]。
多年来,DSP块架构已经发展到最适合FPGAs关键应用领域的要求,并提供更高的灵活性,以便许多不同的应用可以从其功能中受益。在这一演变的所有步骤中,共同的焦点是尽可能重用乘法器阵列和布线端口,以最好地利用这两种昂贵的资源。然而,随着高性能计算中的高精度浮点、通信中的中精度定点和DL中的低精度定点之间的关键FPGA应用领域的DSP块要求的最新进展,这变得更加困难。因此,Intel最近宣布了一种人工智能优化的FPGA,StATrix 10 NX,它用人工智能张量块代替了传统的DSP块[87]。新的张量块放弃了对传统DSP模式和精度的支持,这些模式和精度针对通信领域,并采用了专门针对DL领域的新模式。在几乎相同的芯片尺寸下,这种张量块显著地将每个块的int8和int4 MACs的数量分别增加到30和60[88]。向所有乘法器提供输入而不增加更多布线端口是一个关键问题。因此,NX张量块引入了一个双缓冲数据重用寄存器网络,可以从较少数量的布线端口顺序加载,同时允许通用的DL计算模式来充分利用所有可用的乘法器[89]。Achronix的下一代Speedster7t FPGA还将包括一个机器学习处理(MLP)模块[90]。除了fp24、fp16和bfloat16浮点格式之外,它还支持从int16到int3的各种精度。Speedster7t中的MLP模块还将具有一个紧密耦合的BRAM和循环寄存器文件,允许重用输入值和输出结果。这些紧密集成的组中的每一个都有一个72位的外部输入,但可以配置为具有高达144位的输出,馈送到MLP乘法器阵列,从而将所需的布线端口数量减少2倍。
>3.6 系统级互连:片上网络
FPGA的外部IO接口(如DDR、PCIe和以太网)的容量和带宽不断增加。在这些高速接口和越来越大的光纤之间分配数据流量是一项挑战。这种系统级互连传统上是通过配置部分FPGA逻辑和布线来实现软总线,从而实现相关端点之间的多路复用、仲裁、流水线和布线。这些外部接口的工作频率高于FPGA结构所能实现的频率,因此匹配其带宽的唯一方法是使用更宽的(软)总线。例如,一个单通道高带宽存储器(HBM)有一个128位双数据速率接口,工作在1 GHz,因此在250 MHz工作的带宽匹配软总线必须是1024位宽。最近的FPGA集成了多达8个HBM通道[91]以及许多PCIe、以太网和其他接口,系统级互连可以快速使用FPGA逻辑和布线源的主要部分。此外,系统级互连往往会跨越很长的距离。非常宽的总线和物理上很长的总线的结合使得时序收敛具有挑战性,并且通常需要软总线的深度流水线操作,进一步增加了它的资源使用。随着FPGA外部接口的数量和速度的增加,以及金属线寄生效应(以及互连延迟)的不良扩展,先进工艺节点中的系统级互连挑战变得更加困难[92]。
Abdelfattah和Betz[93]–[95]提出在FPGA结构中嵌入一个硬的分组交换片上网络(NoC),以实现更高效、更易于使用的系统级互连。虽然全功能数据包交换的NoC可以使用FPGA的软逻辑和布线来实现,但与软NoC相比,具有硬化的处理器和链路的NoC的面积效率高23倍,速度快6倍,功耗低11倍。为FPGA设计一个硬的NoC是一个挑战,因为FPGA架构师必须为芯片做出许多选择(例如布线器数量、链路宽度、NoC拓扑结构),但仍然保持了FPGA的灵活性,可以使用许多不同的外部接口和通信端点来实现各种各样的应用。[95]中的工作提倡布线器数量适中的网状拓扑(例如16)和相当宽(128位)的链路;这些选择使面积成本不到总面积的2%,同时确保NoC更容易布局,一条NoC链路可以承载整个数据通道的带宽。硬NoC控制器还必须能够灵活地连接到在FPGA结构中实现的用户逻辑;Abdelfattahet等人[96]通过执行宽度适配、跨时钟域和电压转换,引入了将硬NoC布线器连接到FPGA可编程结构的结构端口。这将NoC从NoC结构中分离出来,这样NoC就可以以固定(高)频率工作,并且仍然可以与不同速度和带宽要求的FPGA逻辑和IO接口连接,只需很少的粘合逻辑。硬NoC似乎也非常适合数据中心的FPGA。数据中心FPGA通常由两部分组成:shell提供与外部接口的系统级互连,一个角色实现应用加速功能[9]。shell的资源使用可能很重要:在微软的第一代Catapult系统中,它需要23%的器件资源[8]。Yazdanshenaset等人[97]表明,在这种shell+role FPGA用例中,硬NoC显著提高了资源利用率、工作频率和布线开销。其他研究提出了特定于FPGA的优化,以提高软NoC的面积效率和性能[98]–[100]。然而,[101]表明,即使是优化的软NoC,在大多数方面(可用带宽、延迟、面积和布线拥塞)仍然落后于硬NoC。
最近的Xilinx (Versal)和Achronix (Speedster7t)FPGAs集成了一个硬NoC [102],[103],类似于上面讨论的学术建议。Versal使用硬NoC在各种端点(千兆收发器、处理器、子系统、软结构)之间进行系统级通信,事实上,这是外部存储器接口与器件其余部分通信的唯一方式。它使用工作在1 GHz的128位宽的链路,匹配DDR信道的带宽。它的拓扑结构与网格有关,但是所有的水平链接都被推到器件的顶部和底部,以便更容易在FPGA布局中显示。Versal NoC包含多行(即链路链和布线器链),以及许多垂直的NoC列(类似于任何其他硬模块列,如DSP),具体取决于图18(a)中所示的器件大小。NoC具有可编程布线表,这些布线表在引导时配置,并提供标准AXI接口[104]作为其结构端口。Speedster7tNoC拓扑针对外部接口到帧传输进行了优化。它由围绕结构的外围环组成,在FPGA结构上有规则间隔的NoC控制器行和列,如图18(b)所示。外环NoC可以独立工作,而无需配置FPGA结构来布线不同外部接口之间的流量。NoC的行和列之间没有直接的联系;来自连接到一个NoC行的主块的数据包将通过外围环到达连接到一个NoC列的从块。
图18:下一代(a) Xilinx Versal和(b) Achronix Speedster7t架构中的片上网络系统级互连
>3.7 内插器
FPGA是允许多个硅器件密集互连的内插器技术的早期采用者。如图19(a)所示,无源内插器是一种硅器件(通常采用拖尾工艺技术以降低成本),其表面具有形成布线轨迹和数千个微凸点的传统金属层,这些金属层连接到在其顶部翻转的两个或多个管芯。基于内插器的FPGAs的一个动机是以合理的成本实现高逻辑容量。制造前验证ASIC设计的高端系统和仿真平台都需要具有高逻辑容量的FPGAs。然而,大型单片(即单硅芯片)器件的成品率很低,尤其是在工艺技术的早期阶段(正好是FPGA最先进的时候)。将多个较小的芯片组合在一个硅互连上是一种具有更高集成度的替代方法。2.5维系统的第二个动机是将不同的专用小芯片(可能使用不同的处理技术)集成到一个系统中。这种方法对FPGAs也很有吸引力,因为结构的可编程性可以桥接不同的小芯片功能和接口协议。
Xilinx最大的Virtex-7 (28纳米)和Virtex Ultrascale(20纳米)FPGAs使用无源硅内插器将四个FPGA芯片集成在一起,每个芯片构成FPGA的一部分行。最大的基于内插器的器件在同一个工艺节点上提供了两倍于最大单芯片FPGAs的逻辑元件。FPGA可编程布线需要大量的互连,这就提出了一个问题,即互连微凸点(比传统的布线轨迹大得多,也慢得多)是否会限制系统的布线能力。例如,在Virtex-7基于内插器的FPGAs中,只有23%的垂直布线轨迹通过内插器在管芯之间交叉[105],估计附加延迟约为1 ns [106]。[105]中的研究表明,将FPGA逻辑设置为最小化内插器边界交叉的CAD工具,结合增加插入器交叉轨迹开关灵活性的结构变化,可以大大减轻这种减少信号数量的影响。下一代Xilinx通用架构(在第三章第六节中讨论)中的NoC控制器的整个垂直和宽度在片之间交叉,有助于提供更多的互连带宽。嵌入式NoC很好地利用了可以穿过中介层的有限数量的导线,因为它以高频率运行其链路,并且当它们被分组交换时,它们可以被不同的通信流共享。
取而代之的是,Intel FPGA使用更小的内插器,称为嵌入式多芯片互连桥(EMIB),嵌入在封装衬底上,如图19(b)所示。IntelStratix 10器件使用EMIB将大型FPGA结构芯片与较小的IO收发器或HBM小芯片集成在同一个封装中,将FPGA的这两个关键元件的设计和工艺技术选择去耦。最近的一些研究[107]–[109]使用EMIB技术将FPGA结构与用于DL应用的专用ASIC加速芯片紧密耦合。这种方法卸载了计算的特定内核(例如matrixmatrixor矩阵向量乘法)到更高效的专用小芯片,同时利用FPGA结构与外部世界接口,并实现快速变化的DL模型组件。
>3.8 其他FPGA组件
现代FPGA架构包含其他重要组件,我们不会详细讨论。其中一个组件是配置电路,它将比特流加载到数百万个SRAM单元中,这些单元控制LUTs、布线开关和硬模块中的配置位。上电时,配置控制器从诸如板上FLASH或硬化PCIe接口的源串行加载该比特流。当一组足够的配置位被缓冲时,它们被并行写入一组配置SRAM单元,类似于将一个(非常宽的)字写入SRAM阵列。这种配置电路也可以由FPGA软逻辑访问,允许器件的一部分进行部分重新配置,而另一部分继续处理。一个完整的FPGA应用是非常有价值的知识产权,如果没有安全措施,只需复制编程比特流就可以克隆它。为了避免这种情况,FPGA CAD工具可以选择性地加密比特流,并且FPGA器件可以具有由制造商编程的私有解密密钥,使得比特流只能由购买具有适当密钥的FPGA的单个客户使用。
由于FPGA应用通常以不同的速度与许多不同的器件通信,它们通常包括几十个时钟。这些时钟大多由片内可编程锁相环(PLLs)、延迟锁定环(DLL)和时钟数据恢复(CDR)电路产生。对于不同的应用,以不同的方式分配许多高频时钟是具有挑战性的,并且导致了用于时钟的特殊互连网络。这些时钟网络在原理上类似于第三章第二节的可编程互连,但使用了允许构建低偏斜网络(如H树)的布线和开关拓扑,并使用更宽的金属和屏蔽导体来减少串扰和抖动。
04 结论和未来方向
FPGAs已经从简单的可编程逻辑块阵列和通过可编程加速互连的IOs发展成为更复杂的多芯片系统,具有许多不同的嵌入式组件,如BRAM、DSP、高速外部接口和系统级NoC控制器。最近在高性能计算和数据中心领域采用FPGA,以及深度学习等新的高需求应用的出现,正在引领FPGA架构设计的新阶段。这些新应用和数据中心的多用户模式为架构创新创造了机会。与此同时,过程技术扩展正在发生根本性的变化。线路延迟的伸缩性很差,这促使人们重新思考可编程的布线架构。内插和3D集成支持全新类型的异构系统。控制功耗是一个压倒一切的问题,并可能导致更多的电源门控和更多异构硬件块的FPGA。我们并不声称预测未来的FPGA架构,除了它将是有趣的和不同于今天!
致谢
作者要感谢Fynn Schwiegelshohnfor的宝贵反馈,以及NSERC/Intel可编程硅产业研究主席和Vectorinstitute的资金支持。
THE END
翻译:兰海博
图文排版:祝钊华
责任编辑:潘伟涛
原文链接:网络交换FPGA
更多IC设计技术干货请关注IC设计技术专栏。