案例复盘:一次电源域上下电 bug 从硅后死机到根因定位
更新时间:2026-09-14。本文是低功耗专家层案例文。涉及的技术单元分别见 电源门控/隔离/保持、UPF 实战、门级仿真 X 传播。案例为教学化虚构,但故障模式、定位路径和修复手段均来自真实工程经验。
一、系统背景
一颗移动视觉 SoC,ISP 是可关断电源域 PD_ISP,常开区 PD_AON 里有电源状态机 PSM、总线桥和唤醒中断。设计意图:
待机:ISP 断电,输出经 isolation clamp 到总线桥(valid 钳成无效)
唤醒:开开关 → power good → restore retention → 撤隔离 → 重新握手ISP 每次处理完一帧图像后断电,下次拍照再唤醒。省电目标达标,但在硅后 bring-up 阶段出现问题。
二、现象:偶发、只在冷机、复位能恢复
- 连续拍照多数正常;
- 长时间待机后第一次唤醒,约 5%~10% 概率总线桥卡死、整机看门狗复位;
- 立刻第二次拍照几乎不复现;
- 复位后恢复,无永久损坏;
- 温度越低、电压越低,复现率越高。
「偶发、低温低压更明显、复位可恢复」这组特征,强烈指向时序边界 / 供电过渡问题,而不是固定逻辑错误。纯 RTL 仿真因为寄存器默认确定值、且没有真实供电,无法复现。
三、分层复现:从硅后逐级往回夹逼
不要一上来在硅后猜。按可控性和成本分层:
| 层级 | 手段 | 结果 |
|---|---|---|
| 硅后 | 读 PSM 状态、桥状态、电源/隔离寄存器 | 死时桥在等一个永不到来的 valid 撤销 |
| Emulator | 跑完整固件 + 上下电序列,注入电压/温度 | 能复现,但信号太多,定位慢 |
| power-aware RTL 仿真 | 用 UPF 模拟 PD_ISP 掉电 | 偶发观察到接口出现 X |
| 门级 + X-prop | 网表、悲观 X 传播、带复位序列 | 稳定复现,第一个 X 可回溯 |
关键决策:直接构造「待机足够久 + 冷启动 + 第一次唤醒」这个最短序列,而不是跑整个相机应用。把复现窗口从分钟级压到毫秒级,是定位的前提。
四、根因:两个问题叠加
根因 1:撤隔离早于 restore 完成
PSM 代码里唤醒序列是:
power_good → 立刻 deassert isolation → restore retention → 放行请求而正确顺序应是:
power_good → restore retention 完成 → 再撤 isolation → 放行请求隔离一撤、retention 还没恢复,ISP 接口寄存器是随机/X 态,valid 短暂出现非法值,总线桥据此进入等待。多数时候 restore 很快补上、X 恰好被后续覆盖,所以表现为偶发;低温低压下电源稳定和恢复更慢,窗口变大,复现率升高。
根因 2:isolation clamp 极性接反
UPF 里 ISP 到桥的 ready/valid 类信号 set_isolation ... -clamp_value 0(无效),但有一根握手信号低有效,clamp 0 反而表示「有效」。断电期间桥误以为 ISP 发起了请求并开始等响应,ISP 断电永远不会响应,桥死等。
两个问题叠加:断电期间 clamp 极性造成假请求,唤醒时 restore 晚于撤隔离又灌 X,于是不同启动条件下表现成不同的卡死现象。
五、第一个 X 的回溯方法
在 X-prop 仿真里不要看最终满屏 X,而要沿数据通路倒查:
- 定位桥状态机第一次进入异常等待的时刻 T;
- T 之前找接口上第一个 X 或第一个非法 valid;
- 确认它来自
PD_ISP边界而非桥自身; - 对照该时刻 supply 状态:开关是否 ON、power_good 是否有效、iso_en/ret_ns 处于什么值;
- 发现撤隔离时刻早于 restore 完成、且断电期某信号 clamp 成了有效电平。
「supply 状态 + 控制信号 + 第一个非法值」三者对齐,就把锅从模糊的「低功耗时序问题」钉死到具体的 PSM 顺序和 UPF 策略。
六、修复
RTL/PSM 侧:重排唤醒序列,加显式完成握手:
关电:idle_ack → 停新请求 → save → assert iso → 断开关
唤醒:合开关(ramp) → power_good → restore → wait restore_done
→ deassert iso → 等接口 idle → 放行请求- 每一步有超时回退,失败回到安全态重走;
- power switch 仍分段导通,控制 inrush,见 IR-Drop 与 EM 签核。
UPF 侧:
- 逐信号明确 clamp 值:高有效 valid/req 钳 0,低有效 valid/req 钳 1,不能一刀切;
- 把跨域信号按协议列出表,和设计/验证双签 clamp 极性;
- retention 集合收敛到真正需要的状态寄存器。
验证侧:
- power-aware 仿真新增定向序列:冷启动第一次唤醒、上电中途请求、超时重走、连续多次上下电;
- SVA:断电期间所有「有效」语义信号必须处于无效态;restore_done 之前不得撤隔离;
- 功能覆盖:每个 OPP/电源状态、所有上下电迁移边、迁移中请求都打点。
七、为什么前面没拦住
- RTL 仿真通过是假象:没有 supply/off 概念,寄存器默认确定值,看不到掉电 X;
- 只看平均功耗没看接口协议:省电达标不代表边界行为正确;
- UPF review 没逐信号核对极性:clamp 0 被想当然当成「安全」;
- 复现路径太长:早期在整机场景里偶发,没人愿意反复跑,直到压成最短序列才定位。
八、可复用的 bring-up checklist
- [ ] 跨域每根控制信号标注有效电平与断电 clamp 值并评审;
- [ ] 唤醒严格 power_good → restore_done → deassert iso;
- [ ] 关电严格 save → assert iso → 断开关;
- [ ] 每步有超时与安全回退,开关分段导通;
- [ ] power-aware 仿真能复现冷启动首唤醒和上下电中请求;
- [ ] 门级 X-prop 验证完整复位/上电后无 X 残留;
- [ ] 断言保证断电期无有效请求、恢复前不撤隔离;
- [ ] 覆盖所有电源状态迁移边、OPP 和异常;
- [ ] 硅后 bring-up 预先规划最短复现序列和 PSM 可视寄存器。
总结
这个案例的根因是「撤隔离早于 retention restore」与「一根低有效握手信号 clamp 极性接反」两个问题叠加,断电域在不该有效时给出假请求、在恢复未完成时灌出 X,因恢复窗口随低温低压变大而表现为冷机首唤醒偶发死机;定位靠把整机长序列压成最短唤醒序列,用 power-aware 仿真看到边界 X、再用门级 X-prop 稳定复现并回溯第一个 X 与 supply/iso/restore 控制的对齐关系,修复则是重排「power_good→restore_done→撤隔离」的电源状态机、逐信号定义 clamp 极性,并用断言、功能覆盖和上下电迁移回归永久兜底——低功耗 bug 大多不在算法,而在供电过渡期间的边界协议和顺序。