1. 项目概述与整体价值
1.1 布图规划到底是什么
做数字IC后端的朋友都清楚,一个项目从RTL到GDSII,物理实现阶段我们说的"后端"其实可以拆成几大步:布图规划(Floorplan)、标准单元摆放(Placement)、时钟树综合(CTS)、布线(Routing)、以及后续的时序收敛与物理签核(Signoff)。而布图规划,就是整个物理设计流程中的第一步,也是决定后续步骤能不能顺利走通的那一步。
我见过不少刚入门数字后端的同学,拿到一个设计,第一反应是赶紧把网表读进来跑自动布局布线,结果跑到布线阶段爆出一堆congestion(拥塞)问题,或者IR drop严重超标,最后只能回头重新做布图规划,一来一回几个星期的进度就没了。布图规划看起来只是"摆一摆宏单元、设一设尺寸、画一下电源环",实际上它决定了整个芯片的面积、时序、功耗、可布线性,甚至直接关系到流片成功率。
简单说,布图规划就是在芯片版图上先把大块的东西安排好:芯片的物理尺寸有多大、输入输出端口放在哪里、那些大块的IP或者存储单元(SRAM)摆在什么位置、电源网络怎么走,这些都属于布图规划的范畴。它解决的核心问题是:在有限的芯片面积上,如何安排各个功能模块的位置,让后续的摆标准单元和走线都能顺畅进行,同时保证时序和功耗满足要求。
1.2 这篇笔记适合谁看
如果你正在学习数字IC后端设计,准备做自己的第一个完整的后端项目,或者从学校出来刚开始接触Innovus、ICC2这类工具,这篇笔记会非常适合你。我尽量不堆概念,用实际项目的思路来拆解布图规划每一步该做什么、为什么这么做、有哪些坑要注意。
我会围绕一个典型的中等规模SoC(比如包含若干CPU核、SRAM阵列、一些接口IP)来展开,因为这是学习和项目实战中最常见的设计形态。工具我会以Cadence Innovus为例,但讲到的思路和方法论对Synopsys ICC2或者其他工具同样适用——布图规划的核心是设计思想和流程意识,工具只是实现手段。
2. 布图规划的核心思路与设计要点
2.1 布图规划解决什么问题
先说清楚布图规划要管的几件事,这样你后面看命令和操作就不会觉得是"为了做而做"。
第一是面积规划。芯片的die size和core area尺寸怎么定,标准单元利用率设置多少合理。面积定大了,一片wafer上能切出来的die数量减少,成本上升;面积定小了,标准单元挤在一起绕线资源不够,congestion爆掉或者时序跑不出来,同样完蛋。
第二是IO布局。芯片的输入输出端口(IO Pad)分布在芯片四周,它们的位置直接影响了内部模块到pad的连线长度,也会影响封装的难度。IO布局要和封装引脚定义一起看,不能后端说怎么摆就怎么摆。
第三是宏单元摆放。大规模的SRAM、模拟IP、特殊功能模块,这些不能靠工具自动撒,需要人工规划它们的位置。摆放位置好不好,直接影响数据通路的走线长度、拥塞程度和时序。
第四是电源规划。在布图阶段就要把电源网络(Power Mesh、Power Stripe)的框架搭好,包括芯片外围的电源环(Power Ring)、内部横竖交错的电源条(Power Stripe)、标准单元电源轨(Power Rail)的连接方案。这一步做不好,后面IR drop检查很难救回来。
这四个方面不是独立的,它们彼此牵制。比如IO位置定了,会影响内部模块的摆放;宏单元摆的位置,会影响电源网络的走向和标准单元的布局空间;核心电压域的面积占比,又反过来影响IO的数量分配。
2.2 布图规划在物理设计流程中的位置
整个数字后端的理想流程是:数据准备(Data Setup)→ 布图规划(Floorplan)→ 标准单元布局(Placement)→ 时钟树综合(CTS)→ 布线(Routing)→ 签核检查(Signoff),包括时序、DRC、LVS、IR drop、DFM等。
布图规划处在最前端,它的输出是所有后续步骤的工作基础。你可以把它理解成盖房子之前的地基和框架设计——地基和框架如果歪了,后面装修得再好,房子也是个危房。
而且布图规划不是一个一次性完成的事。实际项目中,很多时候是先做一个粗略的布图规划,跑一遍place和route,用congestion和时序结果来验证floorplan是否合理,发现问题再回头调整。这个迭代可能要做好几轮,尤其是第一次接触新工艺节点或新设计类型时,完全靠经验拍脑袋很容易翻车,快速迭代反而是最靠谱的方法。
2.3 布图规划质量对后续步骤的连锁影响
很多初级工程师觉得布图规划阶段反正没有实际的时序报告,随便弄一弄就行,后面反正能靠优化来补。这个想法在简单设计上可能侥幸过关,但是在中大型设计上基本必炸。
布图规划不好对后续的影响是连锁的。宏单元位置挡了布线通道,标准单元只能绕很远去连接,线上延迟变大,setup和hold违例增多;电源条规划不合理,局部IR drop过大,逻辑门的供电电压偏低,时序变差,甚至可能导致芯片流片后功能不对;标准单元利用率设得太高,拥塞度高,布线工具为了绕线会插入大量多余的via和绕行,不仅面积增加、时序恶化,DRC违例也多到清不完。
我见过最典型的一个例子,某次一个项目里有一个大的SRAM block,本来应该放在靠近数据通路的边缘位置,被某个new grad随手放在核心区域中间,结果整个数据通路的标准单元被挤到两边,布线绕线绕了整整一圈,时序从原本的满足变成了大量违例。最后重新布图,面积利用率其实没有变,但布线性好了很多,时序一下子就收回来了。这个教训我一直记着:布图规划省下来的每一分钟,后面都要用几倍的工期来还。
3. 布图规划实操拆解(以Innovus为例)
3.1 布图前的数据准备
拿到一个数字后端任务,先别急着打开工具开干,先看看手头的东西齐不齐。布图规划需要的输入文件包括:
- 门级网表(Gate-level netlist):综合后的设计网表,一般.v或.vh格式
- 时序约束(SDC):时钟定义、输入输出约束、false path等
- 物理库(LEF):分工艺LEF和单元LEF,定义了标准单元、宏单元的物理大小、pin位置、障碍物等
- 时序库(Liberty .lib):不同PVT条件下的单元时序功耗信息
- 技术文件(Techfile/tf和Mapfile):定义金属层、通孔、设计规则等
- IO约束文件(可选):IO pad位置的约束
- 其他杂项:比如UPF低功耗文件(如果设计有多电源域)
布图规划阶段用到最多的是LEF文件,因为LEF告诉你每个宏单元占多大地方、pin在哪个位置、哪些区域不能走线。很多人会忽略仔细看LEF这一条,直接扔给工具读,结果对宏单元的pin分布缺乏概念,布图时凭感觉放,后面绕线发现pin被堵死了才去翻LEF。
我个人的习惯是,拿到新的宏单元之后,第一时间在Innovus里打开看它的版图形状和pin的位置,记住几个关键信息:宏单元的宽高比、pin是集中在某个边还是分散在四条边、有没有blockage区域。这些信息决定了这个宏应该靠边放还是可以在内部区域放、应该横向摆还是纵向摆。
3.2 创建初始布图:die area与core area的确定
在Innovus中创建布图,最常用的是create_floorplan命令。它有很多参数,但核心的选项是设定die size和core area的边界,以及控制标准单元的行和site。
die size的确定,在很多公司是由封装和产品部门决定的,DIE的固定尺寸会直接给到后端。如果是自己做小项目或者学习项目,就需要自己估算。简单说,die面积至少要能容纳下所有宏单元面积加上标准单元面积,还要留出足够的绕线空间。标准单元利用率(Utilization)一般在70%到80%之间,低速高密度设计可以到85%以上,高速高性能设计可能只有50%到60%。
具体估算方式很简单:
core面积 ≈ (宏单元总面积 + 标准单元总面积 / 利用率) × (1 + 绕线预留比例)举个例子,一个设计里宏单元总面积为2平方毫米,标准单元总净面积(不算绕线)为3平方毫米,利用率初定75%,绕线预留20%,那么core面积大概就是:
(2 + 3/0.75) × 1.2 = (2 + 4) × 1.2 = 7.2 平方毫米注意这只是粗算,实际还要考虑电源带(power stripe)占用的面积、tap cell和well tie等填充单元的面积,以及IO区域到core边缘的间距。留得太紧后面堵车,留得太松成本高,这个平衡要靠几次迭代来回调。
在Innovus里,初始布图我通常这么写:
# 创建一个die到core都有明确边界的floorplan create_floorplan -die_size {0 0 3000 3000} \ -core_margins_by die {80 80 80 80} \ -site core_site \ -tracks high \ -no_place-die_size指定的是整个芯片外包络的左下和右上坐标,-core_margins_by die表示core边界相对die四条边的缩进量。一般IO区域的宽度会决定这个缩进,单排IO的话80到120微米比较常见,双排则要更宽。-tracks high会让工具在创建floorplan时预生成基于track的参考网格,方便后面snape到grid。
还有一点要提醒:别急着用工具自动生成IO位置,先去看看IO pad的约束文件和封装方案。Innovus的create_floorplan也支持读入IO约束后再创建,比如:
# 读入IO位置约束 read_io_constraints -file io.constraints这样的好处是创建出来的floorplan会自带IO pad,后面宏单元和标准单元摆放时自然就会留出IO连接的空间。
3.3 宏单元摆放策略与实操
宏单元(hard macro)的摆放是整个布图规划里最考验经验的部分,因为工具不会自动帮你把这个做完美,手工调整的空间非常大。
摆宏单元的第一原则是"跟着数据流走"。拿到网表之后,先别急着开工具,把顶层模块图和关键数据通路理出来,用文本画个简单的拓扑图放旁边。哪个模块和哪个模块之间有大量数据交互,这两个相关模块的宏就应该尽量靠近,相关信号线尽量走直线连接,不要绕大圈。
以我熟悉的典型SoC设计来说,CPU cluster相关的SRAM应该贴着CPU逻辑放,总线接口的宏放在总线逻辑附近,模拟IP因为对噪声敏感,要么放在远离数字开关活动剧烈区域的角落,要么加guard ring隔离。信号流从IO进来先到某个接口模块,再到处理单元,最后出到另一侧的IO,那么宏摆放也要尽量让这条数据流是"顺"的,别摆成一个S形或者闪电形。
具体在Innovus里的操作,一般是直接用图形界面拖拽,然后保存floorplan脚本。我推荐的方法是先用大概位置摆一轮,然后用下面的命令检查宏是否有重叠、是否出界:
# 检查宏单元是否合法(不重叠、不超界、没有pin access问题) check_floorplan -verbose如果宏单元数量不多(一个设计里十几个),手动拖非常快。如果宏单元很多或者有大量寄存器堆、memory compiler生成的单元,可以先让工具试摆一遍,place_fp_macros可以自动摆放macro,然后再手动微调。
摆宏单元时除了数据流方向,还要留意几个细节:
第一,macro摆放方向(orientation)。很多宏的pin集中在某一侧,比如SRAM通常pin集中在底部或两侧,摆放时让pin面朝标准单元区域,这样走线不用绕到宏背面去,可以大幅减少绕线长度和拥塞。有时候光把宏旋转90度,congestion就能缓解不少。
第二,宏单元周围要预留足够的pin access区域。宏的pin要走线连接到标准单元,如果宏被其他宏或者IO挤得太紧,pin旁边的绕线通道不够,布线阶段就会出大量short和congestion。通常宏单元每边留出相当于几个M2 pitch的空白区域,具体多少要根据宏的pin密度和金属层资源来定。在Innovus里可以在宏周围画placement blockage,防止标准单元贴脸堆放:
# 在指定区域添加placement blockage,禁止标准单元进入 create_placement_blockage -box {x1 y1 x2 y2} -type hard -name blk_macro_margin第三,宏单元不能压着电源条和IO方向的走线通道。电源条一般从core区的边缘往里拉,宏摆放时要注意宏不能把电源条的通路完全堵死,尤其是如果宏本身是pad受限的单元,周围更需要留出走线空间。
3.4 电源网络设计:ring、stripe与rail
电源网络是布图规划里最容易被新手忽视的部分。它的作用是把外部电源通过封装、bonding wire(或bump)、IO pad引入到die内部,再通过纵横交错的网络均匀分配给每一个标准单元。
在布图阶段,至少要先把电源环(power ring)和电源条(power stripe)画出来。标准单元的电源轨(power rail,一般是M1横向)在placement时由工具自动连接,但电源条和环是需要在floorplan阶段手工定的,因为它们的走线方向和间距直接决定了后续标准单元的电源连接方式、绕线资源分配和IR drop表现。
先看一个简单的命令:
# 在core周围添加电源环 addRing -nets {VDD VSS} \ -layer {top M6 bottom M6 left M7 right M7} \ -width 4 -spacing 1 -offset 2 \ -around core这个命令会在core四边各画一圈供电环线。VDD和VSS建议用上下两层金属分别走,这样在环的角落可以通过via互连,层间交替的方式也能降低电阻。ring的宽度要根据电流大小定,一般先用经验值4到8微米,后续跑IR drop再来调整。ring到core边界要留出offset,避免和pad或者IO的走线打架。
电源条(stripe)比ring更细密,它负责把电源从环均匀送到内部区域:
# 在core内部添加横竖交错的电源条 addStripe -nets {VDD VSS} \ -layer M6 -direction horizontal \ -width 2.0 -spacing 1.0 \ -set_to_set_distance 50 -start_from left \ -stop last addStripe -nets {VDD VSS} \ -layer M7 -direction vertical \ -width 2.0 -spacing 1.0 \ -set_to_set_distance 50 -start_from bottom \ -stop last-set_to_set_distance是两条同层stripe中心到中心的间距,这是电源网络设计里最重要的一个参数。间距越大,stripe越少,绕线资源越宽松,但IR drop会增大;间距越小,电源网络更密,IR drop更好,但会占用更多绕线轨道。一般先进工艺节点在布图初期会先放一组比较密的stripe,后续再做IR分析决定能否抽稀。
我还建议在设计里适度加宽电源pad附近的主stripe,因为电流最先从pad灌入,如果这几个位置太窄,局部IR drop会很明显。
电源条部署完成之后,记得跑一个快速的IR drop预估来验证大方向对不对。Innovus有早期IR drop分析功能(比如analyze_power_plan),可以先用快速模式跑一遍。不用等到最后signoff再查,那时候改起来代价就大了。
3.5 标准单元区域预摆放与keepout设置
宏单元摆完、电源网络定好之后,core区域剩下的大片空间就是标准单元区。布图阶段其实不用真的把每一个标准单元都精确摆好,那是place阶段的事。但布图阶段需要做两件事:一是通过placement blockage把不该放标准单元的区域先封起来,二是利用soft macro或者group等机制引导标准单元的分布趋势。
哪些区域需要blockage呢?宏单元周围的pin access区域要封;IO pad区域的内部,如果有特殊电路(比如ESD保护、IO逻辑)也要封;芯片角落如果有dummy封装的区域或者特殊标记区域,同样要封。
# 在指定矩形区域禁止放标准单元 create_placement_blockage -box {100 100 300 200} -type hard -name blk_1-type hard表示硬性禁止,工具绝不会在里面放任何标准单元。还有一种-type soft,只在拥塞严重时才限制,一般用于引导单元的布局趋势。
另外,如果某些逻辑模块内部的宏单元比较多,希望在后续布局时整个模块的标准单元能尽量聚拢在宏单元附近,而不是散得到处都是,可以在布图阶段用group或region约束来引导。比如:
# 将某个子模块下的标准单元限制在指定区域内摆放 create_region -name reg_cpu -box {500 500 1200 1200} add_modules_to_region cpu_core reg_cpu用region约束之后,布局工具会在指定区域内寻找合法位置,这样数据通路相关的单元就会自动聚拢,减少绕线长度。
不过region不是越多越好。region设得过小,布局工具自由度低,标准单元挤在一个小区域里反而拥塞;region设得过大,约束等于没用。一般是先不设region跑一版布局,看congestion热点在哪儿,再针对性加region。
3.6 布图结果的检查与脚本化保存
布图规划做到一定阶段,一定要形成"可复现"的成果,不能全靠图形界面手工拖出来。我见过有人花了一整天在GUI里把所有宏拖到理想位置,结果没保存脚本,第二天打开工具发现全乱了,只能凭回忆重来。这种教训实在太蠢了。
正确的做法是在每一步关键操作后,都把命令写进tcl脚本,比如floorplan.tcl,每条命令旁边加注释说明为什么这么做。这样即使GUI操作搞乱了,重新source一遍脚本就能快速回到之前的布图状态。Innovus的GUI也支持导出命令记录,但这和你自己维护的高质量脚本相比,可读性和维护性差得多。
布图阶段我自己会这样收尾:
# 检查所有宏单元位置是否合法 check_floorplan report_floorplan # 快速拍照存档,方便前后对比 defOut floorplan.defreport_floorplan会输出当前布图的关键信息,包括die尺寸、core尺寸、利用率、宏单元数量等。把这个报告存档,后续做布图调整时可以清晰对比每次版本的变化。
4. 布图规划常见问题与排查技巧
4.1 如何快速评估一个布图方案的好坏
布图规划做完,怎么判断这个方案行不行?有人会说等place和route跑完看结果呗,那是最终验证,但太慢。实际操作中我会用几个快速的信号来判断:
第一,看congestion预估。在Innovus里跑一个快速的global routing或者用工具自带的congestion map(比如report_congestion -hotspot),马上就能看到哪些区域红得发烫。如果在布图阶段就发现某些区域拥塞严重,那基本可以确定是macro摆放、region约束或者利用率设置有问题,趁早回炉。
第二,看线长统计。report_net或者看几个关键数据通路的net长度,如果明明是一片宏单元内部的数据连接,net却绕了半个芯片的距离,大概率是相关宏没有就近摆放。
第三,看时序初报。complete placement之后直接跑一遍时序(用ideal clock),虽然不准,但至少能看出哪些路径的长度远超过预期。如果一条路径的线长严重超长,要么是布图时相关模块距离太远,要么是那个模块的pin被堵住了导致绕线。
4.2 布局后发现拥塞严重怎么办
拥塞是布图规划阶段最常见的"翻车点"。出现congestion时,很多人第一反应是调整布局工具的参数,比如把effort调高、开spread mode之类的,但本质问题往往在布图。
排查步骤我一般是这样的:
第一步,看congestion热点位置和什么有关。如果热点正好在两个或几个宏单元之间的狭窄缝隙里,那很可能是宏把通道挤死了,应该调整宏的位置,给通道留宽一点。如果热点在某个宏旁边,可能是宏的pin access区域不够,标准单元只能绕到另一侧去连接,这种情况在宏旁边加keepout margin会有帮助。
第二步,看标准单元利用率是不是设置太高。利用率太高,core区域被塞满,布线资源不足,congestion必然爆炸。这种情况下,要么扩大core area,要么降低利用率,给布线层留出更多通道。
第三步,看电源条和布线方向是否冲突。stripe太密,或者stripe方向把某个金属层的有效轨道占掉太多,也会导致绕线困难。这种情况可以适当抽稀stripe,或者调整stripe的宽度和间距。
经常出现的情况是:布图阶段没有做congestion预估,layout出来才发现热点。所以我在第二节就强调,布图规划后一定要先跑一轮快速global route的对比,哪怕只是粗粒度预估算,也能帮你提前发现很多坑。
4.3 IO规划不合理导致的问题
IO规划在布图阶段容易被忽略,因为很多封装方案是前端或封装工程师定的,后端只是执行。但IO placement做得不好,同样会严重影响布图质量。
典型的例子:某两个有大量数据交换的模块一个在芯片左下角,一个在右上角,而连接它们的大量IO pad却被分散到四边,结果是片内连线被拉得很长,拥塞和时序双双爆掉。这种问题的本质是IO assignment阶段没有考虑模块内部的连接关系。
如果是自己做项目的场景,IO position可以自由定义,建议先根据顶层数据流把IO分组,同一组信号尽量集中在相邻的pad,让它们对应的内部模块也能就近摆放。IO pad到内部相关宏的距离尽量短,这样可以显著减少metal资源消耗。
如果你遇到的IO assignment是外部给定的,没法改,那只能尽量通过调整宏和region来匹配IO的位置。比如IO pad在芯片右侧,那和它关系紧密的模块就应该尽量往右侧挪,即使这和当前的数据流方向不完全一致,也要先保住IO到模块的短线长,因为IO路径往往指标更严格。
4.4 电源IR drop不过的布图级原因
IR drop问题到了signoff阶段才暴露是最折磨人的,因为那时候所有布局布线都定死了,只能靠改电源网络来救。
布图阶段导致IR drop不过的原因,常见的有这么几个:电源stripe间距过大;部分大电流区域(比如高翻转频率的逻辑簇)旁边没有足够的电源via/strap;电源环宽度不够导致从pad到内部供电路径电阻过大;局部区域被宏单元挡住,stripe无法穿越,形成"电源孤岛"。
排查IR drop问题,我的建议是在布图完成之后就跑一版快速IR分析,不要等到place和route全跑完。布图阶段没有标准单元分布数据,IR分析可能不太精确,但可以看出大框架是否合理。重点检查有没有某个比较大的区域完全没有stripe覆盖,或者某个大电流宏附近有没有预留足够的电源通孔位置。
如果布图阶段的IR评估已经出现明显的偏大区域,趁早调整stripe更省事,不要拖到后面。如果只是轻微超标,可以留到后面用电源网格优化命令来补,不影响大局。
4.5 布图阶段的效率技巧与文件管理
布图规划在整个后端项目里时间占比不算高,但对最终结果的影响却很大。效率高的人会在布图阶段想得多、做得快,我自己的经验是养成几个好习惯:
一是所有操作尽量命令化、脚本化。图形界面拖放宏单元确实直观高效,但每次拖动之后,要把最终位置通过脚本记录下来。我一般会在一个fp_cell_place.tcl文件里维护所有宏单元的绝对坐标,任何一次GUI微调,都同步更新脚本。这样万一有人不小心把floorplan清了,source一遍就恢复了。
二是保持版本迭代。每个版本的floorplan都在文件名里带上日期或版本号,比如fp_v1.def、fp_v2.def,方便回退和对比。调试布图问题的时候,diff两版def文件,能看出到底改了哪些宏的位置。
三是我习惯在布图阶段就把后续用的物理约束文件准备好,例如keepout margin、region、blockage。这样进入placement之后,工具会按照布图阶段的意图去干活,而不是每次都要回头补充约束。
5. 实操心得与进阶方向
5.1 从布图规划看后端工程师的全局观
布图规划这个环节很特别,它不像布线那样有清晰的自动化算法,也不像时序收敛那样有明确的违例数量指标。它更像是一个"半艺术半工程"的工作,考验的是你对整个芯片的数据流、时序要求、电源需求、工艺特性和封装方案的全局理解。
入行久了你会发现,布图规划做得好的人,往往不是工具玩得最溜的人,而是对设计架构理解最深的人。他们拿到RTL或者网表,扫一眼顶层结构,脑子里就能大概浮现出哪块放哪、数据流怎么走、哪里会堵、哪里时序容易出问题。这种sense不是天生的,是多次流片失败和迭代积累出来的。
如果你正在学习阶段,我建议你别只盯着工具命令,多花时间去理解你手里这个设计的功能架构。打开顶层模块图,把每个子模块的规模、宏单元数量、数据交互关系梳理一遍,再动手布图,效果会好很多。
5.2 布图规划工具的常用加速手段
虽然布图规划很吃经验,但工具还是提供了一些自动化提速手段,别浪费。
Innovus的floorplan exploration功能可以自动尝试多种不同的宏排列方案,给你一批备选结果,然后你根据congestion和线长指标挑一个最好的。这个功能在宏单元数量多、布局思路不明确时特别好用。不过要提醒一下,自动探索生成的结果通常偏保守,未必是最优的,最终还是要人工介入判断。
还有一个实用的思路是先用低effort跑一遍快速placement和route,把布图方案跑出"预结果",再用预结果来指导布图调整。这个方法虽然多花一点时间,但是对于没有经验的人来说,比凭空想象一个floorplan要靠谱得多。
5.3 后续内容预告
这篇笔记主要讲的是布图规划的核心思路和实操流程。后续我还会接着写数字后端学习笔记系列,包括标准单元布局的细节与优化、时钟树综合的常见策略、布线阶段的问题处理、时序收敛的调试技巧,以及IR drop和电迁移的分析方法。
数字后端这个领域,内容非常庞杂,没有一个环节可以孤立地学好。布图规划是入门的第一关,也是建立"全局感觉"的第一步。把这个打扎实了,后面学placement和routing会顺很多。
最后再分享一个小经验:我每次画完布图,都会闭上眼睛在脑子里过一遍电流从pad进来到宏单元、标准单元、再出去的路径,想象一下一条信号线从发送端到接收端要经过哪些区域。如果把这条虚拟的路径走顺畅了,布图大概率没有问题;如果发现某条路要绕一大圈甚至被堵住,那不用等工具报告,你已经提前发现问题了。这种"芯片内部地图感"是布图规划最宝贵的技能,也是你和纯工具操作者之间最大的区别。