拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Innovus Floorplan实战:5分钟掌握芯片布局规划核心流程

Innovus Floorplan实战:5分钟掌握芯片布局规划核心流程 1. 项目概述到底在搞定什么先别急着打开工具得先搞清楚 Floorplan 在 Innovus 整个数字后端流程里到底扮演什么角色。很多新手上来就拖 block、画电源环、摆 macro折腾半天发现后面 CTS 一堆违例、布线绕成麻花根子上全是 Floorplan 阶段埋的雷。Floorplan 说白了就是芯片版图的户型设计。你要盖一栋楼得先决定哪儿是客厅、哪儿是卧室、哪儿是厨房、哪儿是承重墙然后再去装修、布线、放家具。数字后端里Floorplan 就是决定各个功能模块block放在芯片的哪个位置、标准单元std cell往哪儿铺、存储器memory/macro怎么摆放、IO 怎么分配、电源网络怎么走的关键步骤。这个项目标题说5分钟搞定基础操作我作为干了十多年后端的老工程师得实话实说基础操作确实 5 分钟能学会但搞定两个字背后意味着你理解每一步操作解决的是什么物理问题。Innovus 的 Floorplan 界面不算复杂但每个菜单点下去都是有后果的不是点完就完事了。我会把从读入设计到完成基础 Floorplan 的完整链路给你梳理清楚包括初始化设置、芯片尺寸面积计算、IO 分配、macro 摆放策略、电源环和 STD 区域规划、保存与检查。每一步都告诉你为什么要这么做、做完之后看哪些指标判断好坏。这篇东西适合谁看刚接触 Innovus 的数字后端新人、从其他工具比如其他 EDA 工具转过来的工程师以及需要自己跑通完整流程但对 Floorplan 部分一知半解的同学。看完之后你至少能独立完成一个没有 macro 或少量 macro 的模块级 Floorplan并且知道下一步接什么流程。2. 工具准备与设计输入拿到手先干三件事2.1 启动 Innovus 前的环境清单在敲任何命令之前先把家底盘一遍。Floorplan 不是凭空开始的它需要输入一堆文件少了哪个都跑不下去综合后的门级网表.v / .v.gz这是设计的基础所有标准单元、宏单元、IO 单元的连接关系都在里面约束文件.sdc定义了时钟、时序约束、输入输出延迟Floorplan 阶段会初步评估你的时钟路径和 IO 时序是否合理库文件.tf、.lef、.lib工艺文件、物理库、时序库定义了每一层金属的规则、标准单元的大小、macro 的尺寸和 pin 位置IO 文件.io可选的预先定义好 IO pin 的位置DEF 文件.def如果是从其他工具或上一版流程带过来的可以读入物理信息继续迭代我在实际项目里最烦的就是有人拿了个网表就开跑结果 Floorplan 做到一半发现 LEF 版本不对或者 SDC 里时钟没定义全部推倒重来。所以第一件事按顺序检查文件完整性。2.2 读入设计的标准路径启动 Innovus 之后推荐用脚本 GUI 混合的方式操作。新手期虽然是5 分钟快速搞定但别养成全靠鼠标点的习惯后面项目复杂了脚本才是能复现、能回归的基础。# 创建/进入工作目录 set init_mmmc_file {mmmc.tcl} set init_lef_file {tech.lef stdcell.lef macro.lef} set init_verilog {top.v} set init_top_cell {top} set init_pwr_net {VDD} set init_gnd_net {VSS} init_design这段脚本干的事情就是把工艺物理信息LEF、门级网表Verilog、MMMC 视图时序约束一次性读进来建立设计数据库。init_design 完成后Innovus 会自动识别网表里所有的 instance、net、pin然后你就可以通过 GUI 看到芯片的原型了。注意init_pwr_net 和 init_gnd_net 这两行非常关键但经常被新手忽略。如果这里不指定电源地网络的名字后续画电源环、打电源 pin 的时候你会哭的。标准单元库里通常用 VDD/VSS但也有用 VDDA/VSSA 之类的模拟电源的情况一定要跟库里保持一致。读取完成后建议先跑一版check_design。这玩意儿会报告网表一致性错误、悬空 pin、未连接的电源地等基础问题。别嫌这一步浪费时间后面的时序、布线问题一半以上都能在源头上在这儿被拦下来。2.3 初始化 MMMC 你可能踩的坑MMMCMulti-Mode Multi-Corner是 Innovus 区别于旧工具的重要机制说白了就是同时可以加载多套时序库、多个工作模式、多个 PVT 角点。Floorplan 阶段不一定需要完整的 multi-corner但你至少得把 setup 和 hold 的库配好。# mmmc.tcl 示意 create_library_set -name lib_set_tt \ -timing {/path/to/tt.lib} create_rc_corner -name rc_tt \ -qrc_tech /path/to/rc_tech create_delay_corner -name delay_tt \ -library_set lib_set_tt \ -rc_corner rc_tt create_constraint_mode -name func_mode \ -sdc_files {func.sdc} create_analysis_view -name view_tt \ -constraint_mode func_mode \ -delay_corner delay_tt set_analysis_view -setup {view_tt} -hold {view_tt}新手最容易犯的错是只配置了 setup 库hold 库没配。Innovus 报错的时候又看不懂那些 obscure 的 error code结果在那儿瞎折腾半天。搞不定就老老实实把 ff 角、ss 角都配全哪怕只是形式上有后面 CTS 分析也需要。3. 芯片面积预估与尺寸设定别让差不多害了你3.1 面积估算是 Floorplan 的第一道数学题拿到网表并正确读入设计之后第一件正经事是估算芯片需要多大面积。这可不是拍脑袋定的它直接决定你后面标准单元的 density、macro 摆得下摆不下、走线通道够不够。Innovus 里有个命令可以快速估算利用率report_utilization但这里有个常见误区报告出来的 utilization 是标准单元总面积 / 可摆放标准单元区域面积。如果你还没定义 Floorplan 区域这个数字没有意义。所以我们得先规划芯片尺寸。手工估算方法其实很简单芯片总面积 (标准单元库中所有实例面积之和 macro 面积之和) / 目标利用率目标利用率一般取 60%~70%。为什么不是 100%因为标准单元之间要留布线通道电源网络要占资源时钟树综合也要插 buffer/inverter这些都会占用额外面积。我见过新手把利用率定到 85%结果 CTS 阶段 buffer 插完利用率直接爆表最后不得不返工重做 Floorplan血泪教训。3.2 使用 create_floorplan 正确设定尺寸Innovus 里基础命令是create_floorplan几种常用方式# 方式一直接指定宽高单位是 micron create_floorplan -site coreSite \ -core_margins_by die \ -die_size 2000 2000 \ -core_size 1800 1800 \ -left_io2core 50 -right_io2core 50 \ -bottom_io2core 50 -top_io2core 50 # 方式二按利用率自动计算 create_floorplan -site coreSite \ -core_density_size 0.65 \ -left_io2core 50 ...方式一适合你已经明确了封装尺寸、IO 数量的情况。方式二适合你还在早期评估阶段先给定一个期望利用率让工具根据网表面积反推尺寸。这里有一个非常实用的工作流先report_inst -all看总面积再乘以 1.4~1.6 的经验系数包含了 macro、电源网络、布线通道的余量得到预估芯片面积。比如标准单元总面积是 1mm²macro 加一起 0.5mm²目标利用率 65%那 core area 大约就是 (10.5)/0.65 ≈ 2.3mm²。3.3 长宽比和 IO 数量的关系芯片长宽比不是随便定的。如果你的设计有大量 IO那 IO limited 的设计更倾向于用长方形甚至细长条因为 IO 需要分布在四周。如果只有少量 IO比如 100 个以内内部逻辑面积主导正方形通常利用率最好。Innovus 里可以快速看一下 IO 数量和可用的 IO 环空间report_io一个快速估算公式假设 IO pitch间距是 80μm四周每边长度 L那这条边能放的 IO 数量就是 L / 80。你先算算四个边的总容量够不够你的 IO 数量不够就加大芯片尺寸。这一步省不下来我见过一个设计 IO 有 600 多个新手把芯片设成正方形结果 IO 挤得不行edge 上放不下不得不改成长方形重新做。3.4 设完尺寸后的三个必查项尺寸设定完成后别急着摆 macro先做三件事# 1. 观察 core 区域是否完整 report_floorplan # 2. 检查是否有 instance 落在 core 外面 check_floorplan # 3. GUI 里 F2 键刷新看整体轮廓check_floorplan这一步非常重要它会报告所有落在 core boundary 之外的 instance、IO 位置非法、标准单元和宏单元重叠等问题。我习惯把这一步当作Floorplan 的门禁检查不过关不往下走。4. IO 分配与电源规划细节决定成败4.1 IO 分配的几个基本原则IO pin 的位置决定了信号从芯片外部进到内部核心逻辑的路径长度。新手容易犯的错误是只看 IO 名字随便放根本不关心它对应内部哪个模块。正确做法是先看网表层次结构和关键模块位置再往回推 IO 应该放在哪边。比如你的设计里有 DDR 控制器相关的地址数据 IO 应该放在靠近 DDR controller 模块的那一边高速 SerDes 的 IO 要找最短路径接入模拟/IP 区域。这需要在读入网表后先看看层次化结构report_hierarchy然后你要可以在 Innovus GUI 里高亮某个模块的所有 IO直观地看它们分布在芯片四周的什么位置。如果某个模块的 IO 分布得乱七八糟从芯片一头到另一头那即使 Floorplan 内部摆得再好时序也好不了——绕线就是时间时间就是性能物理距离就是延迟。设置 IO 的常用命令set_pin_physical_constraints -pin_name {data_in[0]} -layer M3 -side 2 -offset 50注意 side 参数1 是 bottom2 是 right3 是 top4 是 left具体以版本说明为准offset 是从原点开始的距离。这个操作在 GUI 里也可以直接拖动 IO 单元但拖动出来的位置不会自动写进脚本后面如果重新 init_design 就全丢了。所以我强烈建议IO 位置确定后用write_io_file把结果导出下次直接读回来write_io_file -file top.io4.2 电源网络的 Floorplan 阶段任务电源规划是 Floorplan 阶段最容易让新手懵掉的部分因为 Innovus 的电源相关命令很多而且画错不会立刻报错到 IR drop 分析或者布线阶段才暴露。Floorplan 阶段的电源任务主要有几个明确芯片的 IO 电源 pad 和 core 电源 pad 位置在 macro 周围创建电源环power ring确定标准单元区域的 power stripe 方向和间距给宏单元供电如果是双电源域设计Innovus 里创建电源环的命令create_rectangular_rings -nets {VDD VSS} \ -left_offset 1.0 -left_width 2.0 \ -right_offset 1.0 -right_width 2.0 \ -bottom_offset 1.0 -bottom_width 2.0 \ -top_offset 1.0 -top_width 2.0 \ -around core这里的单位是 micron。电源环宽度取决于电流大小一般由 IR drop 分析决定。新手期可以先按经验设置IO 电源环 10~20μmcore 电源环 5~10μm后续再做 IR drop 迭代。但注意如果你的设计电流很大10μm 可能不够。电源 stripe 的规划add_stripes -nets {VDD VSS} \ -layer M4 -direction vertical \ -width 1.0 -spacing 2.0 \ -set_to_set_distance 50 \ -start_from left \ -area {l lx ly rx ry}stripe 间距和宽度没有统一答案依赖工艺、功耗、布线资源。我常用的经验是先用 50μm 的 stripe 间距起步跑完供电分析再决定加宽还是加密。提示Floorplan 阶段画电源环/stripe未必一次到位。我一般在初次 Floorplan 时只需要把电源环画好stripe 可以等标准单元放完、利用率确认后再 add因为 stripe 太密会占用布线资源太稀 IR drop 又会超标。迭代式设计是后端常态。4.3 利用 FlexIO 模式快速摆 IOInnovus 较新版本支持 FlexIO可以让你在 IO 数量多的时候自动优化 IO 位置。开启方式set_db IO_assignment_mode flex place_io不过在使用 FlexIO 之前你得先把关键模块的位置预判好。FlexIO 虽然自动化程度高但它不知道你内部哪个模块是高优先级的、哪条路径是 critical 的。遇到非常关键的时序路径我会手动把对应 IO 定死剩下的交给 FlexIO 排。5. Macro 摆放的核心逻辑一个搬家公司的自我修养5.1 为什么要合理摆放 macro信号延迟的物理本质Macromemory、IP在 Floorplan 里是老大难。一个 DDR 控制器里可能有十几个 memory macro每个都有几十上百个 pin摆放不好直接影响数据通路的延迟。打个比方你在布置新家沙发、床、书桌放哪儿不是随机的。你每天从床上起来要去书桌办公那床和书桌之间的动线就该短。芯片里 Macro 与逻辑模块、IO 之间的关系也是一样——高频访问、大量数据交互的对象必须挨得近。但光挨得近还不够还要考虑 pin 方向。比如 memory 的地址 pin 和 data pin 通常分布在相邻的两边你得让数据 pin 朝向数据通路的逻辑模块那边而不是朝向一堵墙。这需要你在 GUI 里看清楚 macro 的 pin 分布。5.2 Macro 摆放的四步流程我习惯用四步法来摆 macro第一步梳理数据流。画一张模块连接关系图标注哪些模块交互最频繁、哪些 path 是 critical timing。这个图不一定用专业工具画个草稿就行关键是心里有数。第二步确定 macro 的「群组」group。同属一个功能模块的 memory 摆在一起比如 CPU 的 L2 cache 四块 SRAM 摆成阵列DDR controller 的一组 memory 围绕控制逻辑摆放。第三步在 Innovus GUI 里用move或 GUI 拖拽放置。过程中关注几个东西# 放置时启用对齐辅助 set_db place_global_alignment_effort high # 放置后立即检查重叠和边界问题 check_floorplan第四步放完后跑一个快速trial route看看拥塞情况trial_route -expand_route report_congestionreport_congestion的结果告诉你当前的 placement 大概会带来多少布线拥塞。如果 hotspot 超过了 1.1~1.2说明这里太挤了需要重新调整 macro 位置或加大面积。5.3 用命令和 GUI 工具做半自动摆放完全手动摆 macro 太累完全自动又不可控。Innovus 提供了place_opt_design的 placement 流程但对 macro 级别的摆放我更喜欢用 GUI 的 Placement - Place Macros 功能结合脚本微调。如果设计中宏单元数量较多可以先用自动摆放生成一版初稿再手动调整关键 macroplace_macro -auto # 手动微调 edit_move -inst {mem0} -dx 20 -dy 30自动摆放的结果通常不是最优的它只保证不重叠、大致在区域里不会帮你考虑 pin access、timing critical path 这些深层次问题。因此自动摆放只是起点后面的手动优化是必经之路。注意编辑 macro 位置后一定要检查它是否与电源环、stripe、其他 instance 重叠。Power ring 是包着 macro 一圈的环主要给 macro 内部供电如果 macro 挪了但 ring 没跟上后面要么遗漏供电要么始终报 LVS 错误。5.4 Macro 方向优化不转不知道一转省几万Macro 的朝向orientation是个容易被忽略但影响很大的细节。一个 100μm x 100μm 的 macro转 90 度可能意味着 pin 从面向逻辑变为背向逻辑绕线长度相差几百 μm时序差距可能达到几十 ps 甚至上百 ps。Innovus 里宏单元的朝向通过 GUI 的 Rotate 按钮或命令设置set_inst_orientation -inst {mem0} -orientation R0常见的 orientation 有 R0、R180、MY、MX 等R0 是不旋转R180 是旋转 180 度。具体该用哪个得看 macro 的 pin 位置。同样一个 macro如果 pin 在上边走R0 摆得对不对R180 可能 pin 就朝下了。我通常会在摆放完所有 macro 后用 GUI 的 Highlight Selected 功能把关键 net 显示出来看连接线是否跨越了大半个芯片。如果某条关键 net 的走线长度异常优先检查 macro 的朝向而不是直接加 buffer 硬撑。5.5 Fence、Region 与 Guide给工具画圈当你对某些宏单元和逻辑模块的位置有明确想法但又不想一个个去手动摆标准单元时可以用 Region 或 Fence 约束。Fence模块所有 instance 必须放在指定区域内最严格Region模块实例尽量放在区域内但有柔韧性Guide推荐区域工具可以偏离create_region -name reg_ddr -area {x1 y1 x2 y2} -type fence -instances {ddr_ctrl ddr_phy}什么时候用 Fence我一般只在两种情况下用一种是模拟 IP 有非常严格的隔离要求必须固定在一定范围内另一种是多 instance 的模块需要聚拢避免 PR 工具把它们打散。Fence 还有两个进阶用途其一是精确控制模块间距比如两组高精度模拟模块之间必须要隔开一段距离以避免串扰你就能用 Fence 构建出固定的间距带其二是为后续的模块化编译和后工艺 ECO 预留已知的位置关系——这样每个子模块的物理边界在 Floorplan 阶段就明确了后续改版的影响面可控。6. 标准单元区规划与 I/O Ring 处理看得见和看不见的空间6.1 设置 Core 边界与 Blockage在完成 macro 之后标准单元的摆放区域就浓缩到了剩余的空间里。这时我有两个必做的动作第一检查 macro 是否占据了太多核心布线资源。可以用create_placement_blockage -type hard把 macro 内部的布线区域直接禁掉避免后面工具把走线穿过 memory 区域memory 上方通常只能走有限层金属物理上就不行。create_placement_blockage -type hard -area {x1 y1 x2 y2}第二给那些要保留做时钟树或特殊布线的通道预留空间。比如你打算在某个走线密集的通道设置时钟树专用的 clock trunk那就预先划一块 soft blockage让普通标准单元别占用这块区域。6.2 顶层电源网络的完整创建顺序我看到不少新手画电源时随性子来一会儿画 ring一会儿画 stripe最后出来一团乱麻。这里给出一个标准的创建顺序照着做基本不会错创建 VDD/VSS 的 IO 电源 pad 和 core 电源 pad 的物理连接在 core 周围创建电源环create_rectangular_rings给区域内主要 macro 创建局部电源环如果工艺要求用add_stripes创建横竖方向的电源 stripe用globalNetConnect声明标准单元的电源地连接关系用sroute -nets {VDD VSS} -corePower完成电源网络初步布线第 5 步非常关键。标准单元的电源地连接方式一般在 LEF 里定义了 VDD/VSS 的 PIN你得明确告诉工具这些 pin 是全局连接globalNetConnect VDD -type pgpin -pin VDD -inst * -override globalNetConnect VSS -type pgpin -pin VSS -inst * -override不执行这两条命令的后果是标准单元的电源引脚不会自动连到电源网络后续写出的网表会有大量电源地连接缺失DRC/LVS 直接凉凉。6.3 Virtual Flat 与层次化视野对于包含大量子模块的设计Floorplan 阶段建议打开 Virtual Flat 状态这样可以同时看到完整层次关系下的所有 instance而不是仅仅看到顶层模块框框。set_db virtual_flat trueVirtual Flat 对检查 macro 是否被重复使用、模块边界是否跨芯片连接非常有用。但它也有副作用——GUI 刷新变慢实例多了以后点选会卡。所以该关就关别一直开着。7. 常用 Floorplan 命令汇总与实战脚本框架为了让5 分钟搞定不只是口号我把平时用的一套基础脚本框架贴出来你可以直接整个拿去跑再根据设计具体调整# 1. 初始化 set init_design_settop 1 set init_mmmc_file {../script/mmmc.tcl} set init_lef_file {../lef/tech.lef ../lef/stdcells.lef ../lef/macro.lef} set init_verilog {../netlist/top.v} set init_pwr_net {VDD} set init_gnd_net {VSS} set init_io_file {../io/top.io} init_design # 2. 基本检查 check_design -pre_floorplan # 3. 创建芯片轮廓 create_floorplan -site coreSite \ -core_density_size 0.65 \ -left_io2core 50 -right_io2core 50 \ -bottom_io2core 50 -top_io2core 50 # 4. 电源规划 globalNetConnect VDD -type pgpin -pin VDD -inst * -override globalNetConnect VSS -type pgpin -pin VSS -inst * -override create_rectangular_rings -nets {VDD VSS} \ -left_offset 1.0 -left_width 2.0 \ -right_offset 1.0 -right_width 2.0 \ -bottom_offset 1.0 -bottom_width 2.0 \ -top_offset 1.0 -top_width 2.0 \ -around core add_stripes -nets {VDD VSS} \ -layer M4 -direction vertical \ -width 1.0 -spacing 2.0 \ -set_to_set_distance 50 \ -start_from left # 5. 临时摆放 macro之后手动微调 place_macro -auto # 6. 保存数据 write_floorplan -all top.fp saveDesign top_floorplan.enc这套流程下来一个模块级的 Floorplan 雏形就出来了。注意write_floorplan和saveDesign的区别前者是把 Floorplan 的几何信息导出成文本适合做版本 diff后者是整个数据库快照包括所有中间状态恢复时直接 loadDesign 即可。8. 常见问题与排查技巧实录8.1 问题一check_floorplan 报 Macro 重叠这个最常见。原因多半是手动拖动时没开吸附对齐或者自动摆放之后又移动了某些 instance。排查很简单在 GUI 里把 overlap 高亮出来逐个调整。如果重叠数量大可以用一个命令把所有 macro 按照就近原则重新铺开legalize_macro_placement这个命令会让 macro 之间不重叠但位置可能不是你想要的仍然需要手动微调。8.2 问题二IO 冲突IO 单元间距不够通常表现为place_io时大量 warning 或 error。解决思路很简单要么加大芯片尺寸要么改小 IO 间距。但 IO 间距受封装和 bonding 限制不能无限缩小特别是 bond pad 设计。所以在 Floorplan 初期就要留足 IO ring 的空间别等 IO 放不下再改。8.3 问题三电源环连接报错create_rectangular_rings之后有时会报CR-5201之类的错误说 ring 无法连接到某些电源引脚。原因是你的 macro 电源引脚名字不统一有的叫 VDD有的叫 VDDPST、VDDA。解决方法是把各个电源域单独建 ring并用globalNetConnect逐一指定globalNetConnect VDDPST -type pgpin -pin VDDPST -inst * -override提示涉及多电源域的时候先画出全芯片的电压域规划图再动手设 ring你会少走很多弯路。我见过有人在 Floorplan 布了两个不同电压域的模块结果电源 ring 混着画到一起后面做 DVFS 和隔离 cell 时一步一个坑返工成本极高。8.4 问题四密度过高标准单元塞不下report_utilization一看 80% 以上后面 place 很可能跑不出合法结果。如果确实需要高密度设计可以先看看是否为某些硬 IP 和 macro 预留的空间太大重新评估 macro 的站位效率如果所有地方都合理那就得加大芯片面积了。记住Floorplan 阶段多花 10 分钟调面积后面 route 阶段能少遭一星期的罪。8.5 问题五Fast 和 Slow 角下的时序裕量悬殊有时候 Floorplan 阶段用 slow 库评估的布线长度和拥塞都正常但切换到 fast 角一看关键路径又变了。这就是为什么 MMMC 配置一定要把各个分析 view 都配齐别只看默认角。我在项目里经常对比多个角下的 congestion 分布——如果某个区域在不同角下都是 hotspot那它大概率是结构性问题必须从 Floorplan 层面解决光靠 place 工具去绕是绕不出来的。9. 实操现场记录一次从 0 到能跑的低速接口模块光讲理论没意思拿一个真实场景串一遍。假设有个低功耗 MCU 子系统约 20 万门内部有 8 个 SRAM macro120 个 IO包含 SPI、UART、GPIO、Timer 等外设。我拿到网表后先report_hierarchy梳理模块发现 SPI 模块和 GPIO 之间有大量并列数据总线连接这两个模块放远了对 timing 很不友好。所以 IO 分配时我把 SPI 和 GPIO 的 IO 放在芯片同侧靠近它们所在逻辑区域缩短信号从 pad 到内部逻辑的路径。设好 IO 后我把 8 个 SRAM 分成三组一组围绕 CPU core 放一组围绕 DMA 控制器放一组紧挨数据总线的桥接逻辑放。这个摆放方案不是一次成的是在第一版 checked_floorplan 和 trial_route 之后发现 DMA controller 和对应 SRAM 之间的走线拥塞过高才做了一次微调挪动了其中一个 64KB SRAM 的位置最终 congestion 从 1.18 降到了 1.02。电源方面因为设计了两个电压域0.8V core 和 1.2V IO我建了两组电源 ring分别命名 VDD/VSS 和 VDDIO/VSSIO中间用 header cell 衔接。这一步在 Floorplan 阶段就体现出了价值——后续做功耗意图UPF和隔离策略时物理位置关系一目了然。整个过程从 init_design 到输出 floorplan 存档界面操作加上脚本修正大约一个多小时。对新手来说前几次肯定慢但走通一遍之后后续同类设计基本能压到 5 分钟出初版再花半小时优化细节。10. 经验心得与进阶方向我现在回头看Floorplan 这个阶段最核心的能力其实不是会用鼠标拖 macro而是在动手之前就大致推演出后面几步会怎样。哪些宏单元会阻碍走线哪些 IO 放在哪边能最大程度降低核心路径延迟哪些区域会 EM 超标——这些判断靠的是对设计本身的理解而不只是对工具命令的熟稔。Innovus 只是把你的判断变成物理实现而已。如果你刚起步我建议别急着上自动化大脚本先手跑几个中小型模块感受一下不同摆放方案在 trial route 之后的拥塞差异。这个过程建立起来的物理直觉后面做大规模 SoC 的时候会非常值钱。进阶可以往这几个方向走层次化 FloorplanHierarchical Design多电压域 Floorplan基于早期功耗分析的 IR drop 优化以及结合时序分析结果做增量式宏单元重摆。这些每一样都够单独开一篇长文。尤其是层次化 Floorplan团队协作的大型芯片基本都离不开它——核心模块先独立做内部 Floorplan再作为黑盒嵌入顶层既压缩迭代时间也让各子团队之间的物理约束清晰化。最后再分享一个小习惯每版 Floorplan 完成之后我都会把利用率、macro 数量、面积、拥塞分布这几个指标截图存个档后面如果时序或者 DRC 暴雷历史数据能帮你快速定位是不是 Floorplan 引入的回归。这个习惯救过我很多次。
返回列表