以下内容总结自《深亚微米FPGA结构与CAD设计》- 作为一个读书笔记与大家共享。部分内容为AI补充,不对的地方还请指出。
一、前言:为什么"打包"这么关键?
在基于 LUT 的 FPGA 设计流程中,工艺映射完成后,我们得到的是大量的 LUT 和寄存器。如果直接把这些原始单元丢给布局布线工具,效率极低,而且无法充分利用 FPGA 芯片内部"簇化"的逻辑结构。
因此,现代 FPGA CAD 流程中有一个关键步骤:逻辑单元块打包(packing)。其目标是:
- 把 LUT + 寄存器组合成基本逻辑单元(BLE,Basic Logic Element);
- 把多个 BLE 打包成逻辑簇(Logic Cluster),与实际 FPGA 逻辑块结构对应;
- 在满足资源约束的前提下,尽量节省逻辑块数量,并为后续布局布线创造"好布"的结构。
第三章的前半部分,主要就围绕这一问题,提出并改进了两种经典打包算法:VPack 和 T‑VPack。
二、逻辑簇结构回顾:K、N、I、Mclk 四个参数
文中采用的逻辑簇(cluster)是一个两级层次结构:
- 底层 :基本逻辑单元 BLE
每个 BLE = 1 个 LUT + 1 个寄存器,LUT 输出既可以直出,也可以接入寄存器输出。 - 上层 :逻辑簇
一个簇中有 (N) 个 BLE,外加局部互连网络和簇输入输出。
一个逻辑簇可以由四个参数刻画:
- (K):LUT 的输入数(如 4 输入 LUT,则 K=4K=4);
- (N):簇中 BLE 的数量;
- (I):簇的外部输入数量(LUT 总输入数 K×NK×N 通常远大于 I);
- MclkMclk:簇中的时钟输入数量。
实际实现中,一般具有以下特征:
- 簇内部连通性接近"全连通":
任意 BLE 输入都可以接到任意簇输入或任意 BLE 输出; - 所有 BLE 输出都可以作为簇输出对外;
- 这种高连通性极大简化了 CAD 工具中的可行性检查。
例如,若要判断能否把一组 BLE 打进同一个簇,只需统计它们对簇外部输入信号的需求数是否 ≤I≤I,以及使用的时钟个数是否 ≤Mclk≤Mclk。
三、VPack:基于贪心 + 爬坡的逻辑簇打包算法
3.1 算法输入与输出
-
输入:
- 由 LUT 和寄存器构成的网表;
- 簇结构参数 N,I,K,MclkN,I,K,Mclk。
-
输出:
- 逻辑簇级别的网表(每个簇内是多个 BLE)。
VPack 的打包过程分为两大阶段:
- 把 LUT 和寄存器打成 BLE;
- 再把 BLE 打成逻辑簇。
3.2 阶段一:LUT + 寄存器 → BLE
基本规则很简单:
- 如果某 LUT 的输出只驱动 一个寄存器,就可以把这对 LUT+寄存器直接打成一个 BLE;
- 其他情况(例如 LUT 输出驱动多个寄存器),LUT 与寄存器需要分配到不同 BLE 中。
这一阶段本质上是"模式匹配",复杂度不高。
伪代码示意(简化版):
cpp
for each LUT L in netlist {
Reg = find_single_fanout_register(L);
if (Reg != NULL) {
create_BLE(L, Reg);
mark_used(L);
mark_used(Reg);
}
}
for each remaining LUT or register not used {
create_BLE_with_single_node(node);
}
3.3 阶段二:BLE → 逻辑簇
VPack 的核心在于第二阶段:如何把 BLE 装进簇里。
一个簇要合法,必须满足:
- BLE 数量 ≤N;
- 从簇外部进入这些 BLE 的输入信号数 ≤I;
- 簇内使用的时钟信号数 ≤Mclk。
为同时兼顾逻辑利用率和易布线性,VPack 分两步:
- 贪心阶段(greedy) :
选种子 BLE,按"吸引因子"从大到小不断加入簇,前提是不会立即违反约束; - 爬坡阶段(hill‑climbing) :
在必要时暂时允许超过簇输入数限制,从而探索更多组合,再回退到最近一次"合法"状态。
3.4 吸引因子与簇输入增加量
当考虑把 BLE (B) 加入当前簇 (C) 时,关键是看它会让簇的外部输入数量增加多少。论文给出的公式为:
- ∣Fanin(B)∣:B 所需的所有输入信号数;
- Nets(B):B 所在的所有线网集合;
- Nets(C):当前簇 C 相关的所有线网集合;
- 交集 ∣Nets(B)∩Nets(C)∣ 表示 B 与 C 在信号上的"共享程度",共享越多,簇外部新引入的信号越少。
贪心阶段通常会优先选择 ΔCluster_inputs(B) 最小 的合法 BLE 加入。
3.5 VPack 核心伪代码
结合文中伪代码,可以整理如下 C 代码框架:
objectivec
while (!UnclusteredBLEs.empty()) {
// 1. 选择种子:输出线最多的 BLE
BLE *seed = GetBLEwithMostOutputs(UnclusteredBLEs);
Cluster C = { seed };
remove_from_unclustered(seed);
// 2. 贪心阶段:按吸引因子加入 BLE
while (C.size() < N) {
BLE *best = MaxAttractionLegalBLE(C, UnclusteredBLEs);
if (best == NULL) break;
C.add(best);
remove_from_unclustered(best);
}
// 3. 爬坡阶段:允许暂时超过输入限制,以填满簇
if (C.size() < N) {
while (C.size() < N) {
BLE *best = MinClusterInputIncreaseBLE(C, UnclusteredBLEs);
if (best == NULL) break;
C.add(best);
remove_from_unclustered(best);
}
}
// 4. 若最终簇非法,则回退到最近一次合法状态
if (!ClusterLegal(C)) {
RestoreLastLegalState(C, UnclusteredBLEs);
}
OutputClusters.add(C);
}
3.6 爬坡阶段的意义与实际效果
有时增加一个 BLE,虽然短期内增加了簇输入数,但其输出被簇内其他 BLE 使用,最终可能反而减少簇所需的外部输入数,使簇"合拢"。
实测结果表明:
- 对许多电路,爬坡阶段对逻辑利用率的提升有限(<2%);
- 说明 VPack 的贪心策略本身已经相当有效。
3.7 复杂度与实践性能
VPack 算法复杂度约为:
- kmax:最大线网终端数;
- (K):LUT 输出数;
- (n):电路中 LUT 与寄存器数量之和。
在 300 MHz UltraSparc 工作站上,将 8381 个 4 输入 LUT + 31 个寄存器打包成簇仅需约 3 秒,说明该算法在工程实践中是完全可用的。
四、T‑VPack:时序驱动的逻辑簇打包
4.1 设计动机:关键路径优先
VPack 只关注逻辑利用率和簇间互连数量,对时序 (关键路径)不敏感。
而在深亚微米工艺下,簇间互连延迟远大于簇内局部互连延迟,因此:
若能让关键路径上的 BLE 尽量"挤进同一个簇",就可以显著缩短关键路径延迟。
T‑VPack(Timing‑driven VPack)正是基于这一思路,对 VPack 进行时序驱动改造。
4.2 时序分析与连接关键度
T‑VPack 内置一个时序分析器,对每个连接 i 计算其"关键度":
- (slack(i)):连接 i 的时序裕量;
- MaxSlackMaxSlack:电路中所有连接的最大裕量。
关键度接近 1,表示该连接更靠近电路关键路径。
互连延迟模型被简化为三个常数(实验设置不敏感):
- 逻辑延迟:LogicDelay = 0.1
- 簇内互连延迟:IntraClusterConnectionDelay = 0.1
- 簇间互连延迟:InterClusterConnectionDelay = 1.0
T‑VPack 并不追求精确到 ps 的延迟估计,而是通过一个粗略但一致的模型,给出连接相对重要性排序。
4.3 BLE 基本关键度 BaseBLECrit
T‑VPack 定义 BLE 的基本关键度 BaseBLECrit(B):
- 选种子 BLE 时 :
BaseBLECrit(B) = B 上所有连接中最大 ConnectionCriticality; - 计算 BLE 对当前簇 C 的吸引因子时 :
BaseBLECrit(B) = B 与 C 内 BLE 之间连接的最大 ConnectionCriticality;
若 B 与 C 无连接,则 BaseBLECrit(B) = 0。
4.4 两级淘汰机制:避免"孤立 BLE"
由于很多 BLE 会有相同 BaseBLECrit,需要进一步区分。文中提出了两级淘汰机制:
1、关键路径覆盖数 TotalPathsAffected(B)
定义两个中间量:
然后:
直观意义:B 所在的、以及通过 B 的关键路径数量。优先选取能"同时影响更多关键路径"的 BLE。
2、距离时序端点的远近
在一些特殊电路(例如只有一条关键路径)中,所有 BLE 在上述度量上都完全相同,这时再通过离路径源端的距离 来打破平局,优先选择靠近时序路径末端(靠近输出)的 BLE,可以减少把中间节点"折断"的机会,避免产出"孤立 BLE"。
基于这两个量,T‑VPack 调整 BLE 的最终关键度:
ϵ 很小(如 0.01),只在 BaseBLECrit 相同的时候起到"打破平手"的作用。
4.5 吸引因子函数的改造
相对于 VPack,T‑VPack 的吸引因子函数在 VPack 的基础上加了时序项:
其中:
- 第二项为 VPack 中的"共享线网"吸引项,MaxNetsMaxNets 为可连接到 BLE 的最大线网数,用于归一化;
- λλ 用于平衡时序优化与布线优化 :
- λ=0λ=0:退化为纯 VPack;
- λ=1λ=1:完全以时序为目标;
- 实验发现 λ∈[0.4,0.8]λ∈[0.4,0.8] 效果相近,文中取 0.75。
4.6 时序分析调用频率与复杂度
T‑VPack 的复杂度极大程度取决于"多久做一次时序分析":
- 若每打包一个 BLE 就更新一次时序分析 :
复杂度近似 O(n2)O(n2),打包 3833 个 BLE 可能要 15 分钟; - 若只在打包开始前做一次时序分析,后续不再更新关键度:
复杂度退回到 VPack 同一量级 (O(k n)),打包 4833 个 BLE 只需要几秒。
文中的结论是:
即便只在打包开始前做一次时序分析,T‑VPack 的结果质量也并未显著下降,足以说明粗粒度的关键度信息已经足够指导打包决策。
五、T‑VPack vs VPack:性能比较与结论
文中对 10 个最大 MCNC 基准电路进行测试,给出如下几个维度的对比(表 3.1 等):
-
达到 98% 逻辑利用率所需的簇输入数 :
T‑VPack 平均比 VPack 少约 3% 的簇输入数;
-
完成布线所需的最小通道宽度 WminWmin:
- VPack:算术平均约 60.4;
- T‑VPack:算术平均约 53.3;
→ 轨道数减少约 12%。
-
布局布线后关键路径延迟(nm):
- 在 无限宽互连资源 情况下(只优化速度):
- VPack 平均延迟 ≈ 54.0
- T‑VPack 平均延迟 ≈ 45.2
→ 延迟降低约 16%;
- 在 受限互连资源 情况下(通道宽度 = Wmin+20%Wmin+20%):
T‑VPack 仍能比 VPack 提升大约 7% 的速度。
- 在 无限宽互连资源 情况下(只优化速度):
更有意思的是:
即使在通道资源紧张时,T‑VPack 的结果既更快 ,又更省线(平均比 VPack 少 12% 的轨道),说明 T‑VPack 在时序与布线两方面都取得了更好的平衡。
六、工程视角:两种打包算法的使用建议
什么时候用 VPack?
- 需要快速评估结构或原型,时序要求不极端;
- 开发早期,关注逻辑利用率多于绝对性能。
什么时候用 T‑VPack?
- 面向深亚微米工艺、时序紧张的应用(高速 DSP、CPU 子模块等);
- 关键路径复杂、扇出高,希望通过结构优化减小互连延迟;
- 对 FPGA 架构研究者而言,需要更真实地模拟"时序驱动"的实际工具行为。
一句话总结:
如果你只做逻辑级别的"面积优化",而忽略了互连延迟带来的时序问题,很可能已经输在了起跑线上。T‑VPack 给出的,是一个兼顾打包、互连与时序的更现实的答案。