ARTICLE DETAIL

资讯详情

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

数字后端Blockage指南:Placement/Routing阻挡、参数命令与避坑

数字后端Blockage指南:Placement/Routing阻挡、参数命令与避坑 1. 先把话说清楚Blockage 到底在替谁做决定第一次主动在 PR 工具里加 blockage 的人多半是被逼的。要么是 macro 周围那一圈 congestion map 红得刺眼要么是 CTS 做完之后 macro 边上冒出几百个 DRC要么是 timing 在某块区域怎么调都收不进去最后发现那块地方被工具塞到了 90% 以上的利用率局部布线资源早就见底了。Blockage 是 PR 流程里少有的、能让你把脑子里的物理直觉直接翻译给工具听的手段它不复杂但用不好会立刻反噬。这篇内容想聊得具体一点PR 工具里的 blockage 有哪几类、各自管什么不管什么、参数怎么算、命令怎么写、什么时候该上、什么时候上了反而更糟。不管你是刚接手 floorplan 的新人还是已经跑过好几个 block 的老手下面这些应该都能找到能直接抄的部分。1.1 工具的目标函数和你的物理直觉之间差着一层PR 工具的全局布局本质上是一个带约束的优化问题它要同时照顾面积、时序、功耗、可布通性而这几件事在数学上往往是互相打架的。工具不知道你这块 macro 右边将来要留一条 8 微米宽的通道给 memory 的走线也不知道这块 SRAM 上方如果压了标准单元DFM 检查会挂掉。它只认识代价函数和约束条件。所以当你说工具乱放的时候准确的说法通常是你没有把约束写进去工具就在它认为最优的解空间里自由发挥了。Blockage 就是最直接的一类约束输入——你画一个矩形告诉它这个地方别碰它就真的不碰。这种硬约束带来的确定性是拥塞报告和时序曲线之外你能拿到的最踏实的控制感。但要注意约束不是越多越好。每加一块 blockage可用的布局面积就少一块剩下的区域单元密度必然上升局部布线需求跟着涨时序也可能恶化。它本质上是一道用手动干预换确定性的交易你每加一次都要问自己这块地方我是真的不能放东西还是只是懒得去调 floorplan1.2 三种作用域布局、布线、以及介于两者之间的东西很多人把 blockage 当成一个概念其实它在工具里至少分成三个作用域管的事情完全不一样。Placement blockage管的是标准单元和 macro 的摆放工具在 global placement 和 legalization 阶段会尊重它。Routing blockage管的是金属层上的走线它不关心放了什么单元只关心哪几层、哪些区域不许走线。第三类比较杂包含 pin blockage、via blockage、cut metal blockage、bond pad 相关的阻挡等等它们分别作用在更细的环节上比如 pin 的落点、via 的打法、cut 层的方向。这三类经常需要配合使用。最典型的场景是 macro 周围你会先用 placement blockage 把 halo 区域封住再用 routing blockage 把某几层金属也一起封掉防止工具在 macro 上方打 via 导致 DRC。只做一半问题照样来。1.3 什么时候该动它什么时候该先怀疑别的地方这里有个很实际的判断顺序。当遇到拥塞、DRC 或者时序问题时我的习惯是先看三件事floorplan 的 macro 摆放是否合理、pin 的分配是否均匀、power plan 是不是把某几层金属吃掉了太多资源。这三样如果没排查就上 blockage往往只是把症状按下去问题会在别的地方冒出来。反过来下面几种情况才是 blockage 真正的主场模拟模块或 IP 上方有禁止放单元的硬性要求某个 corner 要预留给后续 ECO 或者 clock tree 的 buffermacro 的 pin 一侧需要保证一定宽度的通道某些层在特定区域不允许走线因为要和封装或 bump 对齐。这些场景的共同点是——需求来自物理规则或者流程规划而不是来自工具的优化结果那才是约束该出场的地方。2. 五类常用 Blockage 与选型对照知道了为什么接下来是用哪个。PR 工具里 blockage 的种类比想象中多选错了不止是没效果有时还会引入一堆新的违例。2.1 Placement Blockage 的四种形态Hard硬阻挡是最直接的区域内完全不允许放标准单元或 macro工具连试都不会试。宏单元之间的通道、模拟区域、保留给 ECO 的空地基本都用它。缺点也很直白——面积是实打实地浪费掉了。Soft软阻挡是建议别放。工具在布局时把它当作低优先级的区域只有在别处实在没地方、或者拥塞压力大到必须突破时才会用。这里必须提醒一句不同工具、甚至同一工具的不同版本对 soft blockage 的尊重程度是不一样的。有的版本在 detail placement 阶段会直接忽略它导致你以为封住了、结果里面还是塞满单元。所以第一次用 soft 的时候一定要在 GUI 里看一眼实际结果别只看报告。Partial部分阻挡也叫密度阻挡是控制能放多少而不是能不能放。它带一个 density 参数表示该区域内标准单元的面积占比上限。这一类的实用性其实比 hard 高很多因为它保留了布局弹性只是不让工具把这块地方榨干。Macro-only是比较特殊的一种只挡 macro不挡标准单元。它主要用在早期 floorplan 探索阶段——你希望大块头别乱跑但小单元随便填。2.2 Routing Blockage 与 Via / Cut Metal 阻挡Routing blockage 是按层生效的这一点和 placement blockage 的按区域生效完全不同。你封的是第几层金属上的哪块区域M2、M3、M4 可以各自独立设置。常见的用法有两类一是 macro 上方封掉若干层避免工具在 macro 顶上走线或者打 via二是某个区域因为天线或者 EM 的要求需要限制高层的走线密度。这里有个容易忽略的点routing blockage 通常会连带影响 via。如果你封了 M3但没封 M2 到 M3 的 via工具可能仍然会从 M2 打上去然后在 M3 上停住——这种情况下你封了个寂寞。工具一般会提供同时阻挡相关 via的选项或者你也可以单独加 via blockage具体看工具的命令支持。Cut metal blockage 用得相对少主要出现在先进工艺里因为 cut layer或者叫 metal cut有自己的方向性规则。当某个区域的 cut 密度超标或者方向受限时可以用它来约束。2.3 Pin Blockage 和其它场景化阻挡Pin blockage 管的是实例引脚或者端口可以落在哪里。它在两种场景下很有用一是某个 macro 的某条边上将来要走关键的时钟线你不想让别的 pin 挤在旁边二是 IO 或者 bump 附近的 pin 分配需要人为引导避免工具把几十个 pin 全塞在一个方向上导致那个方向局部布线资源瞬间爆掉。另外还有几类在特定项目里会碰到bond pad 或者 bump 相关的阻挡用来保证 bump 上方不能放东西partition 或 ILM 边界处的阻挡在层次化流程里防止边界单元互相侵入guard ring 内部的阻挡一般由模拟团队直接给出坐标。这些用得不多但一旦遇到问清楚上游的物理要求比自己在工具里试要快得多。2.4 一张表看清它们的差别类型作用对象是否按层是否可带密度典型场景Hard placement blockage单元 macro否否通道预留、模拟区、ECO 预留Soft placement blockage单元 macro否否轻度引导允许被突破Partial placement blockage单元否是控制局部密度防拥塞Macro-only blockage仅 macro否否早期 floorplan 探索Routing blockage金属走线是部分工具支持macro 上方封层、EM 敏感区Via blockagevia是否防止特定层间打孔Cut metal blockagecut layer是否先进工艺 cut 规则Pin blockagepin / port是否pin 引导、关键网络保护这张表的用法很简单先确定你要管的是放什么还是走什么再确定要不要按层最后决定要不要密度。三步定下来类型基本就唯一了。3. 参数怎么定单位、坐标、密度与 halo 的算法类型选对只是第一步参数填错照样白干。这一节的内容偏算术但恰恰是最容易翻车的地方。3.1 单位与坐标DBU 搞错一次能查你半天PR 工具内部用的不是微米而是数据库单位DBU。常见的换算比例是 1 微米 1000 DBU也有 2000 DBU 甚至更高精度的设置取决于工艺和工具配置。你可以用工具提供的命令去查当前设计的 DBU 值也可以直接从 DEF 文件头里的UNITS DISTANCE MICRONS那行看出来。为什么强调这个因为你在命令行里写createPlaceBlockage -box {100 100 200 200}工具不会问你是微米还是 DBU它会按当前数据库单位去理解。如果设计跑在 2000 DBU/微米的环境里你按 1000 的心算填了坐标实际位置就偏了一半。这种错误在 GUI 上看图形不一定明显但 timing 和拥塞的表现会非常诡异。我的习惯是所有坐标先在纸面上按微米算好再统一乘 DBU 换算系数绝不混合着写。3.2 Halo 和 Blockage 的区别以及间距怎么算很多人把 halo 和 blockage 混为一谈其实它们的生命周期完全不同halo 是附着在 macro 实例上的macro 移动它就跟着动blockage 是钉死在坐标上的矩形macro 跑了它不动。在后期做 macro 位置微调或者 ECO 时这个差别会非常要命——你以为封住的区域其实已经跟着 macro 挪走了。所以常规做法是macro 周围的基础间距用 halo工具通常有专门给 macro 加 halo 的命令需要额外加宽、或者对某几个方向做特殊处理的再补 placement blockage。间距怎么算假设一个 macro 的尺寸是 180 微米 × 120 微米四个方向各留 3 微米的通道那么它占用的阻挡区域就是 186 × 126 23436 平方微米。作为对比macro 本体只有 21600 平方微米光 halo 就吃掉了将近 8.5% 的额外面积。如果一个 block 里有十个这样的 macro累积起来就是不小的数字。更进一步如果你还想在通道里留出布线空间halo 往往要设到 5 微米甚至更宽。这时候就得算一笔账这些被 halo 吃掉的面积会挤到别处导致其余区域的单元密度上升。经验值是通道预留每增加 1 微米整体标准单元密度大概会上涨 1% 到 3%具体取决于 macro 的占比。所以要边加边看 density map别一次性加太猛。3.3 Partial density 到底填多少Partial blockage 的 density 参数含义是该区域内标准单元的面积占该区域总面积的比例上限。比如你画了一个 100 × 100 微米10000 平方微米的 partial blockagedensity 填 40那就是说这块地方最多允许放 4000 平方微米的单元。填多少合适这取决于这块区域将来要承载什么。我的经验区间是这样的靠近 macro 的通道区一般给 30 到 50普通的功能区域如果担心拥塞给 60 到 75纯粹是早期探索想留点余量可以给 80。低于 30 的时候要格外小心因为区域里可能连一个最低限度的 buffer 都塞不进去CTS 阶段工具会绕过这片区域去更远的地方插 buffer反而把线长拉长了。还有一个坑density 是面积比不是数量比。同样 40% 的密度放 100 个窄单元和放 40 个宽单元对局部布线的影响完全不一样。所以光看 density 数字不够还要结合单元的类型分布去判断。3.4 层的选择与金属堆叠的考量Routing blockage 选层的时候有个基本原则别封 M1。M1 通常承担标准单元的引脚出线和内部连接封了它基本等于把这块地方彻底废掉。常用的封层范围是 M2 往上具体封到哪一层看 macro 上方的布线资源和你的高层规划。我一般会这样划macro 正上方封 M2 到 M4因为这三层是局部布线的主力上面压线会直接影响 macro 引脚的出线M5 往上视情况保留或者部分保留用于跨区域的全局走线。如果项目用的是先进工艺高层金属宽而稀那个区域可以单独评估。另外提醒一句封层的范围要和 power plan 对齐。如果你封了 M4但电源网络正好要在 M4 上铺条纹那就会冲突。上 blockage 之前先看一眼 power plan 用的层避免自己给自己挖坑。3.5 参数速查表参数常见取值说明DBU 换算1000 或 2000 /微米以 DEF 头为准绝不靠猜Macro halo2~5 微米视 macro 尺寸和通道需求调整Partial density30~75低于 30 要评估 CTS 影响Routing 封层M2 及以上一般不封 M1通道宽度5~10 微米关键 macro 出线方向可再放宽4. 落地实操命令行、DEF 写法与生效验证参数想清楚之后落地就是几个命令的事。不同工具的语法差别不小这里按常见工具分别说最后讲讲怎么验证。4.1 Innovus 环境下的常用命令创建 placement blockage 的核心命令是createPlaceBlockage语法大致如下# 硬阻挡完全禁止放置 createPlaceBlockage -box {100.0 100.0 200.0 200.0} -type hard # 软阻挡工具尽量避开必要时可突破 createPlaceBlockage -box {300.0 100.0 400.0 200.0} -type soft # 部分阻挡限制区域内单元密度不超过 40% createPlaceBlockage -box {500.0 100.0 600.0 200.0} -type partial -density 40 # 只挡 macro createPlaceBlockage -box {700.0 100.0 800.0 200.0} -type macroOnly坐标的顺序通常是左下角 X、左下角 Y、右上角 X、右上角 Y。写之前先在版图上量好别凭感觉。给 macro 加 halo 一般用专门的命令比如# 给所有 macro 加 3 微米 halo addHaloToBlock 3 3 3 3 -allMacro四个值的顺序对应不同方向具体顺序各版本略有差异用之前敲一次man或者查一下当前版本的手册别硬记。创建 routing blockage# 在 M2 到 M4 上封住指定区域 createRouteBlk -box {100.0 100.0 300.0 300.0} -layer {M2 M3 M4} # 允许电源地网络穿过 createRouteBlk -box {100.0 100.0 300.0 300.0} -layer {M2 M3} -exceptpgnet-exceptpgnet这个选项值得单独说一句。默认情况下 routing blockage 是六亲不认的连电源地线都挡。但大多数时候你并不想挡住电源网络因为 power plan 是在 floorplan 阶段就定好的被挡住会导致电源网络断裂。所以在 macro 周边加 routing blockage 时养成习惯带上这个选项除非你确定连 PG 也要挡。4.2 ICC2 环境下的写法对照换了工具概念一样但语法变了。ICC2 里创建 placement blockage 大致是这样# 硬阻挡 create_placement_blockage -type hard -boundary {{100 100} {200 200}} -name blk_hard_1 # 带密度的部分阻挡 create_placement_blockage -type partial -blocked_percentage 60 \ -boundary {{500 100} {600 200}} -name blk_partial_1 # routing blockage create_routing_blockage -layers {M2 M3} -boundary {{100 100} {300 300}} # pin blockage create_pin_blockage -layers {M2} -boundary {{700 700} {800 800}}注意这里的-blocked_percentage含义和 Innovus 的 density 是互补的60 表示阻挡 60%也就是允许 40% 的密度。这类命名上的反向定义最容易出错我第一次切换工具的时候就因此把密度设反了结果整块区域空着没人用还以为工具没生效。换工具的第一个动作就是拿一个已知结果的小实验去校准参数含义。4.3 DEF 层面的表达方式如果你的流程里有 DEF in/outblockage 也会体现在文件里。标准写法大致如下BLOCKAGES 3 ; PLACEMENT ; RECT ( 100000 100000 ) ( 200000 200000 ) ; - LAYER M3 ; RECT ( 100000 100000 ) ( 300000 300000 ) ; - VIA M2 ; RECT ( 400000 400000 ) ( 450000 450000 ) ; END BLOCKAGES这里能看出几件事PLACEMENT 类型不带层信息LAYER 类型必须指定层VIA 类型也要指定。另外所有的坐标都是 DBU 单位前面没有小数点这一点在手工编辑 DEF 的时候特别容易踩——千万别说我就改一个数字然后忘了换算。4.4 怎么确认它真的生效了加完 blockage必须验证。我的验证动作有三个层次第一层图形确认。在 GUI 里高亮显示 blockage 图形肉眼核对位置和大小。这一步看似基础但坐标写反、右上角和左下角搞混这类错误只有看图才能一眼发现。第二层密度与拥塞确认。跑完 placement 之后看目标区域的单元密度是不是真的降下来了拥塞图上的热点有没有转移。如果 density 没变化说明 blockage 压根没被读进去或者被后续的命令覆盖了。第三层一致性确认。把设计导出成 DEF看看 BLOCKAGES 段里有没有你要的那些条目坐标对不对。这一步在层次化流程里尤其重要因为 blockage 有可能在 partition 边界处理时被丢掉。4.5 迭代调整的节奏Blockage 不是一次设完就完事的。我的习惯是分三轮第一轮在 floorplan 阶段只加最必要的部分主要是 macro halo 和明确的物理禁区第二轮在 placement 之后根据密度图和拥塞图补几处 partial blockage第三轮在 CTS 之后针对实际出现的 DRC 热点做微调。每一轮只动一两个地方动完立刻跑一次看效果。一次性加十几个 blockage 然后跑一整天是最低效的做法因为出了问题你根本不知道是哪一个引起的。5. 踩坑实录与排查速查表前面讲的都是应该怎么做这一节讲讲实际会怎么坏。下面这些问题基本都来自真实项目里遇到过的场景。5.1 十个典型症状与排查方向症状可能原因排查动作加了 blockage 但密度没降命令未生效或被后续覆盖导出 DEF 检查 BLOCKAGES 段soft blockage 里还是塞满了单元工具版本对 soft 支持弱改用 hard 或 partial 验证routing blockage 挡住了电源网络未加 exceptpgnet 类选项检查命令选项补上版图位置和预期差一截DBU 换算错误核对 DEF 头里的单位设置局部拥塞反而更严重单元被挤到周边看周边密度考虑放宽 densityCTS 后线长明显变长partial density 设得太低上调 density 或缩小范围macro 移动后阻挡位置不对用了 blockage 而非 halo改用跟随实例的 haloDRC 集中在 macro 上方routing 封层不够补加高层 routing blockagepin 全挤在一个方向缺 pin blockage 引导在关键边加 pin blockage层次化流程里 blockage 丢失边界处理或 ILM 未继承在顶层重新确认或写入约束文件5.2 几个值得复盘的情况案例一soft blockage 的看起来生效。有次在 macro 边上加了 soft blockage跑完 placement 看密度确实降了就以为没问题。结果 detail placement 之后发现里面还是塞进了几十个单元时序报告里那片区域的路径莫名其妙变差。后来才搞明白soft blockage 在 global placement 阶段有约束力到了 detail 阶段因为 legalization 的压力被部分突破了。解决办法是把关键的那一小块改成 hard其余保留 soft。案例二routing blockage 封掉了电源条纹。在一个 block 里为了防 macro 上方的 DRC一口气把 M2 到 M6 全封了。跑完发现电源网络的连通性检查报了几百个错。原因是 power plan 的条纹正好穿过那片区域。后来把封层范围缩到 M2 到 M4M5 以上放开给电源问题就没了。先看 power plan 再封层这个顺序不能颠倒。案例三density 设太低反而拖慢收敛。有个区域为了保险起见把 partial density 设成了 25结果 CTS 阶段工具绕了很远的地方去插 buffer那片的时钟线长比预期多了将近 30%。把 density 上调到 55 之后线长恢复到了正常水平拥塞也没有明显恶化。这件事让我意识到blockage 的保守程度是有成本的过度保守和过度激进一样有害。5.3 几条压箱底的经验第一blockage 是约束不是修复工具。如果问题根源在 floorplan加再多 blockage 也只是把问题挪个位置。每次动手之前先问一句我是在表达一个物理需求还是在掩盖一个设计缺陷第二把所有 blockage 记在有版本的脚本里不要只在 GUI 里点。GUI 加的东西很容易在下一次重跑时丢失而且没人知道你当时为什么这么加。我在脚本里习惯给每一条 blockage 加注释写清楚它是为了什么、来自哪个需求、什么时候可以删。第三blockage 的数量和收敛时间成正比。一个干净的设计里blockage 通常不超过十几条集中在 macro halo 和几个物理禁区。如果你的脚本里有五十条 blockage那大概率说明 floorplan 需要重做而不是继续加约束。第四换工具、换版本、换工艺节点的时候一定要重新做小实验校准参数含义。尤其是 density、percentage 这类反向定义的参数靠记忆跨工具使用翻车概率极高。最后再补一个我自己常用的检查习惯在项目里程碑节点把所有 blockage 导出成一张清单逐条问如果删掉它会发生什么。答不上来的说明当初加得就不清楚趁早清掉比留着占面积划算。
返回列表