2. UPF与CPF标准解析

低功耗验证的核心难点,不在于“知道要省电”,而在于“把省电意图准确翻译成可验证的模型”。UPF(Unified Power Format,IEEE 1801)和CPF(Common Power Format,Cadence 主导)就是这门翻译语言。二者目标一致:用声明式命令描述电源域、电源开关、隔离、电平转换和保留寄存器等低功耗结构,让仿真器在RTL仿真中“看见”电源行为。理解它们的语义差异与建模方法,是后续所有低功耗验证工作的地基。

一、电源域:低功耗结构的第一层边界

电源域(Power Domain)是一组共享同一电源策略的实例集合,是UPF/CPF中最基础的建模对象。它的语义包含三要素:范围(哪些实例属于该域)、供电来源(由哪个电源网络供电)、默认状态(上电时是否开启)。在UPF中,典型写法是:

create_power_domain PD_CPU -elements {u_cpu}
create_power_domain PD_GPU -elements {u_gpu}
create_supply_net VDD_CPU
create_supply_port VDD_CPU
connect_supply_net VDD_CPU -ports VDD_CPU
set_domain_supply_net PD_CPU -primary_power_net VDD_CPU

CPF的对应语义是 create_power_domain -name PD_CPU -instances {u_cpu},再通过 create_power_nets 与 create_power_domain -primary_power_net 建立供电关系。两者都强调“域是供电边界”,但UPF更倾向于用 supply net/port 显式描述电源网络拓扑,CPF则更早把电源域与电源网络绑定。建模时要注意:域边界一旦确定,跨域信号就必须经过隔离或电平转换,否则仿真会出现X传播或功能误判。

二、电源开关:控制域的通断

电源开关(Power Switch)决定一个域何时上电、何时断电。UPF用 create_power_switch 描述开关的输入、输出、控制信号和导通条件:

create_power_switch sw_cpu \
  -domain PD_CPU \
  -input_supply_port {vin VDD} \
  -output_supply_port {vout VDD_CPU} \
  -control_port {sleep_ctrl sleep_en} \
  -on_state {on_state vin {sleep_ctrl}}

这里 on_state 的语义是:当 sleep_ctrl 为真时,vin 导通到 vout,域上电;否则域断电。CPF用 create_power_switch 配合 -domain、-output_supply_port 和 -on_state 表达同样逻辑。建模关键点在于:开关的控制信号本身必须来自常开域(always-on domain),否则会出现“用断电域的信号去控制断电域”的非法结构,仿真中表现为控制信号为X,开关状态不确定。

三、隔离与电平转换:跨域信号的安全通道

当一个域断电时,其输出信号会浮空或变为X。如果这些信号直接驱动常开域,就会污染整个系统。隔离单元(Isolation Cell)的作用是在域断电时把输出钳位到确定值(通常为0或1)。UPF写法:

set_isolation iso_cpu \
  -domain PD_CPU \
  -isolation_power_net VDD \
  -isolation_ground_net VSS \
  -clamp_value 0 \
  -applies_to outputs
set_isolation_control iso_cpu \
  -domain PD_CPU \
  -isolation_signal iso_en \
  -isolation_sense high \
  -location parent

语义上,clamp_value 0 表示断电时输出被拉低;isolation_signal 是隔离使能,通常由常开域产生;location parent 表示隔离单元放在父域边界。CPF对应 create_isolation_rule,用 -from、-to、-isolation_condition 描述隔离方向与条件。

电平转换(Level Shifter)解决的是不同供电电压域之间的信号接口问题。例如CPU域1.2V驱动IO域1.8V,直接连接会导致阈值误判。UPF用 set_level_shifter 描述:

set_level_shifter ls_cpu_to_io \
  -domain PD_CPU \
  -applies_to outputs \
  -rule both \
  -location self \
  -input_supply VDD_CPU \
  -output_supply VDD_IO

其中 -rule both 表示高低电平都转换,-location self 表示转换器放在源域。CPF用 create_level_shifter_rule 表达。建模时要注意:隔离和电平转换可能同时存在,顺序通常是“先隔离、后电平转换”,否则断电域的X信号会先进入电平转换器,导致转换器输出不确定。

四、保留寄存器:断电前的状态保存

保留寄存器(Retention Register)用于在域断电前保存关键状态,上电后恢复。UPF用 set_retention 描述:

set_retention ret_cpu \
  -domain PD_CPU \
  -retention_power_net VDD_RET \
  -retention_ground_net VSS \
  -save_signal save_en \
  -restore_signal restore_en
set_retention_control ret_cpu \
  -domain PD_CPU \
  -save_signal {save_en high} \
  -restore_signal {restore_en high}

语义是:save_en 有效时,寄存器值写入保留锁存器;restore_en 有效时恢复。保留电源 VDD_RET 必须始终供电,否则保存的值会丢失。CPF用 create_retention_rule 表达。建模关键点:保留寄存器需要额外的控制时序,save和restore不能与断电/上电同时发生,通常需要提前若干周期拉高save_en,断电后再拉高restore_en。

UPF/CPF 低功耗结构语义关系图 常开域 AON VDD_AON 始终供电 产生控制信号: sleep_en / iso_en save_en / restore_en 电源开关 VDD → VDD_CPU 受 sleep_en 控制 on_state 导通条件 电源域 PD_CPU(可断电) 保留寄存器 VDD_RET 常供电 save / restore 隔离单元 clamp_value 0 iso_en 控制 电平转换器 1.2V ↔ 1.8V 电源域 PD_IO(常开) VDD_IO = 1.8V 接收隔离后信号 电平已转换 sleep_en VDD_CPU iso_en save/restore 隔离后信号 电平转换后 图例说明: 常开域 电源开关 可断电域 隔离单元 电平转换器 保留寄存器 电源/信号流 控制信号

五、UPF与CPF的建模差异与验证要点

从验证视角看,UPF和CPF的差异主要体现在三方面。第一,电源网络描述粒度:UPF用 supply net/port 显式建模电源拓扑,适合复杂多电源网络;CPF更偏向域级绑定,抽象层次更高。第二,命令执行顺序:UPF要求先创建supply net再连接,顺序错误会导致域供电悬空;CPF的域与网络绑定更紧凑,但跨文件引用时需注意作用域。第三,工具兼容性:主流仿真器对UPF 1801的支持更统一,CPF在部分Cadence流程中仍有优势,但跨工具移植时需做语义映射。

实际验证中,建议按以下顺序检查低功耗结构是否建模正确:先确认电源域边界与RTL实例层次一致;再检查电源开关控制信号是否来自常开域;然后验证隔离单元的clamp_value和使能极性;接着确认电平转换方向与电压值匹配;最后检查保留寄存器的save/restore时序是否覆盖断电窗口。任何一步遗漏,都可能在仿真中表现为X传播、功能错误或功耗状态误判。

建模提示:UPF/CPF命令本身不产生电路,它们只是“约束声明”。仿真器根据这些声明插入隔离、电平转换和保留逻辑的行为模型。因此,验证工程师必须同时检查RTL、UPF/CPF文件和仿真波形三者是否一致,而不能只依赖其中一方。

掌握这五类语义后,后续的电源状态表(PST)、低功耗仿真流程和覆盖率收集才有明确的检查对象。UPF与CPF不是两套互斥标准,而是同一低功耗意图的两种表达方式;理解其语义对应关系,比死记命令语法更重要。