这一篇在干嘛?
这是 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 块围住中间的可编程核心,核心里”逻辑块之岛”漂浮在”布线资源之海”上。

几个关键部件:
- 逻辑块(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,连到相邻逻辑块)。


分段布线让 FPGA 的互连延迟变得高度非线性、离散,甚至非单调——两个逻辑块离得近不代表延迟低,因为可能”恰好没有对的线段”。这给 EDA 工具出了个难题:ASIC 布局里常用的”曼哈顿距离 ≈ 延迟”的简单模型,在 FPGA 上经常失灵。精确的互连延迟建模是 FPGA 物理设计工具的硬要求,这条主线贯穿后面所有章节。
逻辑块内部:LUT + 寄存器
再往下一层,每个逻辑块由 N 个 BLE(基本逻辑单元) 组成,每个 BLE = 1 个 LUT + 1 个寄存器。LUT(查找表)本质是一块小真值表存储器:K 输入的 LUT 能实现任意 K 输入布尔函数。

图中逻辑块有 I 个输入、N 个输出,通过多路选择器全连接到每个 LUT 的输入端。这个 N(块大小)和 I(输入数)是架构参数,直接决定后面”聚类(clustering)“环节的游戏规则。
打个比方理解 LUT 与逻辑块的关系:
- LUT 像一张”任意函数卡”——K 根地址线,存 格真值表,想要什么函数就往表里写什么;
- BLE 是”卡 + 存折”——LUT 算组合逻辑,寄存器管时序,两者搭档才能搭状态机;
- **逻辑块(CLB)**是”一栋楼”——N 套 BLE 住在一起,楼内的本地互连快而便宜,楼间的通道互连慢而昂贵。聚类算法的目标就是尽量让”关系密切的 BLE 住同一栋楼”。
时钟网络:H 树
时钟分布是 FPGA 芯片的另一大件。典型方案是 H 树时钟网络:时钟信号像一棵二叉树从中心级级分叉,每个叶端(tile,即逻辑块)里还有本地时钟缓冲器驱动各个触发器。

时钟树的深度和分支长度由芯片面积、tile 尺寸和通道宽度决定——时钟资源本身也是要占布线资源的。
顺带一提:CPLD
CPLD(复杂可编程逻辑器件)是 FPGA 的”表亲”:拓扑类似(布线围着逻辑块转),但有两点不同——
- 互连更简单,所以延迟更可预测;
- 基本逻辑单元不是 LUT,而是两级与-或结构(若干与门 p-term 驱动一个或门),即所谓宏单元(macrocell)。

CPLD 适合宽输入、低密度的逻辑(比如状态机),后面第 3 章会讲到专门针对它的映射算法。
FPGA 设计流程:从 RTL 到比特流
典型的 FPGA 设计流程如下图,输入三件套是:RTL 描述(Verilog/VHDL)、设计约束、目标器件规格。

三种输入,各有讲究
- HDL 规格:主流是周期精确的 RTL(Verilog/VHDL);趋势是往更抽象的行为级走(C、SystemC、MatLab/Simulink),由行为综合工具生成 RTL——这是第 5 章的主题。
- 设计约束:各时钟的目标频率、pad 到寄存器的建立时间、寄存器到 pad 的 clock-to-out 延迟,以及false path(正常工作时不会被激活的路径,可直接忽略)和多周期路径(几个周期才出一次有效数据的路径,时序要求放宽)。还可能包括物理位置约束(把某些逻辑钉在指定位置)。
- 器件选择:这是个迭代过程——如果综合塞不下,就得换容量更大的器件;如果频率不达标,就得换速度等级更高的。两种情况都意味着成本上升 50% 甚至 100%,所以综合工具的质量直接影响设计成本,这是 EDA 算法研究的现实动力。
流程七步走
- RTL elaboration(细化):识别并推断出数据通路操作(加法、乘法、寄存器堆、存储块)和控制逻辑(状态机、布尔网络)。识别数据通路很重要,因为现代 FPGA 有专门的快速进位链、嵌入式乘法器来伺候它们。
- 架构无关优化:数据通路侧做常量传播、强度削减、操作共享、表达式优化;控制逻辑侧做状态机编码/最小化、retiming(重定时)、冗余删除、基于 don’t-care 的优化。
- 工艺映射与架构相关优化:把优化后的设计”翻译”成 FPGA 的逻辑单元——数据通路优先映射到片上专用结构(乘法器、进位链加法器、存储块),控制逻辑映射到 BLE。这是第 3 章的主题。
- 聚类与布局:现代 FPGA 多为层次结构,所以先要把 BLE 打包成逻辑块(clustering),再决定每个元素放芯片的哪个位置。这是第 2、4 章的主题。
- 布局驱动优化与增量布局:布局定了互连也就定了,长互连的延迟可能是 BLE 延迟的好几倍,于是要在真实互连延迟下再做逻辑重构、复制、重布线等优化,然后增量布局重新合法化。这步是可选的,但收益可观——第 4 章的核心。
- 布线:全局布线 + 详细布线,用片上可编程互连把所有信号连起来。第 2 章的主题。
- 比特流生成:把映射、布局、布线的结果变成能配置芯片的比特流,收工。
注意本综述讲解各章算法的顺序与流程顺序相反:先讲布线与布局(最下游),再往回讲到工艺映射、物理综合、高层次综合、功耗优化——因为下游步骤的定义最直观,倒着讲更容易建立全局图景。
一张表总览:流程步骤 ↔ 对应章节
| 流程步骤 | 干什么 | 对应篇章 |
|---|---|---|
| 布线 | 用片上可编程互连连通所有信号 | 综述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 到比特流的七个步骤各在做什么、对应综述的哪一章。
自测:F_s 和 F_c 有什么区别?
F_s(switch block flexibility)刻画开关块:一根导线进入开关块后能连到相邻通道里的几根导线。F_c(connection block flexibility)刻画连接块:逻辑块的一个输入/输出引脚能连到所在通道里的几根导线。前者管”路口”,后者管”上下匝道”。
自测:为什么 FPGA 的互连延迟是非单调的?
因为布线资源是分段预制的:短距离两点的信号可能被迫绕行长段导线、穿过多个可编程开关,而距离更远的两点可能恰好有专用直线资源。延迟取决于实际用的线段类型和开关数量,而不是几何距离。
自测:设计流程中"工艺映射"这步在干嘛?
把架构无关优化后的逻辑网络翻译成目标 FPGA 的逻辑单元:数据通路映射到片上硬核(乘法器、进位链加法器、存储块),控制逻辑映射到 K 输入 LUT。它是设计被最后”定型”的一步,对最终面积/性能/功耗影响巨大。
自测:为什么器件选择失败会让成本翻倍?
综合塞不下就得升级到容量更大的器件,频率不达标就得升级速度等级——两种情况器件价格都会涨 50%~100%。所以综合/布局布线工具的优化质量直接决定用多贵的芯片,这正是 FPGA CAD 研究的商业价值所在。
自测:CPLD 和 FPGA 的逻辑单元本质区别是什么?
FPGA 用 K 输入 LUT(真值表式、细粒度、可实现任意 K 输入函数);CPLD 用两级与-或结构(p-term 宏单元、粗粒度、适合宽输入低密度逻辑如状态机)。CPLD 互连更简单、延迟更可预测。