2. 功耗意图建模基础

低功耗验证的第一步不是写测试用例,而是把设计者的“省电意图”变成仿真器能读懂、能检查的模型。UPF(Unified Power Format,IEEE 1801)就是承载这份意图的语言。它不描述功能逻辑,而是描述电源怎么分、什么时候断、断电时信号怎么办、跨电压域通信怎么保证。Xcelium 通过加载 UPF 把这些意图“注入”到 RTL 仿真中,让原本只关心 0/1 的仿真器额外理解“某个域此刻没电”这件事。

一、五个核心语义对象

电源域(power domain)是 UPF 的基本划分单位。它把一组实例、端口和网线归入同一个供电范围,并绑定到某条供电网络(supply net)上。一个域内的所有单元共享相同的上电/断电状态。典型写法是先用 create_power_domain 声明域,再用 add_power_state 或供电集(power set)描述它可能处于 ON、OFF、RETENTION 等状态。域是后面所有低功耗结构的作用范围——隔离、电平转换、保持都挂在域的边界或域内的特定单元上。

电源开关(power switch)决定一个域何时真正得电。它通常是一个物理开关单元(如 header/footer switch),由控制信号(sleep、power_enable)驱动。UPF 中用 create_power_switch 描述开关的输入输出供电端口、控制端口和导通条件。仿真时,开关状态直接改变域内供电网络的电压值:导通时接近标称电压,关断时趋于 0。Xcelium 据此把域内信号判为 X 或保持,从而暴露“断电后仍被读取”的错误。

隔离单元(isolation cell)解决“一个域断电、另一个域还在工作”时的信号污染问题。断电域的输出会漂移到不确定值,如果直接送入常开域,可能引起误触发或漏电。隔离单元在断电域输出端加一个钳位,把信号强制拉到 0 或 1(或锁存当前值)。UPF 用 set_isolation 指定隔离位置(域边界)、隔离值、隔离控制信号以及是否带钳位使能。控制信号本身必须来自常开域,否则隔离会失效。

电平转换器(level shifter)处理跨电压域的信号。当 1.2V 域驱动 1.8V 域,或反过来,直接相连会导致阈值判断错误、静态电流增大甚至器件损伤。UPF 用 set_level_shifter 声明转换方向(low_to_high、high_to_low、both)、位置(from/to)和规则(如 always、按需)。仿真中它体现为信号幅值映射:输入域电压被换算到输出域可识别的逻辑电平,保证跨域功能正确。

保持寄存器(retention register)用于“断电但需记住状态”的场景。普通寄存器断电即丢失内容,而保持寄存器内部有主/从两级或影子存储,由 save/restore 信号控制:断电前把值存入保持单元(由常开供电维持),上电后再恢复。UPF 用 set_retention 指定保持的域、控制信号和保存/恢复条件。验证重点是 save 与 restore 的时序是否覆盖了断电窗口。

UPF 低功耗结构在电源域边界上的协作关系 常开域 AON (1.8V) 隔离控制信号 iso_en / save / restore 常开逻辑 接收隔离后信号 保持存储供电 retention supply 可断电域 PD_SW (1.2V) 电源开关 power switch 功能逻辑 可断电 保持寄存器 retention register 隔离单元 isolation 电平转换器 level shifter iso_en 断电域输出经隔离钳位、跨压域经电平转换后进入常开域;保持寄存器由常开供电维持状态

二、在 Xcelium 中加载 UPF 的流程

Xcelium 支持在 elaboration 阶段读入 UPF,把电源意图与 RTL 网表绑定。基本流程如下:

  1. 准备 UPF 文件:通常按层次拆成多个文件,顶层定义供电网络和域划分,子模块定义内部开关与保持。文件顺序很重要,被引用的供电网络必须先声明。
  2. 编译时指定 UPF:使用 xrun 时通过 -upf 选项加载,例如 xrun -upf top.upf -upf sub.upf ...。Xcelium 会在 elaboration 时解析并建立电源域模型。
  3. 检查绑定结果:加载后可用 -upf_dump 或相关报告选项输出域、开关、隔离的绑定情况,确认没有“未绑定实例”或“供电网络缺失”的警告。
  4. 仿真中观察电源状态:在波形中查看供电网络电压、开关控制信号、隔离使能、保持 save/restore 的时序,判断断电窗口是否被正确覆盖。

一个常见的加载命令示例:

xrun -upf pd_top.upf -upf pd_core.upf \
     -upf_dump upf_bind.rpt \
     -access +rwc \
     -top tb_top \
     -sv tb_top.sv design.sv

其中 -upf_dump 生成的报告会列出每个电源域绑定的实例、供电网络、开关和隔离单元,是排查“UPF 没生效”的第一手材料。

三、编写 UPF 时的关键检查点

UPF 写错往往不会在编译时报错,而是在仿真中表现为 X 传播异常或功能误判。以下检查点值得在加载后逐项确认:

  • 供电网络是否完整:每个域绑定的 supply net 必须存在,且开关的输入输出供电端口要正确连接。缺失会导致域状态无法切换。
  • 隔离控制信号是否来自常开域:如果隔离使能本身来自断电域,断电后它也会失效,隔离形同虚设。
  • 电平转换方向是否匹配:low_to_high 与 high_to_low 不能写反,否则仿真中会出现不合理的逻辑值。
  • 保持寄存器的 save/restore 时序:save 必须在断电前有效,restore 必须在上电后、功能使用前有效。可以用断言或波形检查这两个窗口。
  • 域边界是否覆盖所有跨域信号:任何从断电域到常开域的信号都必须经过隔离;任何跨电压域的信号都必须经过电平转换。遗漏会在仿真中表现为 X 或错误翻转。
在 Xcelium 中,UPF 的加载与 RTL 编译是同一 elaboration 过程的一部分。如果修改了 UPF,需要重新 elaboration,而不是只重新运行仿真。建议把 UPF 文件纳入版本管理,并与 RTL 的层次结构保持同步更新。

掌握这五个语义对象和加载流程后,下一步才是编写低功耗测试用例:主动控制开关、隔离、保持信号,观察电源状态切换时设计的行为是否符合预期。UPF 建模的质量,直接决定了后续低功耗验证能否发现真实问题。