资讯详情

资讯详情

VCD驱动动态IR Drop分析:从Vectorless初筛到签核的完整流程

做物理实现的工程师十个里有八个都跑过 vectorless IR drop 分析剩下两个正在准备跑。它确实省事不需要向量、不挑 workload把 toggle rate 一设丢进 RedHawk一个晚上就能把全芯片的动态电压降dynamic IR drop给出一份像模像样的报告。但如果你把这份报告当成签核signoff的唯一依据那基本等于拿一张“全楼平均作息表”去预测下午三点整到底哪几台空调会同时开机——方向对细节全错。我在这几年的项目里反复验证过一个结论vectorless 适合做初筛、做兜底但真要看某个具体 workload 跑起来之后电源网络上会不会出现瞬间电压跌落必须把 VCD 喂给 RedHawk、跑一轮 vector-based 的 dynamic IR。只有这轮分析出来的数字才有资格贴到 signoff 报告上跟别人开会。下面就把这套流程里该准备的输入、该注意的坑、以及结果怎么落地完整盘一遍。1. vectorless 的舒适区恰好是 dynamic IR 最看不清的区域1.1 先搞清楚 vectorless 到底在算什么vectorless 这个名字听起来很玄算法思路其实朴素对每个标准单元给定一个翻转率常见默认是 10% 到 20%假设整个芯片的开关活动在时间和空间上均匀铺设然后按这个假设把每个 instance 的平均功耗撒到电源网络上求解节点电压。它不关心哪个模块几点在跑、哪种总线突发会撞在一起只问一句“如果大家都按某个比例随便翻电网扛不扛得住”。这套做法在早期非常有用。芯片只有 floorplan 的时候就能开跑用来评估电源网格power mesh的 strap 宽度、bump 数量、封装方案都够用跑一轮全芯片 vectorless 通常只要一个晚上成本低到可以反复迭代。问题在于它把芯片当成一杯匀速倒入水池的水而真实芯片更像一锅烧开的水——气泡在某个角落突然成片炸开那个瞬间的电流密度和电压跌落用平均水流是算不出来的。1.2 均匀假设留下的两个盲区第一个盲区是时间相位。动态 IR drop 的本质是瞬态事件某个时钟沿到来时几千个触发器同时翻转电流在几纳秒内被拉走电源网络上的电压在这个瞬间被压下去随后靠电容和电源通路慢慢回弹。vectorless 把这种尖锐的瞬态抹平成一条平均曲线抹完之后的峰值电流自然就失真了。第二个盲区是空间相关性。芯片上真正危险的事不只是“电流大”而是“物理位置很近的一大堆单元在同一时刻同时要电流”。这两个条件缺一个局部电压都不至于被打穿。vectorless 不知道哪个模块和哪个模块会“同频共振”所以它对空间聚集效应的刻画是坏的。这也就解释了为什么很多团队的经验是vectorless 报出来的热点位置和真实 workload 下的热点经常对不上。1.3 它会悲观但绝不等于“永远不会漏”有人觉得 vectorless 既然悲观那它总归是安全侧的吧不对。它的悲观是数学上构造出来的悲观所有单元按相同活动率、同一相位翻转。真实电路因为流水线、时钟门控、模块互斥工作几乎不可能达到这个上限于是你会在达标 budget 的压力下为这个“不可能的最坏”白白加一堆去耦电容decap面积和漏电全被浪费。反过来vectorless 也会漏。假如某个视频解码引擎在特定码流下内部一片寄存器在连续三个时钟沿上高度相关地翻转这种相关性是均匀假设完全看不到的。我遇到过类似的情况vectorless 报告某个存储区完全没标红但换了特定突发向量之后那片区域的电压在几纳秒内掉了 50mV 以上。这说明 vectorless 不是一条“永远保守、只是偏紧”的曲线它对于动态 IR 的相位特性可以说没有建模能力。1.4 两个数字的直观对比拿一个 0.8V 内核电压的模块说同样的电源网格、同样的库vectorless 给某个区域的报告是 60mV 的 dynamic drop换成一段针对性激励的 VCD 驱动分析这个数字落到 36mV 左右。如果只看 vectorless你会觉得这里要加不少 decap看过 VCD 之后才知道真正要紧的是另一个模块在特定突发下的 50mV 瞬时跌落。两种模式给出的结论不仅数值不同连要动手的位置都不一样。所以我的建议是不要让 vectorless 承担“预测真实 transient”的任务它的工作边界是快速筛选和悲观兜底。要回答“这个 workload 到底会不会把电压打下来”必须进入 VCD 驱动的分析流程。2. 为什么 VCD 驱动的 dynamic IR 能把猜测变成证据2.1 VCD 本质上是一份带上时间戳的翻转流水账VCDValue Change Dump是仿真器输出的标准格式它不保存波形只保存一件事某个信号在哪个时刻从什么值变成了什么值。文件开头是$timescale和信号声明后面是一串按时间排序的变化事件。一个简化例子大概长这样$timescale 1ns / 1ps $var wire 1 ! clk $end $var wire 8 data[7:0] $end #0 0! #100 1! #200 0!这里#100表示时间推进到 100ns1 意味着 clk 由 0 变 1。VCD 不存储没有变化的时间段所以体积虽然大但已经是相对紧凑的事件流。RedHawk 拿到这份事件流就可以知道“谁在什么时候发生了翻转”。2.2 从翻转事件到 instance 电流给到 RedHawk 的 VCD 只是第一步。工具要做的核心工作是把每个 instance 输入端的每个翻转事件换算成该 instance 在电源网络上抽取的瞬态电流。这个换算是靠工艺库的功耗模型完成的库里有 internal power、每个 pin 的输入电容、每条路径的开关能量RedHawk 把这些参数乘上 VCD 里对应的翻转次数和翻转时间再加上输出负载这个负载信息来自 SPEF 的寄生电容就能给每个 instance 构建出一条“电流随时间变化”的波形。这一步是整个流程的灵魂从“平均功耗”升级到“瞬时电流”后续所有的 droop 计算都建立在这条波形上。这也是为什么我前面强调要用 gate-level 仿真而不是 RTL 仿真的 VCD。RTL 里没有单元延迟没有 slew没有 glitch没有时钟偏斜翻转事件在时间轴上过于整齐RedHawk 算出来的瞬态电流会被严重低估。带着 SDF 反标的 gate-level 仿真才包含毛刺、竞争和真实的边沿时间电流波形才可信。2.3 把电流放上电源网络做瞬态求解有了电流波形下一步是求解电源网络的响应。RedHawk 会把整个 PG 网络抽取成电阻、电容、电感组成的等效电路金属走线是电阻去耦电容和金属电容是电容封装、bump、焊线是电感。于是每个节点都满足一个类似C * dv/dt v/R I(t)的方程瞬态电流 I(t) 由 VCD 驱动网络自身的 R/C/L 决定电压怎么被拉低、又怎么回弹。这样解出来的结果就不只是一个静态压降数字而是一条完整的电压波形可以看到某个时钟沿过来时电压被瞬间压下去 40mV、持续 3ns 后开始回弹、随后出现轻微振铃。封装电感的存在还会引入 L·di/dt 效应电流变化越陡电感上的压降越大——这是 vectorless 那种静态求解完全给不出来的信息。2.4 vectorless 和 VCD 驱动两种模式的定位差异对比维度vectorless 模式VCD/FSDB 驱动模式输入活动默认或指定的均匀翻转率仿真波形里真实的翻转事件时间相位无平均化每个翻转事件都带时间戳空间相关性假设全域均匀忠实还原物理相邻模块的同频翻转悲观程度结构性偏高且方向不可控取决于向量覆盖度可能偏乐观典型输出全芯片热点图、单值 drop热点图 节点电压波形运行成本低适合反复迭代需要仿真、波形文件、更长的运行时间适用阶段早期评估、快速回归签核前的精细检查和问题定位这张表是我开会时经常贴在文档第一页的。核心意思就一条两种模式不是互相替代而是分工。vectorless 负责“别漏掉大问题”VCD 驱动负责“把真实场景算准”。只有把两者合起来看dynamic IR 的结论才立得住。3. 别急着开跑VCD 的准备比分析本身更耗时间3.1 仿真类型决定了 VCD 的可信度很多团队第一次做 vector-based dynamic IR最常犯的错是直接拿 RTL 仿真 dump 的 VCD 去跑理由很简单RTL 仿真快、环境现成。但 RTL 仿真里没有单元延迟没有线延迟脉冲立即出现立即消失最要命的是 glitch——组合逻辑上那些由竞争引起的毛刺在 RTL 仿真里完全不存在。而真实电路里大量瞬时电流恰恰来自这些毛刺和边沿错位。所以我的建议很直接用于 dynamic IR 的 VCD必须来自 gate-level 仿真并且要带 SDF 反标。至少要保证时钟网络和关键扇出路径是 gate-level 的。如果项目仿真资源有限至少也要把 RTL 的 VCD 当作“下限检查”——它给的结果偏乐观如果这个乐观结果都已经超标那 gate-level 的结果只会更差。3.2 控制 VCD 的体积窗口、层次和格式转换VCD 是以文本形式逐条记录变化的一个中等规模 SoC 全芯片跑 1ms 仿真dump 出几十 GB 的 VCD 一点都不稀奇。常见做法不是事后压缩而是在仿真阶段就把输出管好只 dump 与分析相关的层次排除掉大量无关子模块。用$dumpoff/$dumpon在仿真脚本里控制导出区间只导关键窗口。如果工具链支持把 VCD 转成压缩二进制格式比如 FSDB体积通常能缩小一个数量级RedHawk 读取速度也更快。时间窗在仿真阶段就切好不要拿着 50GB 的原始 VCD 在分析工具里去裁那是自己给自己上强度。还有一个实用技巧先跑一遍带活动统计的长仿真找到翻转最集中的时间点再围绕这个时间点做二次仿真、只 dump 关键窗。这样能保证想要的瞬态事件完整落在波形里文件又不会大到没法处理。3.3 场景选择比文件格式更重要VCD 驱动的分析结果本质上是“这把向量下会发生什么”的忠实回答。向量没选对数字再漂亮都是自欺欺人。需要覆盖的场景基本是固定的几类电源模式切换从低功耗状态唤醒的瞬间、总线突发、时钟门控批量打开、以及存储器的连续读突发。这些场景的共同点是短时间内大量单元同时发生翻转电源网络的瞬态压力最大。窗口长度也不需要贪长。动态 IR 关心的是几十到几百纳秒内的峰值事件我一般取关键瞬态前后共 100–200ns 的区段做分析。如果整个 workload 太长可以先在整个仿真里找出几个候选热点窗口分别导出 VCD、分别分析最后用报告把各窗口的最差情况合起来看。3.4 名称映射最容易吃哑巴亏的环节VCD 里的信号名要和设计层次结构对得上RedHawk 才能把翻转率映射回 instance。问题往往出在这些地方总线信号在 VCD 里被拆成单 bit 且改名、层次名被展平flatten、特殊字符被转义、大小写被改变。如果映射失败那部分区域的 activity 就是 0dynamic IR 结果会轻得离谱而你很难一眼看出来。所以每次跑之前必须检查 unmapped 报告盯两个指标总映射率是否在 95% 以上没有被映射上的是否集中在 SRAM、模拟 IP 这些本来就走宏模型的地方。如果一个大模块的 activity 整个消失先别急着分析回去修名字映射否则后面所有结论都是空中楼阁。4. 在 RedHawk 里把 VCD 喂进去配置路径和三个典型的坑4.1 先把输入清单备齐VCD 驱动的 dynamic IR 分析需要的输入比 vectorless 多得多。根据我的经验缺一个文件结果就是镜花水月输入类型用途注意事项设计数据库LEF/DEF 或同类版图格式提供物理版图、单元位置、PG 走线确保 PG 网络名称与库一致时序库.lib/.db提供单元功耗模型、电容、翻转能量使用与签核一致的 PVT 角约束SDC提供时钟定义、频率、路径约束用来补齐时钟网络的活动寄生参数SPEF提供线电容、线电阻影响电流与压降用带 RC 的版本不要用零负载近似VCD/FSDB提供真实翻转事件gate-level 带 SDF 反标窗口覆盖关键场景封装模型提供 R/L/C决定 L·di/dt 效应至少要有 bump 和 package 的电感很多人只记得喂 VCD忘了时序库和 SPEF。没有 SPEF输出负载算不准电流就差没有时序库翻转能量算不出来电流就是零。这几个文件是配套的。4.2 配置路径的六个要素在 RedHawk 里跑 vector-based 分析菜单在不同版本里位置不完全一样但要做的事是固定的。我这里只说六要素不绑死某个菜单名创建工程并读入设计数据库确认电源网络层次完整VDD/VSS 命名统一。模式切到 vector-based不要继续用默认的 vectorless 假设。挂载 VCD/FSDB 文件指定顶层模块名、起始时间、结束时间。设置分析用的 PVT 角、电流模型来源库的 internal power 输出负载。读入封装模型把 bump 和 package 的电阻电感挂上。运行 transient dynamic 分析保存感兴趣的 probe 点和报告。每一步都值得单独确认。比如顶层模块名写错结果往往是映射率只有 30%跑完都不知道坏在哪。再比如 PVT 角选错了动态 IR 结论可能整体偏乐观。4.3 三个我踩过、也看同事踩过的坑第一个坑是时间刻度错位。VCD 文件头里$timescale是 1ns/1ps但分析工具按默认 tick 或另一个文件的相对时间去解释所有翻转事件在时间轴上发生偏移。表现是电压波形整体看起来平滑但峰值深度明显偏小因为瞬态能量被摊开了。排查方法是取一个已知的时钟沿确认它在 RedHawk 里出现的时间与 VCD 里的绝对时间一致。提示时间刻度这类问题不会报错只会让结果“悄悄变乐观”。每次换新仿真环境或新 VCD 来源都要先花五分钟对齐一个时钟沿再做正式分析。第二个坑是时钟活动缺失。VCD 里如果只有顶层端口上的时钟翻转RedHawk 不会自动把它沿着时钟树传播到每个寄存器。结果就是一大堆触发器的 input pin 根本没有翻转事件寄存器簇的电流被低估好几倍。解决办法是让 gate-level 仿真把时钟网络完整 dump 出来或者通过 SDC 里的时钟定义让工具补齐时钟树的 toggle再用一个寄存器簇的 activity 分布报告做交叉验证。第三个坑是存储器宏模型缺失。SRAM、模拟 IP 这类 macro 的 supply 电流通常不会完整体现在 VCD 里。如果直接跑macro 内部就像一块“死区”它导致的局部压降完全看不见。需要单独给 macro 提供电流宏模型或利用库里的 memory power model把读写行为映射成 supply 端口的电流波形。这个坑最隐蔽——因为报告里不会报错只会让 macro 附近异常“安静”。每次跑完都要反问一句最该热的地方热了吗4.4 结果怎么看别只盯着一个最大数RedHawk 跑完 vector-based 分析会同时给出几种输出指定 probe 点的电压随时间曲线、全芯片某个时刻或某个窗口的热点图、每个 instance 的峰值电流排序。我建议按这个顺序看先看 probe 波形找到最小电压出现的时间点再看那个时间点前后几纳秒的热点图确认跌落的位置和范围最后拉 instance 峰值电流排行看是谁在那一刻拉了那么多电流。这样从现象到根因就串起来了。另外要留意“窗口平均”和“瞬时最小”的区别。短窗口的瞬时最小值非常苛刻持续几百皮秒的毛刺式跌落可能不会影响功能而持续几个纳秒的深度跌落才是真正的风险。RedHawk 的窗口平均模式可以把这两种情况分开展示看的时候要结合时钟周期和触发器的保持时间来判断哪个指标该作为决策依据。5. 用 VCD 结果做版图决策decap、网格调整和签核姿势5.1 按峰值电流密度摆 decap而不是全芯片铺vectorless 报出来的热点通常很广很多团队会顺势选择“整个模块铺满 decap”省事。VCD 驱动的分析最大的价值之一就是告诉你热点可以收缩到更具体的坐标和更具体的时间。我一般这样做拿 instance 峰值电流排行把排名靠前的几百个实例在版图上标出来如果它们聚集在某片区域且那片区域在 VCD 窗口内的电压最低decap 就优先摆在那片区域贴近供电 via 的位置。加完之后再跑同一段 VCD对比峰值跌落有没有下降、回弹时间有没有变短。一般两三轮就能收敛。decap 的有效半径非常有限超出一定距离瞬态时间内电荷根本来不及赶到等于白加。这也是为什么我不建议靠 vectorless 的广谱热点直接铺 decap地方铺错了面积和漏电全花在刀刃以外。5.2 电源网格的针对性调整VCD 分析也能暴露网格问题。如果同一个热点在多次不同向量下反复出现说明不是向量偶然而是网格本身在那个区域的供电能力不足。这时再动 strap 宽度、via 数量、甚至 bump 位置才有依据。我通常把 VCD 分析当作一个“物理定位工具”它告诉我们问题在哪个坐标、哪个时间、由哪一类单元引起。有了这三个信息改网格就和改时序一样有方向感。不然你只能在整片芯片上把所有 strap 都加宽一档成本不可控。5.3 和片内电压传感器的实测值对一对我手里有一个印象很深的对照某个内部项目样片回来后片内电压监测模块在指定码流场景下测到约 43mV 的瞬态跌落RedHawk 用同一段 workload 的 VCD 预测是 47mV而当初 vectorless 的估计是 65mV。VCD 驱动的结果和实测在趋势上高度一致vectorless 则明显偏保守。但我不建议因此把 vectorless 丢掉。实测对上的前提是那段 VCD 如实覆盖了样本上的 workload如果激励本身偏弱VCD 结果照样会骗人。正确姿势是三条腿走路vectorless 负责初筛、VCD 驱动负责精修、片内传感器负责回标校准。每流片一次就把实测数据用来修正分析设置和激励质量后面几个项目会越做越准。5.4 建议的签核流程姿势到签核阶段我现在的推荐组合是静态 IR 和 EM 用 vectorless 报保守上界同时作为兜底dynamic IR 用 VCD 驱动的结果作为主要依据在报告里附上覆盖的场景、映射率和置信度说明。两种结果一起给比单给任何一种都更能经得起追问。另外dynamic IR 的预算不能只看降幅百分比。还要看跌落持续的时间和触发器的 timing margin 窗口同一个 10% 的跌落发生在时钟沿前 0.1ns 和发生在数据稳定期中段危害完全不同。把电压波形和时序窗口叠在一起看才是合格的 signoff 姿势这也是 VCD 驱动的分析能让你做到、而 vectorless 做不到的地方。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →