这一篇在干嘛?

工艺映射(technology mapping)是把与工艺无关的门级网络”切”成目标 FPGA 的逻辑单元(K 输入 LUT)的过程。它是设计流程中最后一次变换,切法直接决定最终的面积、速度和功耗。本篇讲映射问题的标准框架——cut 枚举 + 动态规划,以及面积/时序两条优化路线。

问题定义:用 K-LUT 盖住一张图

映射的输入是逻辑门网络(有向图:节点是门,边是连接,边上可以带权重表示中间隔了几个寄存器),输出是 K-LUT 网络。主流算法是**结构式(structural)**的:不改逻辑功能,只做”覆盖(covering)“——用一个个 K-可行锥(K-feasible cone) 盖住网络,每个锥装进一个 LUT。

先记三个关键概念:

  • fanin cone(扇入锥):以节点 为根、连同它一部分前辈构成的子网络,锥内所有路径都汇到根。可以想成”从 往源头看的势力范围”。
  • MFFC(最大无扇出锥) 的最大一个扇入锥,锥内除根之外所有节点的扇出都留在锥内。把它整体替换成一个 LUT 时,不会漏掉锥内节点在外面的用户——这是映射的基本积木。
  • cut(割):一组节点,从这些节点”剪断”就能把根和输入隔开;如果割里节点数 ≤ K,就叫 K-可行割,正好对应一个 K-LUT 的输入集合。

图3.1 结构式映射三步:(a)原始网络,(b)用K-可行锥覆盖(节点x被两个锥共享、会复制),(c)最终LUT映射解

注意图里一个重要现象:节点 x 同时出现在两个锥里,会被复制——复制是映射算法提高质量的重要手段,也是面积估算变难的根源(后面会反复出现)。

另一类是**函数式(functional)**映射:把映射当成布尔变换/分解来解,解空间更大但太慢,只适合小电路;近年趋势是在结构式框架里嵌入函数式探索,两全其美。

结构式映射的标准框架

整个流程三段:先用与工艺无关的技术(节点提取/替换、don’t-care 优化等)优化网络 → 分解成两输入网络(dmig 等类 Huffman 树算法)→ 覆盖。覆盖这一步绝大多数算法共享同一个动态规划骨架,分四步:

  1. cut 生成/枚举
  2. cut 排序(打分)
  3. cut 选择
  4. 生成最终映射解

排序通常按拓扑序(从输入到输出)推进,选择通常按逆拓扑序(从输出往输入)推进——先定输出端的选择,再往回铺。

Cut 枚举:全部 K-cut 一网打尽

K 是个很小的常数(3~7),所以现代算法干脆枚举每个节点的所有 K-cut,选择时灵活度最大。枚举是个自底向上的合并过程:对两输入的节点 (扇入 ):

白话解释:节点 的所有割 = 自己的平凡割(只有自己),加上两个扇入的割两两求并集,并把超过 K 个元素的丢掉。反复用这个公式、自 PI 向 PO 推一遍,每个节点的全部 K-cut 就都有了。支配割(是其他割超集的)可以删掉,不影响质量。

更早的 FlowMap 算法不是枚举所有割,而是用最大流计算直接给每个节点找一个深度最优的单割——它是第一个在多项式时间内求出深度最优映射的算法,是本领域的里程碑。

Cut 打分:面积与深度

面积打分:有效面积(effective area)

LUT 映射的面积 = LUT 总数,最小化是 NP-hard 的,只能用启发式打分。难点在于**多扇出节点与重汇聚(reconvergence)**让”局部贪心”算不准全局面积。

有效面积的思想很直观:把每个节点的面积成本平摊给它的各个扇出,这样信号被多个 LUT 共享时成本自动分摊。对割

白话解释:割 的面积成本 = 割内每个节点 的累计成本除以它的扇出数(因为它被几个用户共享,每人摊一份),加上本 LUT 自身的面积 。节点自身的成本取其所有割中最小的那个。

有效面积在”不复制节点”的映射下是精确的;一旦允许复制就会低估——下图里 LUT(u) 顺带盖住了 w,w 的 LUT 实际完全是为 服务的,但平摊公式只给它记了一半的账。

图3.2 有效面积在允许复制时会低估:整体解3个LUT,有效面积只算出2.5

结论:有效面积是真实面积的下界,算法实际结果离下界的距离是衡量映射器好坏的标尺。

时序打分:标签(label)

映射阶段没有布局信息,所以时序目标通常就是最小化 LUT 级数(映射深度)。FlowMap 引入的动态规划打标法:PI 的标签为 0,对节点 的每个割:

白话解释:如果用割 盖成一个 LUT,那么信号到达 的时间 = 割内所有输入节点的标签取最大值,再加这一级 LUT 的延迟 ——关键路径由最慢的那个输入决定。节点的标签取所有割中的最小值,从 PO 往回选割并追踪,就得到深度最优解。

面积优化算法

PRAETOR:让扇出共享同一个割

在有效面积打分之上加两招:

  • 鼓励公共子割:同一节点的不同扇出如果给该节点”指定”了不同的割,就会被迫复制该节点。PRAETOR 给节点编号,对有效面积并列的割按字典序统一排序,保证大家选得一致——扇出们指向同一个割,复制自然就少了。
  • 两遍 cut 选择:第一遍找出”不可复制”的节点(non-duplicable),宣布它们为割边界,第二遍时把包含它们的割全部剔除。下图例子里,第一遍得到 4 个 LUT( 被复制),第二遍禁止包含 的割后,逼着 选择包含 的割,最终只要 3 个 LUT。

图3.3 排除含不可复制节点的割:第一遍4个LUT(a),第二遍3个LUT(b)

PRAETOR 的结果离有效面积下界只差 14%。

IMap:用迭代反馈修正扇出估计

有效面积公式里的 用的是初始网络的扇出数,而真正该用的是最终映射解里的扇出数——后者映射完才知道。IMap 的解法是迭代:每轮映射后,用上一轮的真实扇出数修正估计值:

白话解释:新估计 = 旧估计与上轮实际值的加权平均( 取 1.5~2.5)。估计越准,面积打分越准,下一轮选割越聪明——类似”先按地图走一遍,再用实测路况修正地图”。

离最优还有多远?

LEKO/LEKU 实验给出了一面镜子:学术和商业映射器在已知最优解的例子上平均差 15%;在需要”逻辑优化+映射”联合解题的 LEKU 例子上更是差出 70 倍以上——说明这个领域的提升空间还很大。

DAOmap:保深度、砍面积

DAOmap 在保证最优延迟的同时大幅减面积,三招:增强的有效面积公式(对潜在复制加惩罚修正项 ,鼓励”小割盖大锥”)、利用非关键路径上的富余 slack 换面积(只要延迟增加不超 slack 就选面积更小的割)、多轮迭代选割并基于输入共享调整代价。平均比以往延迟最优算法省 13% 面积,还因高效的割枚举比流计算算法快好几倍。

一体化映射:和上下游一起做

单独把每步做到最优,整体未必最优。三大联合方向:

分解 + 映射

分解成两输入网络的方式会影响映射深度,但两输入网络的深度并不能准确预测最终映射深度。**choice node(选择节点)**方案:把一个节点所有”功能等价但结构不同”的分解都编码进映射图(每对互补的选择节点叫一个 ugate),割枚举和打标都扩展到选择节点上(取各分支的并/最小值),映射时再从中挑出最好的分解。

图3.5 编码了函数xyz所有可能分解的映射图:在每个choice node处选一个分支即得一种分解

逻辑综合 + 映射:无损综合(lossless synthesis)

更激进的思想:不做选择,攒着选项。逻辑优化的中间网络不丢弃,全部合并进一张 choice network(用 SAT + 仿真找功能等价点来压缩),映射时才统一拍板——时序关键段可以取自”为速度优化”的版本,非关键段取自”为面积优化”的版本,逐段混搭。基准测试上面积和时序同时改善 7%。

图3.6 把两个等价网络合并成choice network:功能等价的节点归为一个等价类,任选一名做代表

重定时 + 映射

**Retiming(重定时)**在不改变功能的前提下搬移触发器位置来提高时钟频率。看例子:每个门延迟 1,原设计时钟周期为 3,重定时后变成 1,触发器还从 4 个减到 3 个。

图3.7 重定时示例:(a)初始设计周期为3,(b)重定时后周期为1且FF更少

先映射再重定时?映射时优化的路径重定时后可能不再是关键路径——优化错了对象。先重定时再映射?重定时用的是没映射前的粗糙时序。所以必须联合。做法是把割扩展成”跨时间帧”的顺序割:割元素记作 (门 u 加上到根之间经过的 d 个触发器),割生成的合并公式把 d 一路累加:

顺序电路有环路,割集合互相依赖,用逐次逼近解决:从平凡割开始反复合并,直到不再出现新割(实测 K=4 时最多 5 轮就停)。标签公式也相应变成顺序到达时间:

白话解释:信号若经过 级触发器才到根,相当于”晚 个时间出发”,所以到达时间要减掉 倍目标周期 。若每个 PO 的标签都 ≤ ,就证明存在”重定时+映射”联合意义下周期为 的解。这类算法能找到所有重定时与映射组合中最好的时钟周期,且多项式时间可解。

特殊架构的映射

异构资源:多种 LUT 尺寸

商业 FPGA 常支持多种 LUT 配置(如 Stratix II 的 ALM 可配成两个 4-LUT、一个 5-LUT+3-LUT 等)。设两种 LUT 尺寸 、延迟 ,扩展思路很简单:枚举 大小的割,时序公式里的 与否取 。若有大 LUT 数量上限(资源受限),用二分法调大 (虚拟涨价)迫使算法少用 -LUT,再迭代收敛——把”带资源约束”化归为”无约束”问题。

把逻辑塞进片上存储器(EMB)

没用完的嵌入式存储块可以配置成大 ROM,相当于超大输入的 LUT(如 11 输入 1 输出)。一把能替掉一大串小 LUT 和它们的互连,但 EMB 内部访问延迟大,得挑对地方用。SMAP 算法一次映射一个 EMB:选种子节点 → 用流计算找 d-可行割圈出尽量大的锥 → 按 MFFC 大小打分选出 w 个输出。EMB Pack 则一次选出所有候选(把 MFFC 推广成多输出的 MFFS,转化为超图聚类问题)。两者都是 LUT 映射之后的后处理。

CPLD 映射

CPLD 逻辑单元是 p-term 块,用三元组 刻画:k 输入、m 个乘积项、p 个输出。PLAmap 算法沿用”打标+映射”两段式,基于 Lawler 聚类:把节点与扇入锥中同标签的节点抱团,能塞进 就保持标签,否则标签 +1。有个微妙的非单调性质:即使这个团塞不进一个单元,包含它的更大超团反而可能塞得进(共享输入省了 p-term)——所以打标只是启发式。p-term 块天然适合宽扇入低密度逻辑(如状态机),与 LUT 混合的混合架构可兼得两者长处。

常见坑/误区

用”局部 LUT 数最少”评估映射质量是经典误区。有效面积这种启发式在允许节点复制时会系统性低估真实面积(记住它是下界);更隐蔽的是只优化单个节点而不考虑扇出共享——同一节点被不同扇出指定不同割时会悄悄产生复制,面积不降反升。靠谱的评估方式是对照 LEKO 这类已知最优解的基准。

通关标准:

学完本篇你应该理解:K-可行割为什么对应一个 K-LUT、割枚举的合并公式怎么自底向上工作;有效面积”成本平摊给扇出”的思想及其低估偏差;FlowMap 标签/深度打标的动态规划本质;choice node 与无损综合”攒选项、映射时拍板”的思想;重定时与映射联合时割为什么要带上 FF 计数 d。