4. 电源域与电源状态验证

低功耗SoC验证的核心难点,不在于单个电源开关能否关断,而在于多个电源域在各自独立开关、上下电、保持与隔离过程中,跨域信号是否始终处于合法状态。本节围绕一个典型的三电源域SoC模型展开:常开域(AON,Always-On)承载PMU与唤醒逻辑,CPU域(PD_CPU)可独立关断,GPU/多媒体域(PD_GPU)可独立关断并支持状态保持。我们将用UPF描述电源意图,用Xcelium仿真电源状态转换序列,并重点检查电源域边界信号完整性。

一、多电源域SoC模型的电源意图建模

电源域验证的第一步是把设计意图写成可执行的电源意图描述。UPF中的核心对象包括:power domain(电源域)、power switch(电源开关)、isolation cell(隔离单元)、level shifter(电平转换器)、retention register(保持寄存器)以及电源状态表(PST)。以下示例给出三个电源域的骨架描述,参数为教学假设值,实际项目需按工艺库与设计规格替换。

# 教学示例:三电源域UPF骨架(参数为假设值)
create_power_domain PD_AON  -include_scope u_aon
create_power_domain PD_CPU  -include_scope u_cpu
create_power_domain PD_GPU  -include_scope u_gpu

# 电源网络
create_supply_net VDD_AON  -domain PD_AON
create_supply_net VDD_CPU  -domain PD_CPU
create_supply_net VDD_GPU  -domain PD_GPU
create_supply_net VDD_GPU_RET -domain PD_GPU   # 保持电源

# 电源开关:CPU域由PMU控制
create_power_switch sw_cpu \
  -domain PD_CPU \
  -input_supply_port  {vin  VDD_AON} \
  -output_supply_port {vout VDD_CPU} \
  -control_port       {sleep_ctrl cpu_pwr_en} \
  -on_state  {on_state vin {sleep_ctrl}} \
  -off_state {off_state {!sleep_ctrl}}

# 隔离:CPU域输出到AON域,关断时钳位为0
set_isolation iso_cpu2aon \
  -domain PD_CPU -isolation_power_net VDD_AON \
  -clamp_value 0 -applies_to outputs

# 电平转换:GPU域1.0V -> AON域1.8V
set_level_shifter ls_gpu2aon \
  -domain PD_GPU -applies_to outputs \
  -rule low_to_high -location self

# 保持寄存器:GPU域关键配置寄存器
set_retention ret_gpu \
  -domain PD_GPU -retention_power_net VDD_GPU_RET \
  -elements {u_gpu/cfg_reg[*]}

建模时最容易出错的是隔离与电平转换的作用方向。隔离单元应放在被关断域的输出侧,其供电必须来自常开域,否则关断后隔离单元自身失电,输出会变成不确定值。电平转换器则要放在信号从低压域进入高压域的路径上,且需明确是low_to_high还是high_to_low。若一个信号既跨压又跨域,通常先隔离再电平转换,顺序不能颠倒。

二、电源状态转换序列的编写

电源状态表定义了各域允许的合法状态组合。以本模型为例,AON域始终为ON;CPU域有ON、OFF两态;GPU域有ON、RET(保持)、OFF三态。合法组合共6种,非法组合(如AON=OFF)必须在验证中被排除。电源状态转换序列就是按时间顺序驱动这些状态迁移的激励。

下面是一段教学用的转换序列,覆盖“全开→关GPU→关CPU→唤醒CPU→恢复GPU”的完整闭环。序列中每个状态保持时间设为200ns,便于观察电源稳定与信号建立。

# 教学示例:电源状态转换序列(时间单位为ns)
# 状态编码:AON=ON固定;CPU: 0=OFF,1=ON;GPU: 0=OFF,1=RET,2=ON
0        : CPU=1, GPU=2   # 全开
200      : CPU=1, GPU=1   # GPU进入保持
400      : CPU=1, GPU=0   # GPU完全关断
600      : CPU=0, GPU=0   # CPU关断,仅AON工作
800      : CPU=1, GPU=0   # 唤醒CPU
1000     : CPU=1, GPU=1   # GPU恢复保持
1200     : CPU=1, GPU=2   # GPU全开
1400     : 结束

编写序列时要特别注意状态迁移的先后约束:GPU从ON到OFF必须先经过RET,不能直接跳变,否则保持寄存器的内容会在断电瞬间丢失;CPU从OFF唤醒时,必须先建立VDD_CPU,等待电源稳定后再释放复位,最后才允许跨域信号有效。这些时序约束应作为断言或检查项写入验证环境,而不是仅靠人工观察波形。

三、电源域边界信号完整性检查

电源域边界是缺陷高发区。Xcelium结合UPF仿真时,可自动检查以下几类完整性问题:隔离单元是否在关断前使能、隔离钳位值是否与协议一致、电平转换器是否缺失、保持寄存器的保存与恢复时序是否正确、以及关断域输出是否出现X态传播。

实际检查中,建议在验证环境中加入如下断言(教学示例,基于SystemVerilog):

// 教学示例:隔离使能检查
property p_iso_enable_before_poweroff;
  @(posedge clk) disable iff (!rst_n)
  (u_cpu/pwr_en == 1'b0) |-> ##[1:3] (u_cpu/iso_en == 1'b1);
endproperty
assert property(p_iso_enable_before_poweroff)
  else $error("ISO not enabled before CPU power-off");

// 教学示例:关断域输出不得为X
property p_no_x_on_isolated_output;
  @(posedge clk) disable iff (!rst_n)
  (u_cpu/pwr_en == 1'b0) |-> !$isunknown(u_cpu/data_out);
endproperty
assert property(p_no_x_on_isolated_output)
  else $error("X detected on isolated CPU output");

除断言外,还应检查电源域边界的信号方向与供电归属。一个常见错误是:某信号从CPU域输出到AON域,但隔离单元被错误地放在AON域内部,导致CPU关断后隔离单元输入悬空。正确做法是隔离单元归属被关断域,供电取自常开域。另一个常见问题是保持寄存器在RET态下仍被时钟驱动,造成保持期间数据被意外改写,这需要检查retention控制信号与时钟门控的配合。

四、仿真日志分析与问题定位

Xcelium运行UPF仿真后,日志中会出现电源状态迁移、隔离使能、保持保存/恢复等事件记录。分析日志时,建议按以下顺序排查:先确认电源状态迁移是否按序列执行,再检查每次关断前隔离是否已使能,然后检查保持寄存器的save/restore是否成对出现,最后检查是否有X态传播到常开域。

以下是一段教学示例日志片段,展示了正常与异常两种情况的对比:

# 正常:隔离先于关断
[200ns] PD_GPU state: ON -> RET
[400ns] ISO_GPU2AON enabled
[400ns] PD_GPU state: RET -> OFF
[400ns] RET_GPU save completed

# 异常:隔离使能晚于关断
[600ns] PD_CPU state: ON -> OFF
[602ns] WARNING: ISO_CPU2AON enabled after power-off
[603ns] ERROR: X detected on u_cpu/data_out -> u_aon/data_in

当日志中出现“X detected on ... -> ...”时,说明关断域输出在隔离生效前已经传播到常开域。定位方法是:在波形中同时观察pwr_en、iso_en、被关断域输出和常开域输入四个信号,确认iso_en的上升沿是否早于pwr_en的下降沿至少一个隔离使能周期。若隔离使能由软件配置,还需检查配置写入是否在关断命令之前完成。

建议在验证环境中把电源状态迁移、隔离使能、保持保存/恢复三类事件统一打上时间戳标签,便于在日志中快速过滤和关联。Xcelium的UPF日志可通过-upf_log选项增强输出,具体选项名以所用版本为准。

五、验证闭环与结果判读

完成上述步骤后,一次完整的电源域验证应能回答三个问题:电源状态迁移是否严格按PST执行;每次关断前后,边界信号是否始终处于合法值(隔离钳位、电平匹配、无X传播);保持寄存器在RET态下是否可靠保存并在恢复后正确还原。若三者均通过,且日志中无X态传播与隔离时序告警,则可判定该转换序列通过。若出现告警,应按“先隔离、后关断;先上电、后释放复位;先保存、后断电”的顺序回溯检查,定位到具体信号与时间点。

多电源域SoC电源状态转换与边界信号完整性检查 PD_AON(常开域) VDD_AON 1.8V PMU / 唤醒逻辑 隔离供电来源 PD_CPU(可关断) VDD_CPU 1.0V CPU核心 / 缓存 状态:ON / OFF PD_GPU(可关断+保持) VDD_GPU 1.0V / VDD_GPU_RET GPU / 多媒体 状态:ON / RET / OFF 电源开关 sw_cpu cpu_pwr_en 控制 电源开关 sw_gpu gpu_pwr_en 控制 隔离单元 iso_cpu2aon 钳位 0,供电 VDD_AON 隔离单元 iso_gpu2aon 钳位 0,供电 VDD_AON 电平转换 ls_gpu2aon low_to_high 1.0V→1.8V 保持寄存器 ret_gpu VDD_GPU_RET 供电 隔离后输出 隔离后输出 电平转换后进入AON域 状态序列: 全开 → GPU RET → GPU OFF → CPU OFF → CPU ON → GPU RET → GPU ON 检查点:隔离使能早于关断 / 无X传播 / 保持寄存器save-restore成对

把上述模型、序列、断言与日志分析串起来,就形成了电源域验证的最小闭环。实际项目中,电源域数量可能达到十几个,状态组合呈指数增长,此时应优先覆盖跨域交互最频繁的边界,并用PST约束排除非法组合,避免无效仿真。下一阶段可进一步引入动态电压频率调节(DVFS)场景,验证电压切换过程中的时序与信号完整性。