以下内容总结自《深亚微米FPGA结构与CAD设计》- 作为一个读书笔记与大家共享。部分内容为AI补充,不对的地方还请指出。
目录
[一、VPR 在 FPGA CAD 流程里的位置](#一、VPR 在 FPGA CAD 流程里的位置)
[2.1 结构描述文件里有哪些关键参数?](#2.1 结构描述文件里有哪些关键参数?)
[四、布线资源图:把 FPGA 看成一张大图](#四、布线资源图:把 FPGA 看成一张大图)
[6.1 成本函数设计](#6.1 成本函数设计)
[6.2 基本成本的工程取值](#6.2 基本成本的工程取值)
[6.3 布线伪代码框架](#6.3 布线伪代码框架)
[七、两种提速技巧:边界框 + 高扇出线网优化](#七、两种提速技巧:边界框 + 高扇出线网优化)
[八、与其他 CAD 工具的比较(布通率角度)](#八、与其他 CAD 工具的比较(布通率角度))
一、VPR 在 FPGA CAD 流程里的位置
整本书第四章讨论的是 VPR 工具里"布线部分"的实现逻辑。VPR(Versatile Place and Route)在一个典型的 FPGA CAD 流程中,大致扮演这样的角色:
- 输入:
- 逻辑单元块网表(映射、打包之后的 BLE / CLB 级网表)
- FPGA 结构描述文件(参数化的结构说明)
- 可选地进行布局,或者读入已有布局结果
- 在给定结构上运行布线:
- 只做全局布线,或者
- 同时做全局 + 详细布线
- 输出:
- 各条互连的布线结果和长度
- 布线资源利用率
- 关键路径延时等时序统计
可以简单理解成:给 VPR 一个"网表 + 结构参数",它帮你把逻辑块放进 FPGA 阵列,然后把所有连线铺好,并告诉你"这块 FPGA 够不够大、跑多快"。
二、为什么一定要"参数化结构"?
VPR 的一大设计目标,是方便研究各种不同的 FPGA 结构,而不是只服务某一家厂商的某一代产品。因此,它对工具提出两个要求:
- 尽量与具体结构解耦:布线器、图形显示、延时分析等模块都只操作"结构的图模型",而不依赖某个硬编码版图。
- 能方便描述不同结构:研究者只需改结构参数,而不是每次重画一整块布线图。
如果用"手画布线图"的方式来做研究,一个包含约 8000 个 4 输入 LUT 的 FPGA,其布线资源图可能超过 30 MB,而且每次改一个通道宽度 (W),都要重画一次,非常不现实。
书中的解决方案是:
- 让用户只写简洁的结构描述文件(参数形式)
- 由 VPR 内部的结构生成器 自动生成详细的布线资源图
2.1 结构描述文件里有哪些关键参数?
书中列了一组比较核心的参数,习惯上可以分为两类:
(1)几何和引脚相关
- 逻辑单元块的输入/输出引脚数
- 每个引脚在哪一条边(上/下/左/右)
- 输入/输出引脚之间的逻辑等价关系(比如 LUT 的所有输入是等价的)
- 每行/每列可以放多少 I/O 端口
(2)布线资源相关
- 水平 / 垂直布线通道的相对宽度
- 各区域布线宽度(轨道数)分布
- 连接盒、开关盒的拓扑和分布率(后面详细说)
- 各种互连线段的类型及属性:
- 长度(跨越多少个逻辑块)
- 所占通道宽度百分比(比如"20% 2 倍线 + 80% 5 倍线")
- 开关类型(传输管 / 三态缓冲器)
- 开关盒、拐角盒在这些线段上的分布率
再加上一组时序参数:
- 不同开关的等效电阻 RswitchRswitch、输入/输出电容、本征延时
- 不同长度互连线段的 (R)/(C)
- 逻辑块内部组合 / 时序单元延时
- I/O 端口延时
有了这些,VPR 就可以既做布线,又做基于 Elmore 模型的延时分析。
三、连接盒分布率:为什么"100%连"不一定好?
书中用了一个比较典型的例子:长度为 5 的互连线段跨越 5 个逻辑块,其连接盒分布率有几种情况:
- 100%:能连它经过的每个逻辑块 → "完全分布"
- 40%:只在两端插连接盒 → 实际上是"完全不分布"(只连端点)
- 60%:两头 + 中间一个逻辑块可以连 → "部分分布"
- 80%:两头 + 两个内部块可以连
直观感受是:
- 分布率高:灵活性强,但开关多、延时和面积开销大
- 分布率低:结构规则、实现简单,但路不好走,容易堵
VPR 允许用"百分比"的方式来定义这些分布率,并把线段类型的数量定义成相对 (W) 的比例,如"20% 2 倍线 + 80% 5 倍线",而不是写死"有几根某类型的线"。
这样结构描述文件就可以在不改格式的前提下,自由修改 (W) 和线段组合,方便做结构-性能的探索。
四、布线资源图:把 FPGA 看成一张大图
VPR 的布线器不直接操作"版图",而是操作一个叫"布线资源图"(routing resource graph)的有向图:
- 结点(node) :
- 互连线段
- LUT / CLB 的输入引脚、输出引脚
- 源端(source)与汇端(sink)
- 边(edge) :
- 单向:缓冲器
- 成对有向边:双向开关(传输管)
举一个关键细节:逻辑等价引脚 。以一个 4 输入 LUT 为例,它有 4 个互相等价的输入引脚。VPR 为这 4 个引脚建一个共享的源端节点,源端的"容量"设为 4:
- 容量(capacity):一个节点最多能被多少条线网共享
- 对普通互连线段、引脚:capacity = 1
- 对源端 / 汇端:capacity 可以 > 1
这样做的好处是显而易见的:不用在图里真的画出 K4,4K4,4 完全二分图来表达"4 个逻辑等价输入互相可替换"。
在全局布线模式下,VPR 把每个"跨越 1 个逻辑块的通道线段"抽象成一个结点,其容量 = 该通道中轨道数。这样全局布线只关心"走哪一条轨",而不关心"轨道号几号"。
五、自动结构生成与"调整线段起始点"的技巧
书中还详细讨论了一个常被忽视、但实际做结构设计一定会踩的坑:水平约束 vs 垂直约束冲突。
问题来源是:如果你简单地"复制同一个水平通道和垂直通道的单元块",再按指定的分布率插开关,很可能出现:
- 某个位置垂直线要连水平线,但水平线那边没有开关
- 或者反过来
解决办法是:调整每一条线段的"起始点",即交错布线线段的起始位置。
书中给出了一个坐标系定义:
- 逻辑块阵列左下角为 ((1,1))
- 向右是 (x) 轴,向上是 (y) 轴
- 水平通道的纵坐标与其下方逻辑块相同
- 垂直通道的横坐标与其左侧逻辑块相同
例如,对长度为 3 的线段,可以规定:
(i+2) mod 3=0⇒起始于第 0 号水平轨道(i+2)mod3=0⇒起始于第 0 号水平轨道
通过在 j+1j+1 号通道上把线段的起点相对于第 (j) 号通道整体平移一个逻辑块,就能在全阵列中统一满足"水平/垂直约束 + 分离型开关盒拓扑 + 指定分布率"。
最终的结果是:
- 既满足约束
- 又保持了"基于基本单元块的版图":整片 FPGA 通过复制一个 tile 完成
六、布通率驱动布线器:只关心"能不能走得过"
VPR 集成了两类布线器:
- 布通率驱动:只管"能不能布通,尽量少用轨道"
- 时序驱动:在布通基础上进一步优化关键路径延时(下篇详细讲)
这一节重点是布通率驱动布线器。
6.1 成本函数设计
核心公式:
含义:
- (b(n)):基本成本
- (h(n)):历史拥挤度惩罚项
- (p(n)):当前拥挤度惩罚项
- (BendCost(n,m)):从节点 (m) 转到节点 (n) 时,是否引入"拐弯"的惩罚(全局布线时使用)
当前拥挤度:
历史拥挤度(第 (i) 次迭代):
其中 occupancy 是当前有多少条线网占用这个节点,capacity 则是允许的最大条数(通常是 1)。
整体策略是:迭代布线 → 统计拥挤 → 提高被挤节点成本 → 下一轮重布。
6.2 基本成本的工程取值
书中给了一个经验表(表 4.1):
| 资源类型 | (b(n)) |
|---|---|
| 互连线段 | 1.0 |
| 逻辑块输出引脚 | 1.0 |
| 逻辑块输入引脚 | 0.95 |
| 源端 | 1.0 |
| 汇端 | 0 |
几个要点:
- 把大部分互连线的基本成本统一设为 1,反而比"按延时/长度比例"更省轨道。
- 把输入引脚 / 汇端的成本略低,有利于波前尽快"收敛到终点",CPU 时间能提速 1.5~2 倍。
6.3 布线伪代码框架
用伪代码描述布通率驱动布线器的大致结构:
// 外层迭代:逐步消除拥挤
while (存在过度使用的布线资源 && 迭代次数 < 上限) {
for each net i in all_nets {
rip_up(net i); // 把原来的路径拆掉,释放资源
for each sink j of net i { // 逐个接收端布线(可按某种顺序)
// 以当前部分树为起点,做波前扩展
init_priority_queue_from_partial_tree();
while (sink j 未到达) {
node m = pop_node_with_min_cost();
for each 邻居节点 n of m {
计算 Cost(n);
if (新的路径成本更优)
push/update n in priority_queue;
}
}
// 回溯,从 sink j 把路径更新到 net i 的树上
commit_path_to_tree();
更新当前拥挤度 p(n);
}
}
更新历史拥挤度 h(n);
}
这里的 priority_queue 按 Cost(n) 排序,相当于在布线资源图上跑"带启发式的迷宫算法"。
七、两种提速技巧:边界框 + 高扇出线网优化
书中额外提了两点实用的优化:
- 边界框限制:限制某条线网的搜索范围为其 bounding box 向外扩展 3 个通道,极大减少搜索空间,对布线质量影响很小。
- 高扇出线网复用波前 :对高扇出线网(如时钟、复位),不每个 sink 都从源端重新跑一遍迷宫,而是保留已有波前,在到达一个 sink 后,只在现有波前基础上继续扩展,CPU 时间可以降一个数量级。
八、与其他 CAD 工具的比较(布通率角度)
书中给出若干表格,把 VPR 与当时的多种 CAD 工具在 MCNC 基准电路上的表现做了对比,结论很清晰:
- 在给定布局(如 Altor)的前提下,VPR 的布通率驱动布线器所需轨道数比第二名少约 10%。
- 如果连布局也用 VPR(基于模拟退火),相比 Altor 布局 + 其他布线器,轨道数可少 40% 左右。
- 如果把全局布线、详细布线拆开用不同工具(如 VPR 全局 + SEGA 详细),往往比 VPR 一体化布线多用不少轨道,说明"联合优化"更重要。
总结一下这部分主要讲的是:
- VPR 如何用"参数化结构 + 自动图生成"支持各种 FPGA 架构研究
- 布通率驱动布线器的成本函数、实现框架和工程上的调参经验