ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

数字后端布局实战:时序收敛、拥塞控制与功耗均衡的关键策略

数字后端布局实战:时序收敛、拥塞控制与功耗均衡的关键策略 直接进入正题。做数字后端最磨人的一个阶段就是布局。很多人以为布局就是“把标准单元摆一摆让工具自动跑一跑”但真正上手做过项目的人都知道布局阶段的选择直接决定了后面时钟树综合和布线能不能顺利走完。我这次想把这阵子关于布局的学习和实践心得整理一下重点讲思路、讲判断依据也讲我踩过的坑。在数字后端流程里布局往下承接综合后的门级网表往上支撑时钟树综合和布线。它不产出最终版图但每一版ECO、每一次时序违例的返工根子都能追到布局的质量上。这一篇就围绕“布局到底在解什么问题”来展开。1. 布局在数字后端流程里的定位1.1 布局不是“摆单元”那么简单数字后端的标准流程大致是这样综合Synthesis把RTL变成门级网表之后就是布局规划Floorplan、布局Placement、时钟树综合CTS、布线Routing然后是签核验证。布局处在流程中间偏前的位置看起来好像只是把单元摆到规划好的区域内实际上它是在给后续所有物理实现打底子。我试过跳过精细布局规划直接跑布局结果工具是能跑完但到了布线阶段拥塞率直接飙到20%以上修race修到头秃。后来老老实实回到布局阶段做优化才明白一个道理布局阶段多花一小时CTS和布线阶段能省一整天。从数据流的角度来看布局的输入包括综合后的门级网表、SDC时序约束、库文件Liberty、物理库LEF/DEF、工艺文件还有顶层规划好的电源网络和IO位置。输出则是带有完整单元坐标的DEF文件供后续CTS使用。1.2 布局要解决的核心矛盾布局阶段的核心矛盾有三个缺一不可时序收敛。信号从触发器到触发器的路径延迟主要由单元延迟和连线延迟组成。在深亚微米工艺下连线延迟占比越来越高而布局阶段虽然还没有真实布线但工具会通过虚拟布线估算延迟。单元摆得离路径端点太远预估算出来的延迟就会超标。拥塞控制。布线通道是有限的。如果某些区域塞的单元太密、pin脚太挤后续布线就会绕线绕线导致延迟恶化同时也会增加绕线层数需求。布局阶段需要控制局部单元密度给布线留出足够的通道。功耗分布。高翻转率的单元如果堆在一起局部功耗密度过大的話会给电源网络和散热带来压力。布局阶段需要做功耗密度均衡避免出现功耗热点。这三个维度往往是互相牵制的。比方说为了时序把关键路径上的单元摆得很近结果那个区域密度暴增拥塞又爆了。布局工具的核心优化目标就是在时序、拥塞、功耗之间找平衡点——本质上是个多目标优化问题。1.3 布局阶段和前后端交接的衔接点布局和综合之间有一个很容易被忽略的衔接问题综合时用的时序约束和面积估算和布局后实际物理数据计算出来的结果往往有很大偏差。我见过不少项目综合报告时序都收敛得很好但一到布局阶段就大面积violation原因就是综合阶段没有物理信息延迟模型估得过于乐观。所以现在主流的工具流程里布局前建议先做一次“物理感知的综合”或者至少跑一轮快速布局来校准数据。Innovus里有专门的流程环节做这件事比如在综合阶段就调用底层物理引擎做评估。这个经验对我帮助很大避免了很多次“综合过、布局崩”的尴尬。2. 布局前的准备工作输入文件和策略设定2.1 输入文件清单布局阶段不是直接load网表开跑那么简单。我习惯列一个清单逐项确认之后再启动布局后面排查问题会省很多力气。门级网表。一般由综合工具导出格式是Verilog/VHDL。需要确认里面没有未映射的单元没有悬空的hybrid pin也确认顶层端口和约束里的端口一致。SDC时序约束。包含时钟定义、I/O延迟、false path、multicycle path等信息。SDC是布局优化的指挥棒constraint写错了布局结果自然不对。特别要检查时钟是否全部定义完整有没有时钟域没有create_clock。物理库LEF。包含标准单元和宏单元的尺寸、pin位置、routing blockage等信息。Metal层信息是否完整也影响布线拥塞预估的准确性。时序库Liberty。每个cell的不同PVT工艺角、不同负载下的延迟和功耗信息都在这里。布局规划结果。包含die面积、Row高度和方向、IO位置、宏单元大致方位、电源网络拓扑等。这部分一般在Floorplan阶段确定下来布局是在这个框架内工作。其他design exchange format (DEF) 的初始文件、tech file、RC tech file等视具体流程需要准备。2.2 布局策略的设定Innovus等工具支持通过配置文件mmMC、common_optimization、place等模块来设定布局策略。我重点会确认这么几个选项拥塞驱动的布局。开启拥塞驱动的placement选项工具会在优化的目标函数里加入拥塞惩罚项在时序和拥塞之间动态权衡。这个选项默认是开启的但具体的权重可以根据设计特点调整。时序驱动的布局。默认开启工具会在摆放时估算关键路径的延迟并驱动优化。低功耗布局。可以开启功耗优化选项工具会在布局时考虑时钟门控单元的位置把高翻转率、高负载的buffer尽量靠近负载端从而降低连线上的动态功耗。分组约束。对于一些特殊模块比如RAM周边的控制逻辑、跨时钟域同步器可以用group属性或物理约束来让工具把它们放在指定区域内。这对后续时序收敛和模块复用都有好处。这里补充一点我自己的体会策略选项不是越多越好。很多工具选项之间存在耦合比如开了过激的拥塞优化会让布局为了躲避拥塞而把关键单元摆得到处都是时序反而变差。建议先跑一版默认策略用数据决定下一个优化方向而不是一上来就开一堆高级选项。2.3 布局模式的选择Innovus里布局有几种模式常见的是elaborate模式、incremental模式等。除此之外工具内部会经过多个阶段的place优化从initial place到final place中间可能有多次refine。我遇到过有人问“为什么我place之后网表里多了一堆buffer这些是谁加的”其实这些buffer是工具在做logical synthesis和placement co-optimization时插入的。布局阶段除了摆单元还会做一些局部逻辑优化比如buffer insertion、cell sizing、logic restructuring来改善时序和拥塞。如果你希望布局阶段尽量少动网表可以通过选项来限制工具的改动幅度。但对于绝大多数高性能设计让工具自由做逻辑优化是更优解因为布局阶段的物理信息能让这些优化做在刀刃上。3. 布局的核心环节拆解3.1 IO与Pin的预布局考虑在做宏单元和标准单元摆放之前先要把IO Pad和Pin的位置确认好。IO的位置直接决定信号进出芯片的路径如果IO和内部逻辑单元离得太远I/O延迟会很难做。具体来说我会在做Floorplan阶段就把IO位置和宏单元方位联合考虑布局阶段尽量让IO附近的单元就近摆放。工具在布局时会把“IO到内部logic的路径”也纳入时序优化但物理上的初始距离是工具无法改变的约束。所以我在Floorplan阶段就会验证IO方向和宏方向之间的总线延迟不会拖到布局阶段才追悔。另外需要注意折中IO和Pin的位置受封装、供电、信号完整性等多方面限制不是后端能完全决定的。这一步的沟通最好在Floorplan阶段就完成布局阶段只需按既定方案执行。3.2 宏单元摆放的核心原则宏单元包含RAM、ROM、自定义IP、PLL等它们的位置一般在Floorplan阶段就手动指定了。布局阶段更多是把宏当作固定的“障碍物”在其周围摆放标准单元。宏摆放的几个关键原则pin方向朝向逻辑侧。RAM的pin如果左边是地址线、右边是数据线那么左边应该朝向地址生成逻辑右边朝向数据通路。这是最基本的原则但也是最容易被初学者忽略的。pin方向指反了数据线和地址线都要跨过宏体绕远路时序和拥塞双双受损。给宏四周留出布线通道。宏单元一般占据多层金属标准单元之间的布线主要靠底层金属但如果宏占满了所有层周边就会形成routing blockage。布局方案需要评估宏周围的绕线空间必要时用halo约束来保证通道宽度。channel宽度要按拥塞预期来定。两个宏之间留的channel太窄布线时肯定堵太宽又浪费面积。具体多宽需要结合宏之间的连线密度来评估。我习惯先用工具做一个快速拥塞评估再微调channel宽度而不是凭经验拍脑袋。避免宏把标准单元区域切割成碎片。宏的摆放如果导致标准单元区域变得狭长、零碎布局的灵活性会大幅下降。一种常见策略是把大宏靠边放把形状规整的区域留给标准单元。下面用一个简化的示意来说明宏摆放的两种对比摆放策略优点风险宏集中在角落标准单元区域完整、规则布局灵活引脚和内部逻辑连接路径加长宏分散靠近逻辑关键路径短、拥塞小标准单元区域被切割局部密度控制变难没有绝对最优只有根据设计特点做取舍。3.3 标准单元摆放的交互与迭代宏摆完了剩下的区域都是标准单元的地盘。工具会在这个区域里按照Row的方式摆放单元、插入Buffer、做时钟门控单元的摆放等。布局过程中的一个核心机制是“逻辑与物理的交互优化”——这不仅是单元摆放还包括逻辑级的调整。比如工具发现某个路径因为负载太大导致延迟超标会考虑把一个大驱动能力的Buffer换成几个小的分散到不同区域或者通过复制逻辑来缩短扇出。这个过程和布局摆放是交替进行的所以布局后的网表和综合后的网表不一致是常态。我个人的操作习惯是布局完成后先检查面积利用率。如果标准单元总面积占可用面积的70%以下说明布局规划可能过于宽松浪费了die面积如果超过85%就要留意拥塞问题了。3.4 时钟树综合前的最后一次检查布局结束、CTS开始之前有一个容易被人忽略的中间环节时钟门控和ICG单元的预处理。数字后端里时钟树不是布线阶段才开始的在布局阶段工具就已经在识别时钟门控单元并做初步的时钟树规划。ICGIntegrated Clock Gating单元的摆放会直接影响时钟树的skew和功耗因为ICG的输入端连接的是高频时钟输出是门控后的时钟。如果ICG摆得离负载单元很远时钟树的层级会变多、缓冲器变多功耗和偏斜都会恶化。在布局阶段我会特别关注ICG单元的位置分布是否和对应的负载单元在同一个区域。工具一般能自动优化但对于一些手动指定的时钟域还是建议人工复核一遍。4. 布局质量评估看什么指标4.1 拥塞评估拥塞是布局质量最直观的指标。Innovus里可以通过报告拥塞来查看全局和局部拥塞分布比如报告全局路由拥塞global routing congestion和局部pin access拥塞。拥塞通常分为两类全局拥塞。表现为某个网格区域的走线需求超过可用走线资源。常见原因是宏摆放形成瓶颈通道或者某些模块的逻辑过于密集。局部拥塞。表现为单元密度过高pin脚之间间距不足导致无法正常连接电源地线或信号线。看报告时要留意热点区域是否集中出现在宏边界、布局边界附近如果是多半是宏摆放或面积估算的问题。处理拥塞的手段我尝试过的优先级是先手动调整宏/约束再调整利用率或布局选项最后才是拆逻辑或调整floorplan。直接拆逻辑是最后手段因为会影响网表结构一般要回到综合阶段重新做。4.2 时序预估的可信度布局阶段的时序报告有一个使用前提它是基于预估布线的不是真实布线。所以看WNS最差负裕量和TNS总负裕量时要留有余量。我的经验是布局阶段的WNS如果已经没有负裕量那布线阶段大概率会有新的violation冒出来——预估算延迟和真实延迟之间总有偏差。布局阶段我一般会给自己留一个“垫子”如果目标频率要求WNS达到0布局阶段至少要跑到正裕量100ps以上才敢往CTS走。这一步很重要因为在CTS之后修时序比在布局阶段修困难很多。CTS会改变时钟到达时间一旦时钟树固定了修复setup/hold的窗口就窄了。4.3 功耗密度分布检查功耗分布在布局阶段虽然不是唯一优化目标但在一些功耗敏感设计里非常关键。工具可以生成功耗密度热力图我会重点看有没有热点区域。处理功耗热点的手段包括把高翻转率的寄存器/逻辑打散到更广的区域、调整布局约束降低局部密度、在必要处插入缓冲器均衡负载。注意这些手段都可能在时序上产生负面影响需要和时序结果放在一起看。5. 常见问题与排查技巧5.1 布局后出现单元重叠正常情况下工具不会让标准单元重叠但以下几种情况可能出问题源网表里本身存在重叠或clustering问题。比如说综合阶段产生了一些位置固定的单元或者用户手动设置了不合理的位置约束。可以检查一下是否用了不合理的手动约束尝试去除后再跑。多个模块合并处理时碰撞。分层设计的项目中如果两个子模块在顶层布局时分配的区域发生重叠工具可能会在merge时报warning甚至直接错误退出。解决办法是检查顶层规划各模块的范围让它们之间留出足够间距。工具版本或者库文件不一致。换库或者换工具版本后旧DEF文件中记录的单元尺寸、pin位置和新库不一致也容易产生重叠。这种情况下建议重新load库后再做一次refresh。5.2 布局后拥塞依然严重拥塞严重的排查思路是先定位是全局性拥塞还是局部性拥塞。全局性拥塞一般来自面积利用率的设定过高。这时候第一选择是降低全局利用率。注意利用率不是越小越好利用率太低布线是松了但die面积浪费、成本上升而且时序可能因为线长增加反而恶化。业界一个常见的目标利用率整体在65%80%之间高密度设计可以到85%左右但需要配合模块规划全局优化。局部性拥塞则优先检查宏边界、通道宽度和pin access。遇到RAM密集的设计ram之间通道的拥塞是最常见的重灾区。可以用分割图把每个gcell的拥塞情况可视化然后针对明确的热点区域调整。5.3 时序违例集中出现在关键模块布局阶段时序违例如果集中出现在某个模块内部首先要检查SDC约束是否合理。重点看模块的时钟定义和顶层是否一致。库文件的PVT选择是否和优化目标一致。工具通常在setup优化用最差工艺角hold优化用最好工艺角如果这个配置错了时序报告会失真。IO路径是否被错误约束。比如某个输出端口实际上不带负载却加了过紧的output delay。如果约束没问题再看看这个模块内部的floorplan是否合理。很多关键模块时序违例是宏摆放导致关键路径绕了远路造成的。5.4 布局阶段工具运行时间过长布局迭代次数不受控是运行时间暴涨的主要原因。可以尝试限制布局优化迭代次数或者把一些与主要目标无关的高级优化选项先关闭。另外设计规模过大时可以用分块布局或者层次化布局的思路把问题拆小逐块解决。6. 实操总结与设计体会这一篇笔记写到这里核心内容其实已经讲完了。最后再分享一点我个人的做法。每个项目跑完布局我都习惯固定导出三组数据布局后WNS/TNS、拥塞报告按区域排序、单元密度分布。这三组数据和floorplan阶段的预期做比对如果偏差超过预期会先回到floorplan找问题而不是急着调布局参数。这个习惯在过去几个项目里帮我节省了大量反复调试的时间。布局不是一次性把工具跑完就算验收的环节。真正可靠的布局结果意味着你对手里这个设计的时序瓶颈、拥塞热点、功耗分布心里都有数并且已经给出了物理层面的应对方案。做到这一步CTS和布线阶段基本就是顺着布局铺好的路往下走顺畅的多。
返回列表