简介:围绕Cadence Genus综合平台iSpatial Flow的快速上手技术资料,面向数字IC前端综合工程师及后端物理实现人员,旨在帮助缩短RTL到GDS的设计周期,并提升综合对后端布局布线的预测准确性。文档系统讲解统一物理优化引擎、关键区域重构、早期时钟树流程以及综合阶段直接调用Innovus GigaOpt等核心方法,并结合CPU/DSP等不同工艺节点案例,对比Spatial Flow列出WNS、TNS的量化改善;同时涉及iSpatial DFT Flow与Innovus引擎一致性等内容。阅读后能理解iSpatial Flow的基本概念、应用时机和PPA优化切入点,便于在实际项目中减少迭代次数。资源为1个PDF文件,共2.14MB,内容精炼且偏工程实践,适合已有一定综合基础、正评估Genus新流程的工程师;其中的流程示意图和对比数据还可直接用于团队内部技术交流。已有241人学习,可作为入门与选型参考。
1. 快速上手Genus综合模板:为什么iSpatial Flow值得你先跑一遍
在做先进工艺数字前端时,最磨人的不是RTL综合本身,而是综合结果一到后端手里就变了样:时序余量缩水、拥塞点转移、功耗和预估对不上,于是前端改RTL、后端重新布局,来来回回好几轮。Genus 综合工具在物理综合方向上的 iSpatial 模板,就是为了把这个“前后端鸿沟”填掉。它把后端布局布线工具里的 GigaPlace/GigaOpt 引擎直接搬进 syn_opt -spatial 阶段,让综合出来的网表从第一步就带着物理意识。这份模板能帮你省掉大量无意义的综合迭代,尤其适合正在用 Genus 做 7nm 及以下工艺、又被 Innovus 布局结果反复打脸的工程师。先别急着调约束,先把 iSpatial 流程跑通,你看到的时序才是接近后端真实样子的时序。
2. iSpatial Flow到底改了什么:从两套物理引擎到一套统一引擎
2.1 早期Spatial Flow的步骤和它的天花板
在 iSpatial 之前,某厂商在 Genus 里推的是早期 Spatial Flow。这个流程的设计出发点并不差:从综合一开始就引入物理信息,不再让综合对布局一无所知。它的标准操作分两步,第一步是syn_gen -phys,读入设计的同时也读入物理信息,比如标准单元的摆放、宏单元的位置、粗略的密度图;第二步是syn_opt -spatial,在布局信息已知的前提下做网表优化。这个阶段不是普通的逻辑优化,它会调用布局引擎、全局布线引擎、延迟计算和寄生参数提取,尽可能让综合结果往后端布局靠拢。
我最早接触早期 Spatial Flow 是在一个 40nm 的项目上。那时它的优点很明显:设计从 RTL 进来就是“带着坐标在做综合”,所以关键路径上不会出现那种逻辑级数很浅但绕线延迟爆炸的情况。因为在整个综合阶段已经做过一次标准单元摆放,后端 Innovus 在做详细布局时,不需要从零开始摆,继承性比纯逻辑综合好很多。当时团队里最直观的感受是:同样的 RTL,用 Spatial Flow 交出去,Innovus 里看到的 WNS 至少不会比综合结果恶化太多。
但这个流程的天花板也很清晰:Genus 里自带的布局引擎和后端 Innovus 的布局引擎并不是同一个东西。说得直白点,前端综合里的布局更像一个“近似版”,它能给出大致的位置关系,但不会像 Innovus 那样做精细的单元优化、详细绕线拥塞分析和时钟树综合。更关键的是,Innovus 里很多已经被验证有效的高级功能,比如早期时钟树流程(Early Clock Flow,ECF),在这个早期 Spatial Flow 里根本调不动。结果就是:综合阶段说时序收敛了,Innovus 布局完又还给你一个更差的 WNS。于是项目里的默认做法只能在综合阶段反复加约束,用一轮又一轮的重新综合去“猜”后端可能出现的物理问题。这种迭代带有太多不确定性,每轮 TAT 都是几小时到几十小时,越到项目后期越难受。
2.2 统一物理优化引擎:GigaPlace/GigaOpt被搬进syn_opt -spatial
iSpatial Flow 针对上面那个痛点做的最核心改动,是让综合和布局布线共用同一套物理优化引擎。以前是 Genus 用一把引擎做摆放,Innovus 用另一把引擎重新做;现在是把 Innovus 的 GigaPlace 和 GigaOpt 放进 Genus 的综合流程里来。也就是说,你在syn_opt -spatial阶段调用的不是“一个模仿后端布局的工具”,而是后端真正在用的那套优化引擎本体。
这个统一带来的好处,首先体现在预测性上。因为引擎一致,综合阶段做完 iSpatial 后的 WNS/TNS,和 Innovus 做完预布局(POD)后的 WNS/TNS 有非常高的一致性。官方在多个工艺节点上给出的对比里,iSpatial 结束时的 WNS 和 Innovus POD 之间的差距往往只有百分之几。有了这个一致性,前端就不用再等后端跑完一轮详细布局,才去判断自己的网表到底行不行。综合结束的那一刻,你基本就知道这个 RTL 交给后端会长成什么样。
其次,统一引擎让综合阶段可以直接使用 Innovus 里的成熟功能。比如 Advanced Analysis Engine(AAE),它是比传统单模式时序分析更精确的多角多模式分析引擎;再比如 Early Clock Flow,可以在综合阶段就把时钟偏移、门控时钟这些信息考虑进去,而不是等后端做时钟树之后才暴露问题。这一点对高性能设计特别关键,因为很多关键路径的时序瓶颈其实出在时钟到达时间的偏差上。
我在实际项目里体会最深的是:在早期 Spatial Flow 下,如果综合完发现关键路径违规,你可能要回到 RTL 重新做结构调整,或者把约束改得更激进再来一轮;但 iSpatial 因为能直接调用后端的物理优化引擎,它在布局后拿到准确的关键路径和模块,可以直接做针对性的网表重构,也就是后面会详细讲的 CRR。这相当于把原本属于后端的“局部优化能力”前置到了综合阶段,而且不需要打断你的 RTL 迭代节奏。
2.3 为什么前端能预测后端:AAE、Early Clock Flow和POD一致性
要理解 iSpatial 为什么能显著缩短设计周期,可以把它拆成三个关键机制。
第一个机制是物理信息前置。iSpatial 不是等到syn_opt -spatial才看物理,而是从syn_gen -phys阶段就开始读取设计的布局边界、宏单元位置、IO 位置这些信息。这样整个映射和优化过程始终被物理约束包围,不会做出一个在逻辑上最优、物理上却无法收敛的网表。比如多路选择器结构,纯逻辑综合可能会把它优化成某个深度的逻辑链,但加上物理信息后,它可能会选择把路径长度作为更重要的优化目标。
第二个机制是 Early Clock Flow(ECF)。传统流程里,综合阶段建模时钟用的是理想时钟,等后端做完时钟树综合,真实的时钟偏移和延迟一进来,时序全线乱套。ECF 的做法是在综合阶段就插入一个虚拟时钟树估计,让综合工具提前知道哪些单元靠近时钟源、哪些单元会被插到很长的时钟链上。这样工具在优化数据路径时,会自动给处在时钟晚到达区域的关键路径留出更多余量。这本质上是用一个低成本模型,换掉后面后端时钟树阶段的高成本翻车。
第三个机制是优化引擎的一致性。因为 iSpatial 和 Innovus 共用 GigaOpt 引擎,所以综合阶段看到的优化力量、优化策略、甚至拥塞处理方法,都和 Innovus 前后脚。后端拿到 iSpatial 的网表后,不需要推翻重来,只要做增量布局和时钟树综合就行。这个一致性让前后端之间的“鸿沟”变成了“一条小沟”。我给一个形象的比喻:以前是前端画了一张平面图,后端拿去重新盖楼;现在是前端和后端用同一套设计图纸同一个施工队,后端只是做最后的装修和验收。
也正是因为有这三个机制,iSpatial 的结果才能被用来预测 Innovus POD 的结果,前端也才能在综合阶段就发现并修复后端的时序问题。从这个角度看,iSpatial 更像是一个“带物理意识的综合 + 预布局”混合流程,而不是单纯的多了一步布局。
3. 在模板里把iSpatial流程跑起来:五个阶段的脚本骨架
3.1 模板里都有什么:输入文件与关键目录
拿到了 iSpatial 模板以后,先别急着运行,第一件事是摸清模板的目录结构,以及它指望你提供哪些输入文件。根据我在这类综合项目里的整理习惯,模板通常分四个输入区:RTL 源码、约束文件 SDC、物理边界文件 DEF、库文件 LIB/DB。此外还会有一个脚本区,里面按阶段拆好了syn_gen、syn_map、syn_opt_spatial三个脚本,外加一个可选的ecf.tcl。
物理边界文件 DEF 是 iSpatial 和普通逻辑综合的最大区别点。普通综合只需要 RTL 和 SDC,iSpatial 则需要你提供版图边界信息,比如芯片尺寸、宏单元位置、IO pad 位置、密度约束等。如果没有 DEF,iSpatial 实际会退回成早期 Spatial Flow,或者干脆只做纯逻辑优化,你的结果自然也就失去了预测性。所以拿到模板后,第一件事就是确认你的物理输入是不是齐全。
我习惯在项目目录下建一个input/文件夹,把所有物理相关文件集中放好,避免脚本里的相对路径在不同人手上跑出不同结果。下面是一个典型的输入文件清单:
| 类型 | 文件 | 作用 |
|---|---|---|
| 库文件 | stdcells.lib / db | 标准单元时序功耗模型 |
| RTL | top.sv + 子模块 | 待综合源码 |
| 约束 | top.sdc | 时钟、输入输出延迟、时序例外 |
| 物理边界 | chip.def | 芯片尺寸、宏单元、IO 位置 |
| 配置文件 | iSpatial.config | ECF开关、CRR选项、面积/时序权重 |
3.2 阶段一:syn_gen -phys读入物理信息
在模板的syn_gen.tcl里,核心工作是读入设计和物理信息,并生成一个“物理感知”的未映射网表。我一般会在脚本里这样组织:
# syn_gen.tcl —— 物理感知预综合阶段 set_db init_lib_search_path ../lib set_db init_hdl_search_path ../rtl read_db stdcells.db read_hdl top.sv elaborate top read_sdc ../constraints/top.sdc read_physical ../phy/chip.def ;# 部分release写read_def,模板里统一用read_physical开关 syn_gen -phys write_db ../output/top.gen这段脚本的逻辑是先读库、读 RTL、做 elaboration,再读 SDC 和 DEF,最后执行syn_gen -phys。关键点在于read_physical之后的syn_gen -phys,这一步会真正把物理信息绑定到设计数据上。write_db把当前状态保存下来,方便后面重新加载,不用每次从头跑。
这里要特别提醒一个参数倾向:syn_gen -phys阶段尽量不要加过强的优化选项。它的目标是建立物理意识,不是做最终优化。如果你在 gen 阶段就开了很高面积的 effort,后面的 map 和 opt 阶段反而会失去调整空间。模板里默认只开了-phys开关,没有额外优化,我建议你也保持这个节奏。
3.3 阶段二:syn_map -phys做RTL映射
第二个阶段是把经过物理预综合的 RTL 网表映射到标准单元库上,同时保持物理信息不丢失。模板的syn_map.tcl通常写在syn_gen.tcl生成的.gen文件基础上继续跑。这一步会确定最终的触发器、组合逻辑门、多路选择器结构,从而决定后面积和时序优化的基准。
# syn_map.tcl —— RTL到门级映射 set_db init_lib_search_path ../lib read_db stdcells.db read_db ../output/top.gen set_db map_effort medium set_db area_weight 0.5 set_db delay_weight 0.8 syn_map -phys write_db ../output/top.mappedread_db ../output/top.gen是为了把syn_gen阶段已经绑定的物理信息读回来。map_effort medium是模板里的默认值。我一般不建议第一次跑就上 high,不然映射过程会花很长时间,而且可能因为过度优化把原本的物理结构打乱。area_weight和delay_weight参数用于控制在映射阶段对面积和延迟的取舍比例。0.5 对 0.8 的意思不是简单的比例,而是把延迟作为更优先的目标,但不会完全忽略面积。这个值的设置要根据你的项目目标来调:如果功耗和面积更重要,可以适当提高area_weight。
syn_map -phys后面这个-phys很重要,它确保映射过程继续沿用物理信息,而不是退化到纯逻辑映射。如果你在这步漏了-phys,后面syn_opt -spatial也能跑,但结果和早期 Spatial Flow 就没本质区别了。
3.4 阶段三:syn_opt -spatial完成布局感知优化
到了syn_opt -spatial,iSpatial 才真正开始展现它的威力。这一阶段会调用 GigaPlace 做布局,再用 GigaOpt 做布局后的物理优化。模板脚本大致是这个形态:
# syn_opt_spatial.tcl —— iSpatial布局感知优化 set_db init_lib_search_path ../lib read_db stdcells.db read_db ../output/top.mapped set_db opt_effort high set_db max_utilization 0.7 set_db congestion_enable true set_db crr_enable true set_db early_clock_flow true set_db use_aae true syn_opt -spatial report_qor ../reports/top.ispacial.qor report_timing -max_paths 1000 -path_type full > ../reports/top.ispacial.timing write_db ../output/top.ispacial write_netlist ../output/top.ispacial.v write_sdc ../output/top.ispacial.sdc这里有几个参数需要逐个解释。opt_effort high对应的是一个比较重的优化力度,因为到这个阶段已经没有太大面积选择空间,重点是消除时序违规和拥塞。max_utilization 0.7是标准单元利用率上限,它给布局器留出足够的绕线通道。如果你的设计密度很大、拥塞严重,可以把这个值降到 0.6;相反,如果是一个很空的模块,可以放宽到 0.8,但要注意别给后端留隐患。
congestion_enable true是模板中默认打开的开关。它不只是做全局布线估算,还会把拥塞信息反馈给优化引擎,让工具优先考虑疏解拥塞区域的单元摆放。这个开关直接关系到 iSpatial 对后端拥塞的预测准确度,不建议关闭。crr_enable true是打开关键区域重构(CRR)。early_clock_flow true和use_aae true分别对应早期时钟树流程和高级分析引擎。这四个开关同时打开,基本上就是 iSpatial 模板的标准配置了。
syn_opt -spatial跑完后,模板会输出四样东西:QoR 报告、时序报告、优化后的网表、优化后的 SDC。其中write_sdc这一步很容易被忽略,但如果你打算把 iSpatial 的结果交给 Innovus 继续跑, SDC 是必须的。注意它输出的 SDC 会比输入 SDC 多了时钟树估计和生成时钟信息,这是供后端继承早期时钟树结果的。
3.5 阶段四:打开Early Clock Flow和AAE
在syn_opt_spatial.tcl里,我用set_db early_clock_flow true和set_db use_aae true两个开关来启用 ECF 和 AAE。它们不额外增加太多运行时间,但对最终结果的一致性影响巨大。
Early Clock Flow 的作用简单说就是:让综合器在优化数据路径之前,先估算一下各单元时钟到达的时间。这样工具在摆放关键路径单元时,不再假设所有触发器同时看到时钟沿,而是会尽早把位于“时钟晚到”区域的路径优化得更快。如果你不打开这个开关,iSpatial 虽然跑了布局,但对时钟收敛的预测能力会明显削弱,Innovus POD 后时序和综合结果仍然可能产生偏差。
AAE(Advanced Analysis Engine)则是更精确的多角多模式时序分析引擎。普通综合默认可能只做单模式单角度的时序收敛,AAE 可以同时考虑慢角、快角和多工作模式。先进工艺下同一个路径在慢角和快角下的表现差异很大,如果不提前用多角分析,综合以为是收敛的路径,实际流片时可能在快角下直接失效。模板里use_aae true会显著提升对建立时间和保持时间违规的预测能力,代价是运行时内存有所增加。
3.6 阶段五:写出网表和QOR报告
模板的最后一个阶段不是再做优化,而是把结果干净地交付给 Innovus。这里我建议严格按照下面这一步来写输出:
# 把iSpatial结果交付给Innovus ./run_innovus.sh -f innovus.tcl在交付之前,先人工确认几个文件都生成了:
top.ispacial.v # 网表 top.ispacial.sdc # 带早期时钟树信息的约束 top.ispacial.def # 布局信息,Innovus可以直接继承 top.ispacial.qor # 供前端查看WNS/TNS/拥塞/功耗top.ispacial.def是 iSpatial 和 Innovus 之间真正实现“无缝衔接”的桥梁。有了它,Innovus 不需要从零开始重新摆放,而是可以直接在现有布局基础上做增量优化。我见过不少工程师把 iSpatial 当成普通综合,只拿网表和 SDC 给后端,结果 Innovus 还是从空底板开始布局,不但预测性没了,时间也浪费了。模板里特别强调要写出 DEF,这一点请一定不要省。
4. 模板里的三个加分项:CRR、DFT接入和POD预测
4.1 关键区域重构:RTL综合的“后悔药”该不该吃
iSpatial 模板里最值得上手体验的一个功能是 Critical Region Restructuring(关键区域重构,CRR)。在传统综合流程里,如果布局后发现某条关键路径时序违规,工具的思维是“回到 RTL 找原因”,然后通过过约束那一段路径、重新综合,期望它调整出一个更合适的逻辑结构。这样做的副作用是:你以为只影响了那一条路径,实际上重新综合可能把周边一堆逻辑结构都改掉,带来意料之外的面积增加或新违规。
CRR 的做法完全不同。它在syn_opt -spatial完成布局后,拿到准确的关键路径和物理模块,然后只针对这些区域做网表重构。比如原来某条路径用的是串行加法器链,CRR 可能会在布局后环境中把它重构成超前进位加法器;或者某个多路选择器的连接方式在物理上绕了大圈,CRR 会基于位置信息重新拓扑。这种重构是局部性的,不影响大面积的 RTL 结构,因此收敛效率更高,也更可控。
我建议第一次用模板时把crr_enable true打开,然后专门对比一下开关前后的 QoR 报告。你通常会发现 WNS 改善的同时,面积不会像传统过约束重综合那样膨胀。不过CRR也不是万能的,它更多是在关键路径少而集中时表现最好。如果设计存在大面积时序违约,CRR 的效果会被拖慢,此时更适合先回头查 RTL 结构或布线拥塞。
4.2 第三方DFT流程怎么挂进syn_opt -spatial
在带 DFT 的设计上,iSpatial 模板预留了一个非常聪明的接口。DFT 逻辑本身的插入会改变网表结构,增加寄存器数量和扫描链逻辑,从而影响物理布局和拥塞。传统流程里往往先把 DFT 插好再做物理综合,但第三方 DFT 工具插入的扫描链如果和布局完全不考虑物理位置,后端很容易出现局部拥塞爆掉的情况。
iSpatial 模板对 DFT 的处理方式是把扫描链压缩、wrapper 插入等操作放到syn_gen -phys和syn_map -phys之间,而不是在syn_opt -spatial之后。这样扫描链的寄存器从一开始就是带物理位置的,工具在做布局时会把它们放在合理的位置。同时,iSpatial 可以调用 Innovus 的 Scan Reorder 功能,在全流程早期就做扫描链重排,避免到最后才因为拥塞问题重新做扫描链。
如果你用的是第三方 DFT 工具,模板的做法是先让第三方工具做压缩和 wrapper 插入,输出一个压缩后的 RTL 或者网表,然后再读取到 Genus 里继续。注意,这里要保证传入的网表仍然保留可综合的层次结构,最好把 DFT 的测试点和扫描链使能信号配置成固定引脚,避免在综合时被优化掉。否则你等到后面才关诊断,就要付出重新插一遍 DFT 的代价。
4.3 用iSpatial的WNS/TNS预测Innovus POD结果
iSpatial 模板里附带了一张对照表,它的价值不只是展示结果,而是教你怎么看前端综合和后端布局之间的预测误差。我通常的做法是:取 iSpatial 结束时的 WNS 和 Innovus POD 后的 WNS 做差,如果差值在 10% 以内,说明网表质量高,后端不需要大的结构干预;如果差值超过 30%,就需要检查是不是某些模块在 iSpatial 阶段没有被物理优化到。
模板里给出的多组数据显示,iSpatial 综合结束后和 POD 后的 WNS 差距非常小。比如某 7nm GPU 模块,iSpatial WNS 是 -0.05,POD 后 -0.048;某 7nm CPU 模块,iSpatial 是 -0.068,POD 后 -0.026。差值越小,说明 Innovus 拿过来的网表越成熟。你甚至可以把这个差值当作网表质量的 KPI:当某一次设计中 iSpatial 和 POD 差异突然变大,不要继续往后端推,先回来看是不是物理信息没读全,或者约束里有什么例外影响了时序预测。
4.4 模板里的QOR数据边界:什么时候该相信它
iSpatial 的 QOR 提升数据确实好看,但需要正确理解它的边界。我在项目里看到过这样两组数据:某个 12nm AI 模块,从 Spatial 切换到 iSpatial,WNS 从 -293ps 缩到 -42ps,TNS 从 -408ns 缩到 -23ns;另一个 5nm DSP 模块,TNS 从 -296ps 缩到 -165ps。这里的提升并不是单纯因为流程升级,而是因为 iSpatial 让前端可以在综合阶段就把关键路径做一次“预布局级优化”。
. 但你应该注意,iSpatial 的主要收益集中在 WNS/TNS 这类时序指标和全流程 TAT 上。功耗和面积的改善通常是间接的,不会像时序那么明显。如果设计本身存在严重的结构性拥塞,iSpatial 能帮助更早发现,但不代表它能消除所有拥塞。所以不要指望换一个模板解决所有问题,它的最大价值是帮你明确“问题到底在哪”。5. Genus iSpatial模板避坑指南:五个会让你怀疑人生的翻车点
5.1 现象:syn_opt -spatial跑完布局信息没有任何变化
有次我拿模板跑一个老设计的回归,syn_opt -spatial跑完后,发现 QoR 报告里的单元坐标基本都是默认值,或者所有单元都被排在某一小片区域里。看起来像跑了,实际上没跑布局。
原因后来查出来是我在syn_gen -phys阶段没有正确读到 DEF 文件,Genus 实际处于纯逻辑综合模式。DEF 路径在那个设计上改名了,脚本里还是旧路径,read_physical报了个 warning 但没终止流程,后面也就将错就错了。
解决方法是每次跑完syn_gen后,主动检查报告里的物理信息字段,确认设计里是否有cell location或die area信息。同时脚本里在read_physical后加一行check_design -physical,如果报错就直接结束。从那以后我每次开始跑长任务前,都会先确认这一项,不再靠跑完再回来对报告。
5.2 现象:Early Clock Flow打开后,POD结果反而变差
按道理 ECF 应该提升一致性,但有一次打开 ECF 后,Innovus POD 的结果比不带 ECF 还差。查了很久,原因是我的 SDC 里没有定义好门控时钟,ECF 把门控时钟的偏移信息体现在了虚拟时钟树里,但 Innovus 实际做时钟树时,门控单元的处理方式和 ECF 建模的不一致。
解决起来不复杂:在启用 ECF 之前,先把 SDC 里的 generate clock 和门控时钟信号全部显式声明清楚,不要让综合工具自己推断。另外模板里对set_db early_clock_flow true是默认开的,但你如果用的是第三方库,一定要确认库里时钟单元的时间弧信息是完整的,否则 ECF 建模出来的时钟网络和真实偏差可能会很大。
5.3 现象:第三方的DFT压缩逻辑在综合后才插入
另一个高频翻车点是:design 本来计划用第三方 DFT 工具做扫描压缩,团队里有人为了省时间,先把不带 DFT 的 RTL 拿去跑了一遍 iSpatial,想着综合完再插翻转逻辑。结果syn_opt -spatial出来的网表里,关键路径全是靠没有扫描逻辑时的资源堆出来的;后端再插上扫描链和压缩逻辑,路径延迟暴涨,之前的优化等于白做。
原因很简单:iSpatial 的布局优化是跟着网表结构走的,你后面强行塞入 DFT 逻辑,位置和时序都会被破坏。正确做法是在syn_map -phys之前,先把第三方 DFT 的压缩、扫描链、wrapper 插入逻辑并入 RTL 或网表,然后再做物理综合。模板里的 DFT 接入示例明确把这个顺序写清楚了,跟着走就不会犯这个错。
5.4 现象:跑完iSpatial直接把网表丢给后端
iSpatial 跑完以后,很多工程师习惯性只把.v网表拷贝给后端,然后 Innovus 那边从零开始布局。结果后端跑完 POD,时序和 iSpatial 差距巨大,于是前端又开始新一轮综合迭代。
这是对 iSpatial 流程理解不够深导致的。iSpatial 的成果不只是网表,还包括带物理信息的 DEF、带时钟树估计的 SDC。Innovus 拿到这些输入,才能在 iSpatial 的结果上做增量优化。模板的三个输出文件.v、.def、.sdc是一个整体,少了 DEF 和 SDC 就等于把 iSpatial 退化成普通综合。正确做法是在 Innovus 脚本里通过set_db init_def_file和set_db init_sdc_file读入 iSpatial 的 DEF 和 SDC,这样才能延续这个流程的价值。
5.5 现象:WNS/TNS报告看着很好,布局后原形毕露
还有一种情况比较隐蔽:iSpatial 报告里 WNS/TNS 都收敛了,但交到 Innovus 后,某个高频模块的拥塞非常严重,导致绕线延迟暴涨。问题出在syn_opt_spatial.tcl里congestion_enable被设成了 false。模板默认是 true,但有人为了压 TAT 手动关了它。iSpatial 如果连全局布线估算都没做,它当然看不到拥塞,也就不会在拥塞区域做单元分散,更不会去重排高扇出网络。
解决方法是:检查 iSpatial QoR 报告里的 congestion 字段,如果报告里没有拥塞相关数据,说明这个开关没开。打开congestion_enable true后重新跑一遍,你会发现 WNS 会先变差一点,但这才是后端真实的样子,好过在后端阶段再花几倍时间处理拥塞。
6. 把iSpatial模板用到日常留:用QOR报告反向校准RTL的实操技巧
当 iSpatial 在你手里不是“交作业”的工具,而是一面能提前看到后端结果的镜子,它的价值才会完全释放。我现在的日常工作习惯是:每次综合完 iSpatial,不只看 WNS 收没收敛,还会把所有路径的 TNS 按模块归并,生成一张模块级别的时序分布表。哪个模块贡献了最多负余量,就把哪个模块的 RTL 打开,看是不是某一段组合逻辑写得太冗长,或者是跨模块的连线布局太绕。
一个有实际效果的技巧是:对比 CRR 开启前后,iSpatial 生成的网表结构。CRR 重构过的地方,通常在 QoR 报告里会留下“region restructured”标记。我会把这些标记点和 RTL 里的敏感路径对应起来,如果发现某条路径被 CRR 反复重构好多次仍然违规,那基本可以确定不是综合参数的问题,而是 RTL 结构本身写死了。这时候去改 RTL 比调工具参数更有效。
另一个更细的验证方法是把 iSpatial 结果和 Innovus POD 结果的 WNS 偏差放在同一个图表里,按模块维度对比。偏差小的模块说明网表质量稳定,偏差大的模块优先排查物理信息不完整、SDC 约束不合理等问题。模板里已经提供了一套从 iSpatial 和 Innovus 报告里提取 WNS 和 TNS 的小脚本,直接喂进你的项目目录就能用,比手动敲命令省力得多。
最后说一个我踩过的坑:有一版 12nm 项目,我连续三次调综合都以为时序已经救不回来了,直到把 iSpatial 报告里的关键路径和 Innovus POD 对比之后,才发现问题出在一个第三方 IP 的约束上,和 RTL 没关系。从那以后,我每次跑完 iSpatial 都会强制自己先看一眼关键路径的模块归属,再决定要不要动脚本或 RTL。希望这个习惯也能帮到你;带着这份模板去复现一次,你就能慢慢摸到它的脾气。
本文还有配套的精品资源,点击获取