以下内容总结自《深亚微米FPGA结构与CAD设计》- 作为一个读书笔记与大家共享。部分内容为AI补充,不对的地方还请指出。
这一章做的事可以概括成一句话:
把"现代 FPGA 架构 + CAD 流程 + 时序模型"这一整套基础概念,从工程实现和研究视角系统地过一遍。
如果你打算做下面几件事中的任何一件,这一章的内容都很值得细读:
- 自己做 FPGA 架构评估(比如做学术研究、改结构参数)
- 深入理解布局布线背后的代价函数和算法,而不是只当 CAD 是"黑盒"
- 想搞清楚:为什么互连比门延迟更要命
下面按逻辑顺序来讲解:先是 FPGA 结构本身,然后是 CAD 流程,再到核心算法(打包、布局、布线),最后是延时模型和时序分析。
一、FPGA 基本结构:三个关键组成 + 若干结构参数
1. 可编程技术:为什么几乎都用 SRAM
书中先从最底层的"可编程技术"讲起,主要有三类:
- SRAM 控制的可编程开关 (主流)
- 用 SRAM 单元控制传输管、多路选择器、三态缓冲器。
- 传输管用 nMOS 而不是互补传输门,原因是电子迁移率更高,速度更快。
- Xilinx、Altera、大部分 Actel 新器件、Lucent、Vantis 等几乎都走这条路线。
- 反熔丝
- Actel 传统 FPGA 的路线,一次性可编程,抗篡改设计等场景常见。
- 浮栅器件 (EPROM、EEPROM、Flash)
- 常用于 CPLD 等复杂可编程逻辑器件。
对结构研究来说,SRAM 技术最重要,因为它直接决定:
- 每个可编程开关的等效电阻、电容
- 可编程开关的分类:pass transistor、mux、tri-state buffer
- 进一步影响布线延时和面积模型
2. 逻辑单元块:4 输入 LUT 为何成为主流
接着,书里讲了逻辑单元块(Logic Block)------也就是 FPGA 里真正"干活"的逻辑模块。
核心要点:
- LUT(查找表)是主角
- k 输入 LUT 需要 2^k 个 SRAM 单元 + 一个 2^k 选 1 的多路选择器;
- 只要在 SRAM 中写入真值表,就能实现任意 k 输入布尔函数。
- 4 输入 LUT 的结论
- 过往大量研究表明:4 输入 LUT 的面积利用率最优(综合考虑所需逻辑块数 + 每个块内部 SRAM 开销)。
- 因此主流 FPGA 都选 4-LUT 作为基本单元。
但现代 FPGA 并不是"一个 LUT 就一个逻辑块"这么简单,而是:
用若干个 LUT + 寄存器 + 局部互连,组成一个更大的逻辑单元块(可以理解成"逻辑簇"雏形)。
书里还引用了几类研究来说明这一点:
- 混合 LUT 尺寸(例如一部分是 4-LUT,一部分是 2-LUT),可以减少 SRAM 数目和引脚数量,从而提升面积效率;
- 多个 LUT 通过固定连接构成更大逻辑单元块,有时可以在逻辑上加快 20% 左右,但面积模型要小心:如果没考虑互连晶体管尺寸增加,结论会偏乐观。
对后面第 6 章的"簇化逻辑块结构"研究,这里等于打了一个基础:合理的 LUT 组合与簇内互连,对性能和面积都有很大影响。
3. 布线结构:岛形 FPGA、Fc、Fs 和线段长度分布
书中把商用 FPGA 布线结构分成三类:
- 岛形结构(Xilinx、Lucent、Vantis)
- 基于行的结构(Actel)
- 层次化结构(Altera)
本书接下来的研究几乎全部**围绕"岛形结构"**展开。
岛形结构的直观图像:
- 逻辑单元块像"岛",四周被预先布好的水平/垂直布线通道环绕;
- 逻辑块通过 连接盒(Connection Box) 连到通道里的线段;
- 水平和垂直通道交叉处有 开关盒(Switch Box),负责线段之间的互连。
一些重要参数和结论:
- W:通道宽度(每个通道内的线段数)
- Fc:连接盒连接度,即每个逻辑块引脚能接入通道里多少条线
- Fs:开关盒连接度,即每条线在开关盒里能连到多少其他线
早期工作主要研究"只跨一个逻辑块的线段"的结构(所有线段长度都为 1),用布线资源中可编程开关个数来衡量面积利用率。结论大致是:
- Fs 取 3 或 4,Fc 约为 0.7W~0.9W 时,面积利用率最好;
- 若 Fs=2,虽然开关盒功能相对较弱,但如果 CAD 工具针对性优化,也能用得还行,不过 Fs=3 的结构面积上仍有约 25% 优势。
进一步的研究开始考虑不同长度的线段,比如长度为 1、2、4 的线:
- 线段长度分布(每种长度线段占多大比例)会影响:
- 所需开关个数(面积)
- 平均线网延时(速度)
- 有人对基于行的 FPGA 做过自动生成线段长度分布的工具,发现:
- 泊松分布相对"全是长度 1 线段"的均匀分布,可以减少平均需要的可编程开关数(有利于速度),但要多一点布线面积。
对岛形 FPGA 的研究也给出了一些经验规律:
- 太长的线(>3、4 个逻辑块)没有太大必要;
- 兼顾速度与面积时,比较好的分布大概是:
- 40%~70% 的长度 3 线;
- 10%~50% 的长度 2 线;
- 10%~20% 的长度 1 线。
不过,这些结论受限于当时 CAD 工具的能力(例如全局布线阶段并不知道线段分布),书中也点出这些工作的不足,为后续章节铺垫:要用更智能的 CAD 才能真正吃干榨尽结构的潜力。
二、FPGA CAD 流程:综合、打包、布局、布线
书中随后切换到 CAD 视角,讲的是:如何把一个 VHDL/原理图描述的电路,变成 FPGA 上每个开关的"0/1"配置。
1. 综合与逻辑单元块打包
综合这一块,书里只简单回顾,不做深入算法研究,因为已有大量成熟成果。流程大致是:
- 工艺无关逻辑优化:删冗余、简化逻辑;
- 映射到 LUT 网表:把基本门网表转成由 LUT 组成的网表;
- 打包(pack):把多个 LUT + 寄存器合成一个逻辑单元块(即簇)。
打包这个步骤,书里讲得比较详细,因为对"基于簇的逻辑块结构"的研究至关重要。关键点有:
- 打包同时要满足:
- 簇内最大 LUT 数限制;
- 最大输入信号数限制;
- 最大时钟数限制。
- 优化目标:
- 把紧密相连的 LUT 合到一个簇,减少跨簇连线;
- 尽量"装满"每个簇,减少逻辑单元块总数。
常见方法及其问题:
- 谱方法:从图的特征向量里找自然簇,再做后处理施加尺寸/引脚约束。问题是后处理可能严重破坏原有"好"的簇划分。
- 标签法(Labeling):在保证尺寸约束时,往往难以同时满足引脚约束。
- 最大权匹配 / 贪心合并:利用"紧密度"(共享线网数目等)来指导两个簇是否合并。逻辑合理,但在大规模电路上复杂度可能上升到 O(n³),需要考虑效率。
书中特别提到一个贪心打包思想:定义两个簇的"closeness",考虑:
- 共享线网数目;
- 合并后簇的尺寸;
- 簇引脚数等。
每次合并紧密度最大的两个簇,直到达到目标簇数量。这种思路很灵活,尽管原算法不是为 FPGA 专门设计,但非常值得借鉴。
2. 布局:为什么几乎都绕不开模拟退火
布局要解决的问题是:
给每个逻辑单元块在芯片上找一个位置,使得线长、拥挤度、时钟速度等指标尽量好。
主流三类算法:
- 最小割布局器(基于划分)
- 解析布局器
- 模拟退火布局
书中重点只留给模拟退火,原因很现实:想公平地比较不同 FPGA 结构,布局器必须能灵活适配不同结构的约束和目标,往现有的解析/最小割布局器里硬塞新目标比较痛苦,而模拟退火比较容易加新约束。
典型的退火流程:
- 初始:随机布局(或简单启发式布局)
- 外循环:降低温度 T
- 内循环:
- 随机选取一个或一对逻辑块,尝试移动/交换
- 计算成本变化 ΔC
- 如果 ΔC < 0(变好),直接接受;
- 如果 ΔC > 0,以概率 exp(-ΔC/T) 接受(给自己"翻山越岭"的机会)
一些细节:
- 初始温度可以设为:20 ×(一组随机移动的成本标准差)
- 温度更新:T_new = λ × T_old,典型 λ≈0.7
- 有的退火表会动态监控"被接受的移动比例",比如目标是在每个温度点接受率保持在 0.44 左右,就可以通过调节移动范围 Rlimit 来控制搜索"跳动幅度"。
对 FPGA 来说,还有一个额外目标:布通率(是否能布通)。有些 FPGA(如 Triptych)需要保持约 50% 左右的逻辑块空闲率才能有希望布通,布局时就要把"局部布线密度"纳入成本函数。
3. 布线:从迷宫算法到时序驱动的路径搜索器
在布局完成后,布线器要负责:
在有限且预定义的布线资源图(Routing Resource Graph)上,为每条线网找一条合适的路径。
书中采用的模型:
- 用有向图描述 FPGA 布线结构;
- 结点:逻辑引脚、布线线段、开关点等;
- 边:可能的连接方式(包括方向性:缓冲器、多路选择器等)。
基本问题:每条线网的源端到所有接收端,找一棵树(Steiner 树),同时满足:
- 尽量短,减少延时;
- 避免和其它线网在有限资源上冲突(拥挤);
- 时序关键的线网优先用"好资源"。
书里重点介绍了 时序驱动路径搜索器(Pathfinder 类算法) 的思想:
-
迭代布线(rip-up and reroute)
- 第一次迭代:忽略拥挤,所有线网都按最小成本布,哪怕互相重用同一资源;
- 之后迭代:对发生"重用/冲突"的资源提高成本,拆线重布,直到不再有资源过载。
-
成本函数综合延时和拥挤度
对于线网 i 的某个端点 j,其关键度定义为:
Crit(i,j)=1−slack(i,j)DmaxCrit(i, j) = 1 - \frac{slack(i, j)}{D_{max}}Crit(i,j)=1−Dmaxslack(i,j)其中 D_max 是整个电路的关键路径延时,slack 是该连接的延时裕量。
结点 n 的成本:
- Crit 越大(越关键),就越在意延时项;
- Crit 越小,就越偏重规避拥挤;
- h(n)、p(n) 控制了"让路"和"逐步惩罚"的过程。
-
- delay(n):该布线资源自身延时;
- b(n):基础成本(通常也取 delay(n));
- h(n):历史拥挤度,每次使用都会增加;
- p(n):当前迭代的拥挤度因子,随着重用次数和迭代进程调整。
含义很清晰:
-
搜索策略
- 通常采用宽度优先或 A* 式搜索,在布线资源图中从已布好的部分扩展,直到连接到目标端点;
- 每轮布线迭代结束,会做一次完整的时序分析,更新 Crit(i,j),为下一轮提供更准的信息。
这一套算法的优点是:
- 允许在早期暂时"违规重用资源",保留更多搜索自由度;
- 随着迭代推进,通过上调拥挤成本,逐渐逼系统走到既满足布通,又兼顾关键路径延时的解。
三、延时模型与时序分析:把"快不快"量化出来
最后一块内容,是这章非常关键、但往往在工程实践中被"工具黑盒化"的部分:延时模型和时序分析。
1. Elmore 延时模型:简单但够用
目标是:给定一条线网的布线树结构,估算从源到某个端点的延时。
理想方式当然是用 SPICE 仿真每条线,但对一个有上万线网的电路来说,这是不现实的。于是需要抽象的 RC 模型。
书中采取的做法是:
-
对传输管、缓冲器、线段都用等效 RC 元件建模;
-
整个布线是一棵 RC 树(含缓冲器时是带源分段的 RC 树);
-
使用 Elmore 延时 来估计源到端点的延时:
- R_i:路径上第 i 个单元的等效电阻;
- C(subtree_i):以该单元为根的"下游子树"的总电容;
- T_{d,i}:如果该单元是缓冲器,则加上其本征延时,否则为 0。
Elmore 模型的优点:
- 在线性时间内可以算完;
- 尽管数值上不如 SPICE 精确,但在拓扑排序和相对比较上非常可靠 :
- 哪个拓扑更慢、哪个更快,排序基本不会错;
- 对"比较不同 FPGA 结构"和"在布线时选择更好拓扑"来说,这就足够了。
2. 时序分析:T_arrival、T_required 和 slack
有了延时模型,就可以做时序分析了。书中的流程是典型的静态时序分析(STA):
-
建立时序图
- 结点:LUT 输入/输出、寄存器输入/输出、主输入/输出等引脚;
- 边:组合逻辑延时、布线延时等。
-
正向计算到达时间 T_arrival:
-
从主输入和寄存器输出(无前驱的结点)开始,T_arrival = 0;
-
对每个结点 i:
-
扫完整个图后,最大到达时间就是电路的关键路径延时 D_max。
-
-
反向计算需求时间 T_required:
-
对主输出、寄存器输入,T_required 设为 D_max;
-
逆拓扑遍历,对每个结点 i:
-
-
计算 slack(延时裕量):
-
对连接 (i,j):
-
slack = 0:这条连接在某条关键路径上,多 1ns 就会拖慢整体时钟;
-
slack > 0:可以容忍被走慢一点(比如多绕几个开关或线段)。
-
这些 slack 值一方面告诉我们电路当前"能跑多快",另一方面为时序驱动布局布线提供了"优先级"依据:
- 关键连接:用最短、最快的路;
- 不关键的连接:允许走长一点的线段,帮助整体布通、节省好资源。
书中还提到"延时裕量分配"的思想:为每条连接分配一个允许的最大延时上界,只要布线延时不超过这个上界,电路的整体时钟就不会被拖慢。部分时序驱动 CAD 工具会直接用这些上界作为约束。
四、这一章到底帮了我们什么?
把这一章串起来看,它干的事可以概括为几个层面:
-
概念层面
- 把可编程技术、LUT 结构、岛形布线、线段长度分布等基础概念一次讲清;
- 定义了 W、Fc、Fs 等结构参数,为后面结构实验做符号统一。
-
算法层面
- 概括了主流的打包、布局、布线算法及代表性工作;
- 点明各自适用范围和存在的问题(如谱方法对多重约束适应性差、部分布线器不考虑时序等)。
-
评价体系层面
- 给出了一套统一的延时模型(Elmore + RC 树)和时序分析框架;
- 这使得后面可以在不用实际画版图的情况下,对大量不同结构方案进行公平对比。
从工程实践角度看,这一章给我们的启发包括:
- 如果你只是用现成 FPGA 工具,"时序驱动""布局约束"等选项背后,大致就是这里描述的代价函数和算法。
- 如果你打算做架构研究或写自己的 FPGA CAD:
- 这一章等于是提供了一个"最小可行框架":结构参数 → CAD 流程 → 面积/延时模型;
- 在此基础上,可以替换/改造某一环(例如提出新的线段长度分布、改造布线成本函数等),然后通过统一指标比较谁更好。