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

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

目录

[一、VPR 在 FPGA CAD 流程里的位置](#一、VPR 在 FPGA CAD 流程里的位置)

二、为什么一定要"参数化结构"?

[2.1 结构描述文件里有哪些关键参数?](#2.1 结构描述文件里有哪些关键参数?)

三、连接盒分布率:为什么"100%连"不一定好?

[四、布线资源图:把 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 流程中,大致扮演这样的角色:

  1. 输入:
    • 逻辑单元块网表(映射、打包之后的 BLE / CLB 级网表)
    • FPGA 结构描述文件(参数化的结构说明)
  2. 可选地进行布局,或者读入已有布局结果
  3. 在给定结构上运行布线:
    • 只做全局布线,或者
    • 同时做全局 + 详细布线
  4. 输出:
    • 各条互连的布线结果和长度
    • 布线资源利用率
    • 关键路径延时等时序统计

可以简单理解成:给 VPR 一个"网表 + 结构参数",它帮你把逻辑块放进 FPGA 阵列,然后把所有连线铺好,并告诉你"这块 FPGA 够不够大、跑多快"


二、为什么一定要"参数化结构"?

VPR 的一大设计目标,是方便研究各种不同的 FPGA 结构,而不是只服务某一家厂商的某一代产品。因此,它对工具提出两个要求:

  1. 尽量与具体结构解耦:布线器、图形显示、延时分析等模块都只操作"结构的图模型",而不依赖某个硬编码版图。
  2. 能方便描述不同结构:研究者只需改结构参数,而不是每次重画一整块布线图。

如果用"手画布线图"的方式来做研究,一个包含约 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_queueCost(n) 排序,相当于在布线资源图上跑"带启发式的迷宫算法"。


七、两种提速技巧:边界框 + 高扇出线网优化

书中额外提了两点实用的优化:

  1. 边界框限制:限制某条线网的搜索范围为其 bounding box 向外扩展 3 个通道,极大减少搜索空间,对布线质量影响很小。
  2. 高扇出线网复用波前 :对高扇出线网(如时钟、复位),不每个 sink 都从源端重新跑一遍迷宫,而是保留已有波前,在到达一个 sink 后,只在现有波前基础上继续扩展,CPU 时间可以降一个数量级。

八、与其他 CAD 工具的比较(布通率角度)

书中给出若干表格,把 VPR 与当时的多种 CAD 工具在 MCNC 基准电路上的表现做了对比,结论很清晰:

  • 在给定布局(如 Altor)的前提下,VPR 的布通率驱动布线器所需轨道数比第二名少约 10%
  • 如果连布局也用 VPR(基于模拟退火),相比 Altor 布局 + 其他布线器,轨道数可少 40% 左右
  • 如果把全局布线、详细布线拆开用不同工具(如 VPR 全局 + SEGA 详细),往往比 VPR 一体化布线多用不少轨道,说明"联合优化"更重要。

总结一下这部分主要讲的是:

  • VPR 如何用"参数化结构 + 自动图生成"支持各种 FPGA 架构研究
  • 布通率驱动布线器的成本函数、实现框架和工程上的调参经验
相关推荐
dzj202123 分钟前
Visual Studio2022中好用的AI编码工具介绍——Windsurf(Codeium)
ide·ai·visual studio·code
浩瀚之水_csdn1 小时前
vscode中运行html语言
ide·vscode·html
未来之窗软件服务1 小时前
工作自动化(1)用户引导自动化教程开发——仙盟创梦IDE
运维·ide·自动化·仙盟创梦ide·东方仙盟
JQLvopkk1 小时前
VSCode基础使用
ide·vscode·编辑器
一个没有本领的人1 小时前
vscode选择了正确的解释器,但终端显示运行的依然为原来的python版本
ide·vscode·python
工具罗某人2 小时前
IDEA JRebel插件实现热部署
java·ide·intellij-idea
南檐巷上学4 小时前
基于FPGA的音频信号监测识别系统
fpga开发·音频·verilog·fpga·傅立叶分析·fft·快速傅里叶变换
Aaron158811 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
小魏小魏我们去那里呀12 小时前
Alibaba Cloud DevOps Integration For JetBrains 插件使用指南
ide·阿里云·devops·jetbrains
碎碎思20 小时前
当 FPGA 遇见怀旧计算:486 与 Atari ST 的硬件级重生
fpga开发