FPGA 结构与 CAD 设计(第2章)

以下内容总结自《深亚微米FPGA结构与CAD设计》- 作为一个读书笔记与大家共享。部分内容为AI补充,不对的地方还请指出。

这一章做的事可以概括成一句话:

把"现代 FPGA 架构 + CAD 流程 + 时序模型"这一整套基础概念,从工程实现和研究视角系统地过一遍。

如果你打算做下面几件事中的任何一件,这一章的内容都很值得细读:

  • 自己做 FPGA 架构评估(比如做学术研究、改结构参数)
  • 深入理解布局布线背后的代价函数和算法,而不是只当 CAD 是"黑盒"
  • 想搞清楚:为什么互连比门延迟更要命

下面按逻辑顺序来讲解:先是 FPGA 结构本身,然后是 CAD 流程,再到核心算法(打包、布局、布线),最后是延时模型和时序分析。


一、FPGA 基本结构:三个关键组成 + 若干结构参数

1. 可编程技术:为什么几乎都用 SRAM

书中先从最底层的"可编程技术"讲起,主要有三类:

  1. SRAM 控制的可编程开关 (主流)
    • 用 SRAM 单元控制传输管、多路选择器、三态缓冲器。
    • 传输管用 nMOS 而不是互补传输门,原因是电子迁移率更高,速度更快。
    • Xilinx、Altera、大部分 Actel 新器件、Lucent、Vantis 等几乎都走这条路线。
  2. 反熔丝
    • Actel 传统 FPGA 的路线,一次性可编程,抗篡改设计等场景常见。
  3. 浮栅器件 (EPROM、EEPROM、Flash)
    • 常用于 CPLD 等复杂可编程逻辑器件。

对结构研究来说,SRAM 技术最重要,因为它直接决定:

  • 每个可编程开关的等效电阻、电容
  • 可编程开关的分类:pass transistor、mux、tri-state buffer
  • 进一步影响布线延时和面积模型

2. 逻辑单元块:4 输入 LUT 为何成为主流

接着,书里讲了逻辑单元块(Logic Block)------也就是 FPGA 里真正"干活"的逻辑模块。

核心要点:

  1. LUT(查找表)是主角
    • k 输入 LUT 需要 2^k 个 SRAM 单元 + 一个 2^k 选 1 的多路选择器;
    • 只要在 SRAM 中写入真值表,就能实现任意 k 输入布尔函数。
  2. 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. 综合与逻辑单元块打包

综合这一块,书里只简单回顾,不做深入算法研究,因为已有大量成熟成果。流程大致是:

  1. 工艺无关逻辑优化:删冗余、简化逻辑;
  2. 映射到 LUT 网表:把基本门网表转成由 LUT 组成的网表;
  3. 打包(pack):把多个 LUT + 寄存器合成一个逻辑单元块(即簇)。

打包这个步骤,书里讲得比较详细,因为对"基于簇的逻辑块结构"的研究至关重要。关键点有:

  • 打包同时要满足:
    • 簇内最大 LUT 数限制;
    • 最大输入信号数限制;
    • 最大时钟数限制。
  • 优化目标:
    • 把紧密相连的 LUT 合到一个簇,减少跨簇连线;
    • 尽量"装满"每个簇,减少逻辑单元块总数。

常见方法及其问题:

  • 谱方法:从图的特征向量里找自然簇,再做后处理施加尺寸/引脚约束。问题是后处理可能严重破坏原有"好"的簇划分。
  • 标签法(Labeling):在保证尺寸约束时,往往难以同时满足引脚约束。
  • 最大权匹配 / 贪心合并:利用"紧密度"(共享线网数目等)来指导两个簇是否合并。逻辑合理,但在大规模电路上复杂度可能上升到 O(n³),需要考虑效率。

书中特别提到一个贪心打包思想:定义两个簇的"closeness",考虑:

  • 共享线网数目;
  • 合并后簇的尺寸;
  • 簇引脚数等。

每次合并紧密度最大的两个簇,直到达到目标簇数量。这种思路很灵活,尽管原算法不是为 FPGA 专门设计,但非常值得借鉴。

2. 布局:为什么几乎都绕不开模拟退火

布局要解决的问题是:

给每个逻辑单元块在芯片上找一个位置,使得线长、拥挤度、时钟速度等指标尽量好。

主流三类算法:

  1. 最小割布局器(基于划分)
  2. 解析布局器
  3. 模拟退火布局

书中重点只留给模拟退火,原因很现实:想公平地比较不同 FPGA 结构,布局器必须能灵活适配不同结构的约束和目标,往现有的解析/最小割布局器里硬塞新目标比较痛苦,而模拟退火比较容易加新约束。

典型的退火流程:

  1. 初始:随机布局(或简单启发式布局)
  2. 外循环:降低温度 T
  3. 内循环:
    • 随机选取一个或一对逻辑块,尝试移动/交换
    • 计算成本变化 Δ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 类算法) 的思想:

  1. 迭代布线(rip-up and reroute)

    • 第一次迭代:忽略拥挤,所有线网都按最小成本布,哪怕互相重用同一资源;
    • 之后迭代:对发生"重用/冲突"的资源提高成本,拆线重布,直到不再有资源过载。
  2. 成本函数综合延时和拥挤度

    对于线网 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):当前迭代的拥挤度因子,随着重用次数和迭代进程调整。

    含义很清晰:

  3. 搜索策略

    • 通常采用宽度优先或 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):

  1. 建立时序图

    • 结点:LUT 输入/输出、寄存器输入/输出、主输入/输出等引脚;
    • 边:组合逻辑延时、布线延时等。
  2. 正向计算到达时间 T_arrival:

    • 从主输入和寄存器输出(无前驱的结点)开始,T_arrival = 0;

    • 对每个结点 i:

    • 扫完整个图后,最大到达时间就是电路的关键路径延时 D_max

  3. 反向计算需求时间 T_required:

    • 对主输出、寄存器输入,T_required 设为 D_max;

    • 逆拓扑遍历,对每个结点 i:

  4. 计算 slack(延时裕量):

    • 对连接 (i,j):

    • slack = 0:这条连接在某条关键路径上,多 1ns 就会拖慢整体时钟;

    • slack > 0:可以容忍被走慢一点(比如多绕几个开关或线段)。

这些 slack 值一方面告诉我们电路当前"能跑多快",另一方面为时序驱动布局布线提供了"优先级"依据:

  • 关键连接:用最短、最快的路;
  • 不关键的连接:允许走长一点的线段,帮助整体布通、节省好资源。

书中还提到"延时裕量分配"的思想:为每条连接分配一个允许的最大延时上界,只要布线延时不超过这个上界,电路的整体时钟就不会被拖慢。部分时序驱动 CAD 工具会直接用这些上界作为约束。


四、这一章到底帮了我们什么?

把这一章串起来看,它干的事可以概括为几个层面:

  1. 概念层面

    • 把可编程技术、LUT 结构、岛形布线、线段长度分布等基础概念一次讲清;
    • 定义了 W、Fc、Fs 等结构参数,为后面结构实验做符号统一。
  2. 算法层面

    • 概括了主流的打包、布局、布线算法及代表性工作;
    • 点明各自适用范围和存在的问题(如谱方法对多重约束适应性差、部分布线器不考虑时序等)。
  3. 评价体系层面

    • 给出了一套统一的延时模型(Elmore + RC 树)和时序分析框架;
    • 这使得后面可以在不用实际画版图的情况下,对大量不同结构方案进行公平对比。

从工程实践角度看,这一章给我们的启发包括:

  • 如果你只是用现成 FPGA 工具,"时序驱动""布局约束"等选项背后,大致就是这里描述的代价函数和算法。
  • 如果你打算做架构研究或写自己的 FPGA CAD:
    • 这一章等于是提供了一个"最小可行框架":结构参数 → CAD 流程 → 面积/延时模型;
    • 在此基础上,可以替换/改造某一环(例如提出新的线段长度分布、改造布线成本函数等),然后通过统一指标比较谁更好。
相关推荐
FPGA_小田老师2 小时前
FPGA例程(5):时钟(clock)分频倍频(PLL/MMCM)实验--vivado行为级仿真、综合后仿真和实现后仿真说明
fpga开发·pll·mmcm·run simulation·前仿真·后仿真
Lv11770082 小时前
Visual Studio中的正则表达式
ide·笔记·正则表达式·c#·visual studio
3有青年2 小时前
HPS cold reset pin和AVST configuration的功能和作用
fpga开发
Mr -老鬼2 小时前
Android studio 最新Gradle 8.13版本“坑点”解析与避坑指南
android·ide·android studio
3有青年18 小时前
Altera FPGA操作系统支持的情况分析
fpga开发
国科安芯19 小时前
卫星通讯导航FPGA供电单元DCDC芯片ASP4644S2B可靠性分析
单片机·嵌入式硬件·fpga开发·架构·安全性测试
夜流冰19 小时前
VSCode - 显示EOL字符的插件
ide·vscode·编辑器
啊湘21 小时前
vscode 使用 github (适用CURSOR等使用)
ide·vscode·github·cursor·mcp
stars-he1 天前
FPGA学习笔记-图书馆存包柜,乒乓球游戏电路设计
笔记·学习·fpga开发