FPGA 结构与 CAD 设计(第3章)上

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

一、前言:为什么"打包"这么关键?

在基于 LUT 的 FPGA 设计流程中,工艺映射完成后,我们得到的是大量的 LUT 和寄存器。如果直接把这些原始单元丢给布局布线工具,效率极低,而且无法充分利用 FPGA 芯片内部"簇化"的逻辑结构。

因此,现代 FPGA CAD 流程中有一个关键步骤:逻辑单元块打包(packing)。其目标是:

  1. 把 LUT + 寄存器组合成基本逻辑单元(BLE,Basic Logic Element);
  2. 把多个 BLE 打包成逻辑簇(Logic Cluster),与实际 FPGA 逻辑块结构对应;
  3. 在满足资源约束的前提下,尽量节省逻辑块数量,并为后续布局布线创造"好布"的结构。

第三章的前半部分,主要就围绕这一问题,提出并改进了两种经典打包算法:VPackT‑VPack

二、逻辑簇结构回顾:K、N、I、Mclk 四个参数

文中采用的逻辑簇(cluster)是一个两级层次结构:

  • 底层 :基本逻辑单元 BLE
    每个 BLE = 1 个 LUT + 1 个寄存器,LUT 输出既可以直出,也可以接入寄存器输出。
  • 上层 :逻辑簇
    一个簇中有 (N) 个 BLE,外加局部互连网络和簇输入输出。

一个逻辑簇可以由四个参数刻画:

  1. (K):LUT 的输入数(如 4 输入 LUT,则 K=4K=4);
  2. (N):簇中 BLE 的数量;
  3. (I):簇的外部输入数量(LUT 总输入数 K×NK×N 通常远大于 I);
  4. MclkMclk:簇中的时钟输入数量。

实际实现中,一般具有以下特征:

  • 簇内部连通性接近"全连通":
    任意 BLE 输入都可以接到任意簇输入或任意 BLE 输出;
  • 所有 BLE 输出都可以作为簇输出对外;
  • 这种高连通性极大简化了 CAD 工具中的可行性检查。

例如,若要判断能否把一组 BLE 打进同一个簇,只需统计它们对簇外部输入信号的需求数是否 ≤I≤I,以及使用的时钟个数是否 ≤Mclk≤Mclk​。

三、VPack:基于贪心 + 爬坡的逻辑簇打包算法

3.1 算法输入与输出

  • 输入

    • 由 LUT 和寄存器构成的网表;
    • 簇结构参数 N,I,K,MclkN,I,K,Mclk。
  • 输出

    • 逻辑簇级别的网表(每个簇内是多个 BLE)。

VPack 的打包过程分为两大阶段:

  1. 把 LUT 和寄存器打成 BLE;
  2. 再把 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 装进簇里。

一个簇要合法,必须满足:

  1. BLE 数量 ≤N;
  2. 从簇外部进入这些 BLE 的输入信号数 ≤I;
  3. 簇内使用的时钟信号数 ≤Mclk。

为同时兼顾逻辑利用率和易布线性,VPack 分两步:

  1. 贪心阶段(greedy)
    选种子 BLE,按"吸引因子"从大到小不断加入簇,前提是不会立即违反约束;
  2. 爬坡阶段(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):

  1. 选种子 BLE 时
    BaseBLECrit(B) = B 上所有连接中最大 ConnectionCriticality;
  2. 计算 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 等):

  1. 达到 98% 逻辑利用率所需的簇输入数

    T‑VPack 平均比 VPack 少约 3% 的簇输入数;

  2. 完成布线所需的最小通道宽度 Wmin⁡Wmin​

    • VPack:算术平均约 60.4;
    • T‑VPack:算术平均约 53.3;
      → 轨道数减少约 12%
  3. 布局布线后关键路径延迟(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 给出的,是一个兼顾打包、互连与时序的更现实的答案。

相关推荐
hui函数17 小时前
如何解决 PyCharm 控制台 pip install 报错 BadZipFile: File is not a zip file问题
ide·pycharm·pip
Aaron158818 小时前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
碎碎思19 小时前
在 FPGA 上实现并行脉冲神经网络(Spiking Neural Net)
人工智能·深度学习·神经网络·机器学习·fpga开发
微醺的老虎19 小时前
【工具】vscode格式化json文件
ide·vscode·编辑器
乔宕一19 小时前
vscode 设置每次调试 powershell 脚本都使用临时的 powershell 终端
ide·vscode·编辑器
shughui20 小时前
最新版IntelliJ IDEA下载+安装+汉化(详细图文)
java·ide·intellij-idea
怦怦蓝20 小时前
IDEA 开发邮件发送功能:全流程报错解决方案汇总
java·ide·intellij-idea·发邮件
集芯微电科技有限公司21 小时前
替代HT6310/KP3310离线式AC-DC无感线性稳压器
数据结构·人工智能·单片机·嵌入式硬件·fpga开发
stevenzqzq21 小时前
Android Studio Logcat 基础认知
android·ide·android studio·日志