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 的时序是否覆盖了断电窗口。
二、在 Xcelium 中加载 UPF 的流程
Xcelium 支持在 elaboration 阶段读入 UPF,把电源意图与 RTL 网表绑定。基本流程如下:
- 准备 UPF 文件:通常按层次拆成多个文件,顶层定义供电网络和域划分,子模块定义内部开关与保持。文件顺序很重要,被引用的供电网络必须先声明。
- 编译时指定 UPF:使用
xrun时通过-upf选项加载,例如xrun -upf top.upf -upf sub.upf ...。Xcelium 会在 elaboration 时解析并建立电源域模型。 - 检查绑定结果:加载后可用
-upf_dump或相关报告选项输出域、开关、隔离的绑定情况,确认没有“未绑定实例”或“供电网络缺失”的警告。 - 仿真中观察电源状态:在波形中查看供电网络电压、开关控制信号、隔离使能、保持 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 或错误翻转。
掌握这五个语义对象和加载流程后,下一步才是编写低功耗测试用例:主动控制开关、隔离、保持信号,观察电源状态切换时设计的行为是否符合预期。UPF 建模的质量,直接决定了后续低功耗验证能否发现真实问题。