FPGA 无可比拟的灵活性,以及确定性的低时延优势,是 FPGA 难以被替代的原因,也是 FPGA 为 客户提供的独一无二的价值。
1. FPGA 如何工作?
要回答“FPGA 提供了什么价值”的问题,我们需要理解 FPGA 的架构和原理,即 FPGA 是如何工作的?FPGA 由可编程逻辑块、可编程连线和可编程 I/O 三大部分组成。其中,1)可编程逻辑块是 FPGA 架构中 最重要的部分,负责承载主要的电路功能;而在电路被映射到各个逻辑块后,预先放置的 2)可编程连线负 责将这些逻辑块以时延最优的方式连在一起,共同构成一个更大规模的电路;最后,由 3)可编程 I/O 负责 FPGA 与外界交互,可以实现诸如将信号串行解串行、将信号延迟以对准时钟等更复杂的功能。 可编程逻辑块本质上由多个 LUT、MUX 和寄存器构建而成,用于承载电路中的一个个逻辑“门”。每个厂商 对自身 FPGA 的可编程逻辑块的称呼不一样,比如赛灵思是 CLB(Configurable Logic Block,可编程逻 辑块),而 Altera 则是 LAB(Logic Array Block)。尽管如此,可编程逻辑块中最重要的两块“积木”就是 LUT(Look-up Table,查找表)和寄存器。以赛灵思传统的 FPGA 为例,1 个 CLB 包含了 4 个 Slice,而 1 个 Slice 由 2 个逻辑单元(Logic Cell,LC)组成。每个逻辑单元包括 1 个 LUT4、若干个多路复用器(MUX) 和 1 个寄存器,可完成时序电路和组合电路,代表 FPGA 的基础容量。现代 FPGA 中往往有数十万个逻辑 块,彼此既可前后相连,也可同时独立地处理 IO 输入的信号,不需要耗费时间处理控制指令,这是 FPGA 并行性好的原因。
其中,LUT 是 FPGA 实现可编程的基础,本质上是一个对应真值表输出的查找表,可以完成任意组合电路 的功能。比如,下图中的组合逻辑(Y= AB + ̅D + C̅)最少需要 3 个逻辑门实现(与门、异或门、或门), 在 FPGA 里面需要占用到一个逻辑单元。传统的 FPGA 基本是 LUT4(四输入的 LUT),而现代的 LUT 基本 是 LUT6 或者 LUT8。除此之外,LUT 可以当作分布式的 RAM 来使用,比如 LUT4 就是一个 16*1 的 RAM。
通过改变 LUT4 里面的 16 位掩码,就能灵活地对应不同的组合电路,再结合寄存器,可以完成时序电路的 功能,从而实现任意电路的“可编程”。数字电路有两大类:组合电路和时序电路。组合电路的功能就是负 责在特定规则下,将输入的信号转换为输出信号。例如,我们规定当 AB 同时为 1,或者 CD 不同时,输出 才为 1,否则为 0,这一规则对应的表达式为 Y= AB + ̅D + C̅。由于 A、B、C、D 每个变量有“0”和“1” 的选项,所以输出有2 4即16种可能,我们将输入和输出的所有可能列出来,就形成了一张真值表(Truth Table)。 将真值表中输出的16位数值配置到LUT4的SRAM单元中,我们就能把组合电路映射到查找表中。一个LUT4 最多能表示 20 个 2 输入的逻辑门,百万甚至千万门级的电路往往是通过可编程连线,将不同的逻辑单元连 在一起组合而成。而时序电路即“组合电路+存储”,逻辑单元中的寄存器可以用作存储单元,将组合逻辑的 结果送到下一个组合电路的输入端,电路就能像流水线一样同时工作。
可编程连线负责联通 FPGA 中的众多模块,以一种满足时序约束的方式。将目标电路在 FPGA 上实现,包 含了三个最核心的步骤:1) 映射(Mapping):将电路的逻辑门映射到不同的 LUT 中,形成 LUT 级网表; 2) 包装(Packing):将这些 LUT 放置到 CLB 中,形成 CLB 级网表;3)布局&布线(Place-and-route): 将 CLB 放置在合适的位置并彼此相连。由于数据信号的处理和传输需要时间,时钟信号的传递和变化也需要 时间,如果布局和连线的方式不合理,就会出现数据到达下一个寄存器的时间过晚或者过早,即数据采集失败的情况。大型的电路往往有数十万个 CLB 需要相连,这项复杂的工作由 FPGA 厂商的 EDA 工具负责,例 如赛灵思的 Vivado,Altera 的 Quartus,这些 EDA 将电路映射到多个 CLB 上,并且找到合理的布局和连接 方式,确保电路能在用户指定的频率上工作,即满足时序约束。因此,连线的可编程性更多地体现在 EDA 软件对于时序约束的满足能力上。如何提高自家 EDA 在映射、包装、布局&布线这三个核心步骤的效率,以 减少客户的设计用时(进而培养使用习惯),一直都是 FPGA 公司的研发重点,也是其竞争法宝。
布局布线是 FPGA 厂商的独门秘籍,是其 EDA 的核心。完整的 FPGA 设计流程包括三大步骤:设计输入 (Design Entry)、仿真&综合(Simulation & Synthesis)、实施(Implementation)。“设计输入”指将电路用 硬件描述语言(Verilog 或 VHDL)描述,“仿真”即检查描述的电路功能是否完整,“综合”负责电路的映射 和包装,“实施”即布局&布线。在随后的静态时序分析(STA)和调试无误后,形成比特流文件下载到 FPGA 中,电路就可以“跑”起来了。尽管 FPGA 厂商的 EDA 工具能提供一套完整的流程,但在设计大型电路时, 电路的验证仿真往往交给第三方的 EDA 完成,例如 Mentor 的 ModelSim。而 FPGA 的 EDA 则负责进行下一步的综合(甚至综合也可以在第三方 EDA 中完成,例如 Synopsys 的 Synplify)。这是由于电路仿真不涉 及 FPGA 的具体架构,只需考虑电路功能的完整性。随着电路的大型化和复杂化,这一工作逐渐由第三方 EDA 公司承担。而 FPGA 厂商的 EDA 真正核心之处在于布局和布线。因为布局布线涉及 FPGA 的内部具体 架构,这是每家 FPGA 公司的机密,无法交给第三方完成,这是 FPGA 厂商需要自研 EDA 的根本原因。从 FPGA 诞生以来,布局布线就从来只在 FPGA 公司的 EDA 上进行。
可编程 IO 负责 FPGA 和外界的交互,可以对输入和输出信号做复杂的处理。FPGA 通常有几百到上千个管 脚,除了时钟、电源和配置的专用管脚外,大部分管脚负责引入或输出信号。FPGA 的可编程 IO(IO Tile) 是 FPGA 非常重要的部分,由 IOB 模块(Input/output Buffer)和紧邻的 IO 逻辑资源共同组成。外界的信号 从管脚进入 FPGA 的 CLB 之前,首先通过可编程 IO 进行处理。除了可以指定引脚的电压水平和标准外,还 能执行许多复杂的处理。例如,将信号延迟输入以对准 FPGA 内部的时钟,将信号异步或者同步采集等功能。
其中,可编程 IO 中最重要的功能为串行和解串行数据。以赛灵思的 Virtex-7 FPGA 为例,IO Tile 中的 ISERDES 模块可以将输入的串行信号解串行为并行信号,OSERDES 模块可以将输出的并行信号串行,以进行远距离传输。此外,FPGA 中功能相似位置相近的 IO 接口归为一个“簇(bank)”,1 个簇包含 50 个 IO 口,因此 FPGA 的 IO 数量一般为 50 的倍数。一个 FPGA 可以有数十个簇,高达 1000 多个 IO 接口。 现代的 FPGA 是逻辑单元和固化功能的混合体。除了传统的 CLB 模块外,90 年代开始,FPGA 厂商不断将 频繁用到的功能“固化”到 FPGA 中,包括 RAM、DSP、收发器、CPU 等单元,用户可以直接在片上调用, 而不是用逻辑单元实现。这一操作可以极大地提高计算效率,避免浪费宝贵的逻辑资源,节省芯片面积。
除此之外,为了实现更好的性能,现代 FPGA 的逻辑块和互联结构也发生了变化。首先,从可编程逻辑块内 部每个查找表的结构来看,主流的 FPGA 从 LUT4 变成 LUT6 或者 LUT8,以减少逻辑块数量、降低走线时 延,且内部的输入方式可以按需组合。例如,Altera ALM 中的 LUT8,可以按需划分成任意输入组合;赛灵 思 CLB 中的 LUT6,也可以划分成两个 LUT5 使用。其次,逻辑块内部除了 LUT、寄存器、多路选择器这“三 大件”外,还添加进了一些固化电路。例如,赛灵思在其 CLB 内部的每个 Slice 里都固化了进位链,以实现 更快的算术运算。最后,在互联上,同一个 CLB 内部的 SLICE 互不相连,以避免全连接带来的布线延时。
2. FPGA 特点是能“经常改”和“算得快”
在解释完 FPGA 的原理架构后,我们来回答第一个问题,即 FPGA 给用户提供了什么价值?我们将其总结 为能“经常改”和“算得快”: 1)灵活性高,适合高速迭代的场景(能“经常改”):正如我们前文解答过,只需要改变 FPGA 中 LUT 的掩 码,一片 FPGA 就可以承载另一个电路的功能。因此,FPGA 可以实现任何电路功能,其耗时甚至不超 过一秒,修改不限次数,这就是 FPGA 极高的灵活性特点。FPGA 这一特性尤其适合以下 4 种场景: a) 标准/协议/算法经常更改的行业,需要支持可重构的系统,例如,无线通信协议经常更改、数据中 心互联需要兼容多种协议标准、神经网络算法飞速迭代、军工通信加密方式经常变化、在轨航天器 的处理系统动态重构等,类似的场景使用 FPGA 能够节省大量的时间和研发成本; b) 快速迭代、成本敏感的行业,因为“现场”可用,相比 ASIC,FPGA 无需等待三个月至一年的流 片周期,上市时间短,对于消费电子这类竞争激烈、迭代迅速的行业尤其重要,像 Lattice、赛灵思 自 2000 年起都纷纷针对消费电子市场,推出了不少单颗$2.5 上下的中低容量的 FPGA; c) 小批量的行业,芯片研发阶段的 MASK(光罩)费用是固定费用,65nm 一次需要 200 万人民币, 45nm 需要 430 万人民币,28nm 需要 1000 万。随着制程提升,一次不成功的风险增大。对于年需 求量< 500 万颗的场景,专门为某一应用开发 ASIC/ASSP,后续的销售额很难摊平巨大的研发成本。 FPGA 虽然单价较高,但由于其可以实现任何电路功能,节省了芯片千万级别的研发成本,特别适 合小批量的产品,例如国防和航天领域;

d) 反复修改验证的设计,例如,在 ASIC/ASSP 的原型设计中几乎都会使用 FPGA 进行验证,以发现 设计中存在的问题,及时修改,尽可能避免多次流片的风险。芯片原型仿真是 FPGA 的“刚需”之一, 亦是 FPGA 诞生的根本原因,最高端的 FPGA 往往会销售给英特尔这些大型的数字芯片公司,供其 新一代产品的验证,这一需求亦不断支撑 FPGA 走在技术节点前列。
2)并行性好,适合要求低时延和大量并行计算的场景(“算得快”):FPGA 内部数十万个 CLB 可以同时独 立工作,即使时钟频率较低,其计算效率要远远高于数个高效单元,特别适合信号处理这种涉及大量并 行计算的场景。此外,由于不存在线程或者资源冲突的问题,FPGA 的时延是确定的低时延,特别适合 低时延的场景。这类场景广泛存在于各个行业,比如: a) 通信行业的基站,无论是 RRU/AAU,还是 BBU/DU/CU,甚至核心网的设备,都需要用到 FPGA, 实现诸如 Turbo 编码,协议处理加速等的功能。而在售价数十万甚至百万人民币级别的无线信号测 量仪器,同样会用到单价上万元的高端 FPGA 进行信号的处理控制; b) 国防军工行业,典型场景如雷达数据处理,需要满足大容量、低延时、高可靠的特性,才能实现微 秒级的处理需求,而这一时延和稳定性要求只有 FPGA 能达到;在使用了光纤陀螺的惯性导航系统 同样,FPGA 可以对光信号进行低延时控制,实现光纤陀螺仪高精度、高动态的测量; c) 工业:由于工业有大量的低时延场景,FPGA 在工业领域应用是非常广泛的,常见于伺服电机驱动, 往往采取CPU+FPGA的架构,以实现微秒级别的控制环路反馈/,像赛灵思Zynq系列(SoC FPGA) 在工业就拥有广泛的应用。此外,在激光设备中也使用 FPGA 进行皮秒/飞秒激光器的信号控制; d) 汽车:典型的应用在 ADAS 领域,这是由于 FPGA 比 GPU 时延更低,能保证更好的制动距离;除 此之外,FPGA 也应用在行车后视镜等场景; e) 安防&视频:主要应用在安防高清视频的前端数据采集和低延时处理,在 LED 屏显同样应用广泛; f) AI:深度学习的模型往往涉及大量的乘法和累加,特别适合使用 FPGA 并行计算,以加速训练速度。
换句话说,相比 ASIC 和 ASSP,PLD 最突出的优点是灵活性高。对于设计电子系统的用户(例如华为), 其产品内部使用的芯片有三种选择:自己设计一颗 ASIC、购买例如高通、STM 提供的 ASSP、购买赛灵思 的 PLD。ASIC 与 ASSP 的区别在于,ASIC 是针对单一使用者的单一应用设计的,由使用者定义功能,而 ASSP 是为多个使用者设计的,其功能由芯片厂商而不是使用者定义,因此需要统一的标准。ASIC 的设计 费时,成本也非常昂贵,但能做到在目标应用的性能最优和功耗最低。ASSP 和 ASIC 的设计流程类似,但 更加通用,能兼具多个应用场景的性能和功耗。ASIC 和 ASSP 制造后芯片功能就固化了,以 FPGA 为代表 的 PLD,其芯片功能是可以反复修改的,虽然性能上不一定是最优,但灵活性是 ASIC 和 ASSP 所无法比拟 的。