用 VCD 做动态 IR drop:仿真窗口是怎么定下来的
后仿 VCD 动辄几百上千个周期,全跑不现实(代价是节点数乘时间步,近似线性增长),通行做法是在 VCD 里挑一到两个关键周期做瞬态分析。挑得准不准,直接决定结论能不能用。下面记录我们如何把一个 17 µs 的 VCD 收敛到 15.54 ns 的窗口,以及几处只看结果看不出来的地方。

动态压降和静态压降不是一回事。静态看的是平均电流在电源网电阻上的压差,动态看的是每一条时钟沿把电荷抽走、去耦电容再回填的过程,压降在纳秒尺度上起伏。所以做动态分析之前,第一个要回答的问题是:仿真哪一段时间。

后仿 VCD 动辄几百上千个周期,全跑不现实(代价是节点数乘时间步,近似线性增长),通行做法是在 VCD 里挑一到两个关键周期做瞬态分析。挑得准不准,直接决定结论能不能用。下面记录我们如何把一个 17 µs 的 VCD 收敛到 15.54 ns 的窗口,以及几处只看结果看不出来的地方。

长度由最快的时钟周期决定

第一步不是找峰值,而是量时钟。我们用一个流式扫描脚本统计每个信号在一段时间内的翻转次数和相邻翻转的平均间隔,哪一类网络是时钟很快就看出来了:一批 CTS 网络在 17 µs 内翻转 4377 次,平均间隔 7.766 到 7.768 ns,对应 128.73 MHz。

这里有个细节值得单独说:判断周期要用平均间隔,不要用最小间隔。真实网表里时钟会抖,最小间隔只有 77 到 80 ps,那是毛刺和偏斜造成的,拿它当周期会算出完全错误的频率。平均间隔在时钟持续翻转时是可信的;如果时钟被大面积门控,平均间隔会偏大,这时要看翻转次数是否符合“每周期两次”。

量出周期之后,窗口长度取一到两个周期。一个周期覆盖单条沿上的瞬时压降,两个周期还能看到压降在下一个沿之前有没有恢复。我们取两个周期,也就是 15540 ps,并把端点对齐到时间步网格上(时间步 20 ps,正好 777 步)。

峰值往往不在第一眼看到的那个位置

把 6.08 ns 的窗口在整段 VCD 上滑一遍,最活跃的窗口排第一,活动量却恰好等于 FRONT_PATH 下的信号总数(130707)。这不是真实翻转,而是 VCD 开头那一段初值 dump:仿真器给每个信号写一次初始值,全部落在第一个时间戳上。它永远排第一,必须排除。

排除之后重扫,真正的尖峰出现在 131.300420 µs 附近:200 ps 内同时有 5089 个信号跳变,这就是时钟沿上大量触发器一起翻转的瞬间,也是动态压降最容易出现的地方。窗口起点取在尖峰前约 1 ns,给电路留一个安静的前导。

这类工作不需要多复杂的工具。一个 awk 单行就能找出“哪一时刻翻转的信号最多”,用来识别初值块和粗定位足够了;要同时看周期、门控和峰值分布,才需要一个流式扫描脚本,几十 GB 的 VCD 也能跑完。

时间基准是相对的,不是绝对的

窗口定好之后,我把它按绝对时间填进 GSR,结果直接报错:

ERROR(ANL-013): Simulation time 1.31315e+08(ps) is too large.

这个值明明落在 VCD 的时间跨度内,为什么说太大?因为这份 VCD 是从更长的仿真里截出来的,起始时间不是零(第一个时间戳是 129960000 ps),而 RedHawk 在解析时把这个起点当成了零。于是所有时间都要减去起点:131299420 到 131314960 ps 变成 1.33942e-6 到 1.35496e-6 秒,改完立刻跑通。

判断依据其实就在报错里:如果工具报出的“过大”值恰好等于你填的绝对值,说明两者的时间基准不一致,而不是数值真的越界。

频率和活动度要交叉核对

GSR 里的 FREQ 是“时钟推不出来的单元的兜底频率”,单位是赫兹,必须带 e6。写成 241.55 会被当成 241.55 Hz,那部分单元的功耗会接近零。另外,截取后的 VCD 里实际时钟是 128.73 MHz,与签核频率 241 MHz 相差近一倍:要么是高频域在这段场景里没有被激励,要么是后仿降频跑过,两种情况的结论方向完全不同。必要时用 STA_VCD_FREQ_RATIO 折算,否则压降会被系统性低估。

跑之前还值得做一件事:把工具给出的活动度统计,和直接从 VCD 算出来的平均值对一下。我们那次报告的总活动度是 6.61%(组合 4.36%、时序 7.31%、时钟 48.07%),而按 VCD 全量算是 2921 万次翻转、13 万个信号、2188 个时钟周期,折算下来每个信号每周期平均翻转 0.1 次,也就是理论上限(每周期两次)的 5.1%,量级吻合,说明 VCD 确实被读进去了。

反过来,时钟那一栏 48% 才是值得盯的:时钟每个周期必然翻转两次,正常应该接近 100%。而 128.73 除以 241 约等于 53%,与 48% 同量级,这提示活动度的分母用的是签核频率而不是 VCD 的实际时钟。一个数字偏低,原因可能根本不在设计上,而在频率口径上。

也可以交给工具自己选

上面的窗口是自己算的,好处是完全可控、可复现。RedHawk 本身也提供了等价能力:在 VCD_FILE 里打开 SELECT_RANGE(-1 -1 表示在整个 VCD 范围内选),再用 SELECT_TYPE 指定判据,WORST_POWER_CYCLE 找功耗最大的周期,WORST_DPDT_CYCLE 找 di/dt 最大的周期,POWER_CYCLE_SELECT_MODE 控制选中的精度。工具会把选中的周期连同它前面若干周期一起做预仿真。

用这条路时要注意两个关键字的配合:DYNAMIC_SIMULATION_TIME 此时表示窗口的宽度(写单值即可),起始点由工具选中的周期决定。如果写成区间(两个值),等于手工指定了起点,cycle selection 就失去意义了。改完之后,把工具选中的时刻和自己算出来的峰值时刻对一下,吻合就可以放心用。

开工前该准备好的东西

动手之前逐项确认:VCD 是不是从零开始,第一个时间戳是多少;时钟周期量过没有,用的是不是平均间隔;初值 dump 的位置确认过没有,找峰值时是否排除;窗口端点是否对齐到时间步;GSR 里的时间是与 VCD 起点之差还是绝对值;FREQ 的单位是赫兹,且与签核频率对得上;最后看一眼活动度统计和时钟活动度,确认 VCD 真的被读进去了,而不是走了 vectorless 的兜底路径。

感谢阅读,更多文章点击这里:【专栏:iLoveIC】
留言(0)
还没有留言,来说两句吧。
留言需要 登录 或 注册(注册后需通过邮箱验证)。
相关文章