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的建模差异与验证要点
从验证视角看,UPF和CPF的差异主要体现在三方面。第一,电源网络描述粒度:UPF用 supply net/port 显式建模电源拓扑,适合复杂多电源网络;CPF更偏向域级绑定,抽象层次更高。第二,命令执行顺序:UPF要求先创建supply net再连接,顺序错误会导致域供电悬空;CPF的域与网络绑定更紧凑,但跨文件引用时需注意作用域。第三,工具兼容性:主流仿真器对UPF 1801的支持更统一,CPF在部分Cadence流程中仍有优势,但跨工具移植时需做语义映射。
实际验证中,建议按以下顺序检查低功耗结构是否建模正确:先确认电源域边界与RTL实例层次一致;再检查电源开关控制信号是否来自常开域;然后验证隔离单元的clamp_value和使能极性;接着确认电平转换方向与电压值匹配;最后检查保留寄存器的save/restore时序是否覆盖断电窗口。任何一步遗漏,都可能在仿真中表现为X传播、功能错误或功耗状态误判。
掌握这五类语义后,后续的电源状态表(PST)、低功耗仿真流程和覆盖率收集才有明确的检查对象。UPF与CPF不是两套互斥标准,而是同一低功耗意图的两种表达方式;理解其语义对应关系,比死记命令语法更重要。