这一篇在干嘛?

这是 FPGA EDA 综述的开篇:先把 FPGA 芯片的”骨架”(逻辑块、布线资源、时钟网络)讲清楚,再走一遍从 Verilog 代码到比特流的完整设计流程。理解了硬件长什么样、流程分几步,后面每一章讲的算法才知道在为哪个环节服务。

为什么 FPGA 需要”设计自动化”

FPGA(现场可编程门阵列)从上世纪 80 年代中期诞生起,就走上了一条指数增长之路:最早的 Xilinx XC2064 只有 64 个查找表(LUT),只能当”胶水逻辑”用;到本篇综述写作时(2006 年),Altera Stratix II 和 Xilinx Virtex-4 已经能提供 20 万个以上的可编程逻辑单元,外加嵌入式存储器、DSP 块、处理器、高速 IO 等硬核资源——逻辑容量涨了 3000 多倍。

容量暴涨带来一个直接后果:人手根本画不动了。要让工程师在这样的芯片上完成高性能设计,必须有 CAD(计算机辅助设计)/EDA 软件把 HDL 代码自动变成能下载的配置文件。这就是 FPGA 设计自动化研究的意义,也是整篇综述的主题。

FPGA 架构速览

岛式架构:可编程芯片的骨架

主流 FPGA 采用所谓 island-style(岛式)架构:一圈 I/O 块围住中间的可编程核心,核心里”逻辑块之岛”漂浮在”布线资源之海”上。

图1.1 岛式FPGA架构:灰色方块为逻辑块(CLB),四周是布线通道,通过开关块和连接块相连

几个关键部件:

  • 逻辑块(CLB):实现逻辑功能的基本单元,是图中的灰色方块。
  • 布线通道:逻辑块之间的走线区域,导线是分段(segmented)的,段长可以不同。
  • 开关块(Switch Block):连接相邻通道里的导线,通过可编程开关(传输晶体管或双向缓冲器)。
  • 连接块(Connection Block):把逻辑块周围的导线接到逻辑块的输入输出引脚上。

研究界用一组参数来刻画布线架构:通道宽度 、开关块灵活度 (每根进线在开关块里能连到几根线)、连接块灵活度 (逻辑块引脚能连到通道里几根线)、以及导线段长度。白话地说:W 是马路多宽,F_s/F_c 是路口多灵通,段长是马路一格多长

这套参数为什么重要?因为它们构成了设计者的”赌局”:

  • 太小 → 布线时通道挤爆,布不通; 太大 → 芯片面积和漏电白白浪费。
  • / 太小 → 信号绕路严重,延迟上升;太大 → 开关(传输管/缓冲器)太多,电容和延迟也上升。
  • 段长太短 → 走远路要过一大串开关;太长 → 短距离连接被迫”大材小用”,浪费轨道。

你会发现后面每一章的算法(布线、布局、映射、聚类)的优化效果都依赖这些架构参数——算法与架构是共同演化的,这也是 VPR 这类”架构参数化”研究工具存在的意义:芯片还没造出来,就能用软件评估架构选择的好坏。

另外一个容易忽略的点:现代 FPGA 的逻辑块里除了 LUT 和寄存器,还集成了大量硬 IP 核——嵌入式存储器、DSP 乘法块、嵌入式处理器、高速 IO、时钟同步电路。EDA 工具必须”认得”这些硬资源并在综合时优先把匹配的操作映射上去,否则放着乘法器不用、拿几十个 LUT 硬凑一个乘法,性能和面积都会很难看。

分段布线:性能好,但延迟”不讲理”

商业 FPGA 内部布满各种固定长度的专用互连。比如 Xilinx Spartan-3E 有长线(long lines)、六线(hex lines,跨 6 个逻辑块)、双线(double lines)和直接连接线(direct connect,连到相邻逻辑块)。

图1.2 Spartan-3E 中的直接连接线(a)和六线(b):跨的逻辑块数量不同,延迟特性完全不同

图1.2(b) 六线连接

分段布线让 FPGA 的互连延迟变得高度非线性、离散,甚至非单调——两个逻辑块离得近不代表延迟低,因为可能”恰好没有对的线段”。这给 EDA 工具出了个难题:ASIC 布局里常用的”曼哈顿距离 ≈ 延迟”的简单模型,在 FPGA 上经常失灵。精确的互连延迟建模是 FPGA 物理设计工具的硬要求,这条主线贯穿后面所有章节。

逻辑块内部:LUT + 寄存器

再往下一层,每个逻辑块由 N 个 BLE(基本逻辑单元) 组成,每个 BLE = 1 个 LUT + 1 个寄存器。LUT(查找表)本质是一块小真值表存储器:K 输入的 LUT 能实现任意 K 输入布尔函数。

图1.3 逻辑块及其外围:N个BLE,I个输入,经多路选择器全连接

图中逻辑块有 I 个输入、N 个输出,通过多路选择器全连接到每个 LUT 的输入端。这个 N(块大小)和 I(输入数)是架构参数,直接决定后面”聚类(clustering)“环节的游戏规则。

打个比方理解 LUT 与逻辑块的关系:

  • LUT 像一张”任意函数卡”——K 根地址线,存 格真值表,想要什么函数就往表里写什么;
  • BLE 是”卡 + 存折”——LUT 算组合逻辑,寄存器管时序,两者搭档才能搭状态机;
  • **逻辑块(CLB)**是”一栋楼”——N 套 BLE 住在一起,楼内的本地互连快而便宜,楼间的通道互连慢而昂贵。聚类算法的目标就是尽量让”关系密切的 BLE 住同一栋楼”。

时钟网络:H 树

时钟分布是 FPGA 芯片的另一大件。典型方案是 H 树时钟网络:时钟信号像一棵二叉树从中心级级分叉,每个叶端(tile,即逻辑块)里还有本地时钟缓冲器驱动各个触发器。

图1.4 基于H树的FPGA时钟网络:每个缓冲器分两支,层层扇出

时钟树的深度和分支长度由芯片面积、tile 尺寸和通道宽度决定——时钟资源本身也是要占布线资源的。

顺带一提:CPLD

CPLD(复杂可编程逻辑器件)是 FPGA 的”表亲”:拓扑类似(布线围着逻辑块转),但有两点不同——

  1. 互连更简单,所以延迟更可预测;
  2. 基本逻辑单元不是 LUT,而是两级与-或结构(若干与门 p-term 驱动一个或门),即所谓宏单元(macrocell)。

图1.5 Altera MAX7000B 的宏单元:5个p-term,可向邻居借,经PIA互连

CPLD 适合宽输入、低密度的逻辑(比如状态机),后面第 3 章会讲到专门针对它的映射算法。

FPGA 设计流程:从 RTL 到比特流

典型的 FPGA 设计流程如下图,输入三件套是:RTL 描述(Verilog/VHDL)、设计约束、目标器件规格。

图1.6 典型FPGA设计流程:从RTL出发,经过综合、映射、布局布线,最终生成比特流

三种输入,各有讲究

  • HDL 规格:主流是周期精确的 RTL(Verilog/VHDL);趋势是往更抽象的行为级走(C、SystemC、MatLab/Simulink),由行为综合工具生成 RTL——这是第 5 章的主题。
  • 设计约束:各时钟的目标频率、pad 到寄存器的建立时间、寄存器到 pad 的 clock-to-out 延迟,以及false path(正常工作时不会被激活的路径,可直接忽略)和多周期路径(几个周期才出一次有效数据的路径,时序要求放宽)。还可能包括物理位置约束(把某些逻辑钉在指定位置)。
  • 器件选择:这是个迭代过程——如果综合塞不下,就得换容量更大的器件;如果频率不达标,就得换速度等级更高的。两种情况都意味着成本上升 50% 甚至 100%,所以综合工具的质量直接影响设计成本,这是 EDA 算法研究的现实动力。

流程七步走

  1. RTL elaboration(细化):识别并推断出数据通路操作(加法、乘法、寄存器堆、存储块)和控制逻辑(状态机、布尔网络)。识别数据通路很重要,因为现代 FPGA 有专门的快速进位链、嵌入式乘法器来伺候它们。
  2. 架构无关优化:数据通路侧做常量传播、强度削减、操作共享、表达式优化;控制逻辑侧做状态机编码/最小化、retiming(重定时)、冗余删除、基于 don’t-care 的优化。
  3. 工艺映射与架构相关优化:把优化后的设计”翻译”成 FPGA 的逻辑单元——数据通路优先映射到片上专用结构(乘法器、进位链加法器、存储块),控制逻辑映射到 BLE。这是第 3 章的主题。
  4. 聚类与布局:现代 FPGA 多为层次结构,所以先要把 BLE 打包成逻辑块(clustering),再决定每个元素放芯片的哪个位置。这是第 2、4 章的主题。
  5. 布局驱动优化与增量布局:布局定了互连也就定了,长互连的延迟可能是 BLE 延迟的好几倍,于是要在真实互连延迟下再做逻辑重构、复制、重布线等优化,然后增量布局重新合法化。这步是可选的,但收益可观——第 4 章的核心。
  6. 布线:全局布线 + 详细布线,用片上可编程互连把所有信号连起来。第 2 章的主题。
  7. 比特流生成:把映射、布局、布线的结果变成能配置芯片的比特流,收工。

注意本综述讲解各章算法的顺序与流程顺序相反:先讲布线与布局(最下游),再往回讲到工艺映射、物理综合、高层次综合、功耗优化——因为下游步骤的定义最直观,倒着讲更容易建立全局图景。

一张表总览:流程步骤 ↔ 对应章节

流程步骤干什么对应篇章
布线用片上可编程互连连通所有信号综述02
布局决定每个逻辑单元放芯片哪里综述02
工艺映射把逻辑网络切成 K-LUT / 映到硬核综述03
聚类 + 物理综合BLE 打包成逻辑块、布局感知的优化综述04
RTL / 行为级综合从 HDL 或行为描述生成下游网表综述05
功耗优化贯穿全流程的低功耗设计与架构综述06

读后续篇章时可以随时回看这张表:每个算法都是为了流程中某个具体环节服务的,脱离流程记算法只会事倍功半。

常见坑/误区

别用 ASIC 的直觉套 FPGA 的延迟模型。ASIC 布局里”曼哈顿距离近似延迟”基本够用,但在 FPGA 里,互连延迟取决于走了哪些分段导线、过了多少可编程开关——两行代码间距离近的信号未必跑得快。同样,“块大小 N 越大越好”也是误解:N 大虽然摊薄了本地互连,但会浪费未用满的 LUT 并加重布线压力。

通关标准:

学完本篇你应该理解:岛式 FPGA 的四大部件(CLB、通道、开关块、连接块)和 W/F_s/F_c/段长这些架构参数的含义;LUT 是什么、BLE 与逻辑块的关系;分段布线为什么让 FPGA 延迟建模变难;从 RTL 到比特流的七个步骤各在做什么、对应综述的哪一章。