4. 电源状态与电源状态表建模

在低功耗UPF验证中,电源域(Power Domain)只定义了“哪些逻辑共享同一供电”,而真正决定这些逻辑在某一时刻是否工作、是否保持、是否掉电的,是电源状态(Power State)。一个电源域可以处于ON、OFF、RETENTION、ISO(隔离)等多种状态,不同状态之间的切换由电源状态表(Power State Table,PST)约束。本节围绕“如何写、如何约束、如何验证”三个层面展开,重点说明状态可达性与非法状态检测在Xcelium中的实现方式。

一、电源状态与状态表的基本语义

电源状态通常由UPF中的add_port_state和create_pst两条命令配合描述。前者为电源端口定义离散的电压/状态值,后者把多个电源端口的状态组合成一张合法状态表。例如一个典型的双域设计:CPU域由VDD_CPU供电,GPU域由VDD_GPU供电,二者可独立开关。我们可以先定义端口状态:

add_port_state VDD_CPU -state {ON 1.0} -state {RET 0.8} -state {OFF off}
add_port_state VDD_GPU -state {ON 1.0} -state {OFF off}

create_pst cpu_gpu_pst -supplies {VDD_CPU VDD_GPU}
add_pst_state S_CPU_ON_GPU_ON  -pst cpu_gpu_pst -state {ON  ON}
add_pst_state S_CPU_RET_GPU_ON -pst cpu_gpu_pst -state {RET ON}
add_pst_state S_CPU_OFF_GPU_ON -pst cpu_gpu_pst -state {OFF ON}
add_pst_state S_ALL_OFF        -pst cpu_gpu_pst -state {OFF OFF}

这里的关键点是:PST只声明“哪些组合是合法的”,它本身不描述“如何从一个状态跳到另一个状态”。状态转移条件由电源域的状态机(add_power_state配合-domain)或由仿真激励中的电源开关控制序列来体现。因此,PST是“合法状态集合”,转移条件是“边”,二者共同构成状态图。

PST中未列出的组合即为非法状态。例如上例中若出现 {RET, OFF},Xcelium在UPF一致性检查阶段会报出非法状态组合,这正是我们希望在验证中捕获的错误。

二、状态转移条件的建模

转移条件通常来自设计中的电源管理控制器(PMC)输出,例如 pwr_cpu_req[1:0] 编码请求ON/RET/OFF。在UPF中可用add_power_state为域定义状态及其转移:

add_power_state PD_CPU -state {ON  -supply {VDD_CPU ON}}  \
                      -state {RET -supply {VDD_CPU RET}} \
                      -state {OFF -supply {VDD_CPU OFF}}

更完整的做法是把转移条件写成状态机的-transition子句,或直接在验证平台中用set_power_state序列驱动。无论哪种方式,验证目标一致:确认所有合法转移可达,且任何非法转移被拦截。

三、Xcelium中的可达性与非法状态验证

在Xcelium中,UPF检查分为静态与动态两类。静态检查在xrun -upf编译阶段执行,会扫描PST完整性、端口状态引用是否一致、是否存在孤立状态等。动态检查在仿真运行时执行,当set_power_state或电源开关模型触发状态变化时,Xcelium会比对当前组合是否落在PST中。

可达性验证的常用手段是编写定向测试:对每个PST状态,构造一组激励使系统进入该状态,并在波形中观察电源端口电压与域内信号行为。例如验证S_CPU_RET_GPU_ON时,应看到CPU域寄存器保持值、GPU域正常翻转。若某状态在仿真中始终无法进入,说明转移条件缺失或PMC编码未覆盖,属于可达性缺陷。

非法状态检测则依赖Xcelium的运行时断言。可在UPF中启用-error选项,使非法组合直接终止仿真;也可在SystemVerilog侧用assert监控电源端口组合。下面给出一个典型的验证结果判读表:

检查项触发时机期望结果异常含义
PST完整性编译期无warning存在未定义组合
状态可达性仿真运行每个PST状态至少命中一次转移条件缺失
非法状态拦截仿真运行报错并停止PST约束被绕过
保持/隔离行为状态切换后RET域值保持、ISO域输出钳位UPF策略未生效

实际调试中,常见问题是PST状态名与add_power_state中的状态名不一致,导致Xcelium报“state not found”。建议统一命名规范,例如全部使用大写加下划线,并在UPF文件头部集中定义宏或参数。

电源状态表与状态转移验证视图 PST 合法状态集合 S_CPU_ON_GPU_ON S_CPU_RET_GPU_ON S_CPU_OFF_GPU_ON S_ALL_OFF ON / ON RET / ON OFF / ON OFF / OFF 非法组合:RET / OFF Xcelium 运行时断言拦截 状态转移图(PMC 驱动) ON 1.0V RET 0.8V OFF 0V req=RET req=ON req=OFF req=ON 验证判读 绿色:PST 合法且可达 红色:非法组合,断言拦截 黄色:合法但未命中,需补激励

四、验证闭环与常见陷阱

一个完整的验证闭环应包含:编译期PST一致性检查、仿真期状态可达性覆盖、非法状态注入测试、以及状态切换后的保持/隔离行为检查。建议在回归脚本中统计每个PST状态的命中次数,未命中状态以黄色标记,非法状态以红色标记,形成可视化的覆盖率报告。

常见陷阱有三类:其一,PST中定义了状态但add_power_state未引用,导致状态“悬空”;其二,电源端口电压值与PST中off关键字混用,造成比较失败;其三,多个PST之间存在重叠状态名,Xcelium可能按最后定义覆盖。规避方法是保持命名唯一、在UPF头部集中声明端口状态、并用-upf编译选项开启严格模式。

当设计包含多个电源域且存在嵌套关系时,PST的维度会迅速增长。此时应优先使用create_pst的-supplies分组,把强相关域放在同一张PST中,避免组合爆炸导致仿真性能下降。

最后,状态可达性验证不应只依赖随机激励。建议为每个PST状态编写一条定向用例,明确设置PMC请求编码,并在波形中确认电源端口电压、域内寄存器保持值、隔离单元输出三者同时符合预期。只有“状态进入正确、行为表现正确、非法组合被拦截”三者同时满足,电源状态建模才算通过验证。