低功耗验证:UPF 仿真、电源状态(PSO)、隔离毛刺与电源序列检查
更新时间:2026-10-01。低功耗设计是「RTL 之外多挂了一份意图」:UPF(Unified Power Format,统一电源格式)描述的电源域、隔离、保持关系在 RTL 代码里完全不可见。于是低功耗验证最尴尬的场面是——功能仿真全绿,因为仿真器默认所有逻辑永远供电;芯片回来第一次进休眠就挂死,因为没人验过断电那一刻信号上发生了什么。这一篇按标准篇深度,把低功耗 UPF 验证从电源意图建模、电源状态与序列覆盖、X 传播、RTL 毛刺,到静态规则检查和门级复验完整走一遍。电源意图本身的写法可先回看 低功耗设计与 UPF,验证环境搭建的工程细节见 Power-aware UVM。
本文要回答的问题
- 低功耗 UPF 验证到底比普通功能验证多验了哪些东西,只加 UPF 文件跑一遍仿真为什么不够?
- 一个可开关电源域从上电到掉电,isolation(隔离)、retention(保持)、电源开关的动作先后顺序错了会怎样?
- 断电域的输出在仿真里是 X,这些 X 怎样被隔离单元挡住,又怎样沿未隔离的路径污染活域?
- RTL 毛刺(glitch)从哪来:组合逻辑竞争冒险和时钟/数据门控使能,为什么在电源切换窗口里格外危险?
- CLP(低功耗静态规则检查)能提前抓住哪些结构错误,哪些问题只能靠动态仿真?
- RTL 电源感知仿真和门级低功耗复验的结论为什么可能不一致?
一、验证对象:UPF 电源意图与四类特殊单元
普通功能验证的对象是 RTL 描述的逻辑行为;低功耗验证的对象是 RTL + UPF 合起来的行为。UPF 里描述了电源域(power domain)划分、供电网络(supply net)、电源状态表(PST, Power State Table),以及挂在网表上的四类特殊单元:隔离单元(isolation cell)在域掉电时把输出钳到固定值;保持寄存器(retention flip-flop)用 always-on 供电把状态存住;电平转换单元(level shifter)跨不同电压域翻译电平;电源开关(power switch)由 always-on 域的控制器按序列开合。
top: "PD_TOP(always-on)\n电源控制器 / 配置寄存器\n常供电 VDD_TOP"
core: "PD_CORE(可开关)\n运算逻辑 + retention FF\n供电 VDD_CORE(开关)"
iso: "isolation\n掉电时钳位 0/1"
ls: "level shifter\n0.75V <-> 0.9V"
ret: "retention\nSAVE/RESTORE 控制"
sw: "power switch\n由开关链按拍开合"
top -> iso: iso_en
top -> ret: save/restore
top -> sw: pwr_on
core -> iso
iso -> ls
sw -> core这张结构图是全篇的锚点,读它要抓住三条控制线全部来自 always-on 域这个事实:iso_en、save/restore、pwr_on 在 PD_CORE 掉电期间必须依然存活,所以控制它们的逻辑和走线不能放进被关的域里——这是静态检查和动态仿真共同盯的第一类错误。数据通路方向则相反:PD_CORE 的输出先过 isolation、再过 level shifter 进入活域,任何一条跨域信号漏挂单元,掉电时就会把未知态送进活域。
| 单元 | 正常工作时 | 域掉电时 | 控制信号来源 |
|---|---|---|---|
| isolation | 透传 | 输出钳到 0 或 1(clamp 值) | always-on 域 |
| retention FF | 普通触发器 | 影子寄存器保持状态 | always-on 域,save 先于断电 |
| level shifter | 电平翻译 | 上游多为已隔离信号 | 无动态控制 |
| power switch | 导通给电 | 断开,域内全暗 | 开关链,ack 握手回报 |
二、电源状态与上下电序列:把 PSO/PSD 变成覆盖点
电源状态不是简单的「开/关」两态。一个典型可开关域至少有四种状态:ACTIVE(全压工作)、RETENTION(低电压保持,逻辑不可算但状态不丢)、OFF(断电)、以及切换中的瞬态。电源状态表枚举所有域的合法状态组合,验证要证明两件事:软件/控制器请求的每个状态都可达;非法组合(如一个域 OFF 但其上游 feeding 域先断、isolation 还没开)永远不会出现。
掉电序列(PSD, Power Shut-Down)的正确拍序是:先停业务流量 → 门控时钟 → 断言 SAVE 把 retention FF 内容搬进影子寄存器 → 使能 isolation 等输出确实钳位 → 最后拉开关断电。上电序列(PSO, Power-Shut Off 的恢复过程)严格反过来:合开关并等 power ack → 撤 isolation → 发 RESTORE 恢复状态 → 开时钟 → 恢复业务。
这张序列图里每一步都需要确认完成才允许进入下一步,工程实现靠 ack/ready 握手而不是固定延时:电源开关的实际开合在物理上需要数微秒到数十微秒,比时钟周期长几个数量级,控制器若只等固定拍数,电压裕量变化后就可能提前动作。覆盖模型要收:全部合法状态两两之间的迁移、每个迁移的正反向、迁移进行中被复位打断、迁移进行中收到第二个电源请求(state rejection 或排队)、多域同时上下电的先后组合。实践中「单域上下电全绿、两域并发掉电挂死」是回归里反复出现的缺陷模式。
三、仿真器里的 X:电源感知仿真与 X 传播
普通 RTL 仿真没有「断电」概念:电源开关不影响仿真值,掉电域的触发器照样保持旧值,一切看起来正常。电源感知仿真(power-aware simulation)让工具按 UPF 建模供电:域断电后,未被保持的时序单元输出变为 X(未知),组合网络随之求值为 X;恢复供电后,retention FF 从影子寄存器恢复保存值,普通 FF 在复位前保持 X。
X 在这里有双重作用。它首先是真实物理的近似:断电后的节点电压确实处在未定区间;其次它是测试探针——如果一条该隔离的路径漏了隔离单元,X 就会沿路径传播,在活域的触发器采样点被断言抓到。反过来,如果仿真器配置成 X 优化模式(工具内部把 X 当 0 或 1 处理以求速),漏隔离的 bug 会被彻底藏住,所以回归必须显式开启 X-prop(X 传播)的严格模式,三种常见口径的差异如下。
这张图要对比着看两条路径:实线是意图内的行为,X 产生在域边界之前就被钳成确定值;虚线是缺陷路径,X 直达活域触发器。监控上除了断言,还会挂全局 X-checker:任何非复位窗口内,活域时序单元的输入、关键控制总线不允许出现 X。需要注意避免误报:retention 恢复的那几拍、以及电源开关尚未 ack 的合法窗口内 X 是预期的,checker 要用电源状态做使能(disable),而不是全局卡死。
| X-prop 模式 | 求值行为 | 适用 |
|---|---|---|
| 乐观模式(x-optimum) | 工具按最有利值吞掉 X | 加速仿真,禁用于低功耗回归 |
| 严格模式(unique/merge) | 两支路结果不一致即判 X | 低功耗回归的默认口径 |
| 门级硬件模式 | 按真实单元真值表传播 X | 门级复验,最接近硅行为 |
四、RTL 毛刺:组合竞争、门控使能与电源切换窗口
毛刺是信号在稳定到最终值之前出现的短暂跳变。低功耗场景的毛刺有两个来源。第一类是组合逻辑竞争冒险:多路输入在同一拍变化,由于各条路径延迟不同,输出在几纳秒内先跳到错误值再稳定——经典的卡诺图相邻项跳变分析见 组合逻辑的竞争与冒险。零延迟 RTL 仿真里这类毛刺根本不可见(所有输入同刻变化、输出一次求值到位),门级延迟仿真才暴露。第二类是门控使能造成的毛刺:时钟门控单元(ICG)的使能信号如果在时钟高电平期间变化,门控输出就会剪出一截窄脉冲,既可能误触发触发器翻转,又白白增加动态功耗;跨电源域的 enable 若来自正在掉电的域,使能线上的 X 和抖动同样会被门控单元放大。
应对手段分三层。设计层:跨域输出一律走 isolation,组合输出用寄存器打一拍再送出,从源头消除「带毛刺的组合信号穿越电源边界」。检查层:glitch-free 检查包括时钟门控使能必须由 ICG 自带锁存器在低电平窗口收束、时钟多路切换走专用无毛刺结构(见 无毛刺时钟切换)、电源控制状态机的输出必须是寄存输出而非组合译码。验证层:RTL 阶段用定向序列在使能翻转的边界拍密集检查,门级阶段用延迟反标的仿真抓真实窄脉冲,并对 isolation 使能、save/restore 等控制信号加「切换期间不得有毛刺」的断言。电源切换窗口是所有毛刺里后果最重的——此时活域正在采样断电域的状态,一个钳位值上的窄脉冲可能被误当成中断或握手应答,系统就此跑飞。
五、静态 LP 规则检查(CLP)与电源感知断言
动态仿真只能证明走过的路径没出错;在仿真之前,CLP(低功耗静态规则检查,Cadence Conformal Low Power / Synopsys VC LP 一类工具)先把 UPF + RTL(后期加网表)当结构对象做穷尽检查,不需要激励。它和 lint 的关系类似 lint 规则与 waiver 签核:规则自动跑,违反项逐条分析或走 waiver 流程,waiver 必须有理由和审批记录。
| 检查类别 | 典型规则 | 抓住的 bug |
|---|---|---|
| 跨域连接 | off 域到活域的端口必须挂 isolation | 漏隔离,X 直入活域 |
| 电平匹配 | 不同电压域之间必须有 level shifter | 高压域输入收不到正确电平 |
| 保持完整性 | 声明 retention 的 FF 必须接到 save/restore | 休眠后恢复出随机值 |
| 供电存在性 | 隔离/保持单元必须接 always-on 电源 | 钳位单元自己也断电 |
| 电源序列 | iso 先于断电、save 先于 iso、restore 先于撤隔离 | 控制器拍序错误 |
| 复位/时钟 | 域内复位与时钟在掉电期处于安全态 | 恢复时误复位、误翻转 |
静态检查强在结构穷尽、弱在「控制器行为」:它知道规则要求 iso_en 先于 pwr_on,但某个软件配置序列下控制器是否真的这样输出,要靠动态仿真里的电源感知断言来守。常用断言包括:当域状态为 CORRUPT(断电)时,其所有跨域端口必须等于钳位值;power ack 未返回前状态机不得进入 ACTIVE;save 有效窗口内 retention 域时钟必须已停;隔离使能到域真正断电之间至少隔 N 拍(与开关物理延迟对应)。功能覆盖则按电源状态 × 迁移 × 复位/中断交叉收 bin。端到端的组织方式可参考 低功耗验证端到端,这篇文档给出了 UPF、checker、覆盖在完整流程里的衔接。
六、门级复验、RTL 与门级差异及常见低功耗 bug
为什么 RTL 电源感知仿真过了,还要在网表上复验?因为插入的电源管理单元在 RTL 阶段是 UPF 隐含的行为模型,综合后才变成真实的标准单元:钳位值、使能极性、保持时序都以实物为准。门级复验要做三件事:确认 isolation/retention/level shifter 单元数量和连接与 UPF 一致(结合等价性检查);反标 SDF 延迟后重跑关键上下电序列,抓 RTL 不可见的毛刺与时序窗口;在硬件口径的 X-prop 下确认 X 行为不劣化。门级仿真的方法基础见 门级仿真、SDF 反标与 X 传播。
| 对比维度 | RTL + UPF 仿真 | 门级低功耗复验 |
|---|---|---|
| 电源单元 | 工具内建行为模型 | 真实标准单元 |
| 延迟 | 零延迟或理想延迟 | SDF 反标实际延迟 |
| 组合毛刺 | 不可见 | 可捕获窄脉冲 |
| X 口径 | 可配,偏乐观 | 按单元真值表,最严 |
| 速度/定位 | 快,适合大量序列与调试验位 | 慢,跑关键序列兜底 |
工程上最常踩的低功耗 bug,按出现频率大致是这些:跨域信号漏 isolation 或 clamp 值写错(该钳 0 的钳成 1,活域把持续误电平当请求);retention 的 save/restore 拍序错位或影子寄存器没接 always-on 电,唤醒后状态随机;上电复位只覆盖活域,断电域恢复后没被复位,带着 X 参与运算;电源状态机用组合输出控制开关,并发请求时输出毛刺导致反复通断;isolation 控制寄存器本身放在了被关的域里,掉电后无法撤销隔离,域再也上不来;多电压域漏 level shifter,低压区输出在高压区落在亚稳态区间;仿真开了 X 优化,回归全绿掩盖了真实传播。这类问题在硅上的表现高度一致——首次进出低功耗状态即死锁或状态错乱,且复现与电压温度强相关,排查成本远高于仿真,这正是低功耗 UPF 验证值得做重的原因。
这一篇在知识体系里的位置
- 向上承接:低功耗设计与 UPF 与 多电源域低功耗设计 讲电源意图与特殊单元的设计侧,本篇验其行为正确性。
- 方法支撑:Power-aware UVM 给环境搭建,低功耗验证端到端 给全流程组织。
- 横向相关:组合逻辑的竞争与冒险 与 无毛刺时钟切换 解释 glitch 机理;门级仿真、SDF 反标与 X 传播 支撑门级复验。
- 下游签核:功耗与电源完整性收敛见 功耗分析与电源完整性,整体签核流程见下一篇 签核方法论 MMMC 收敛策略。
总结
低功耗 UPF 验证的核心是「静态查结构、动态查序列、门级查毛刺」:CLP 穷尽检查漏隔离、漏 level shifter、保持与供电完整性,电源感知仿真在严格 X-prop 下覆盖全部电源状态与上下电迁移、用断言守住钳位值与 iso/save/restore/开关的拍序、用 X-checker 捕获漏网传播,并在反标延迟的门级复验中抓 RTL 不可见的组合毛刺和门控使能窄脉冲——电源域逻辑在结构正确时仍会因状态和序列错误失败,这正是它必须被专门验证的理由。