2. UPF基本架构与电源域建模

低功耗验证的第一步,是把设计意图中的“电源”从抽象概念变成可被仿真器识别的对象。UPF(Unified Power Format)正是承担这一职责的标准化描述语言:它用一组命令声明电源域、电源开关、隔离单元、电平转换器和保持寄存器,并把这些低功耗结构绑定到RTL的层次与信号上。Xcelium在加载UPF后,会据此构建一套“电源状态模型”,在仿真过程中动态决定哪些逻辑有电、哪些逻辑掉电、跨域信号是否需要钳位或保持。理解这套架构,是后续做电源关断、状态保持和功耗感知验证的基础。

一、UPF的层次化架构

UPF描述通常分为三个层次。最底层是电源网络:用create_power_domain、create_supply_port、create_supply_net和connect_supply_net定义电源端口、电源网络及其连接关系,回答“电从哪来、送到哪去”。中间层是电源域:把设计中的模块、实例或信号划分到不同的供电区域,每个域可以独立开关。最上层是低功耗策略:在域或域间插入隔离、电平转换、保持等单元,规定域关断时边界信号的行为。Xcelium加载UPF时,会先解析电源网络,再建立域与实例的映射,最后把策略单元插入到仿真模型中。

UPF 架构与电源域建模关系图 ① 电源网络层(Power Network) VDD 主电源端口 create_supply_port VDD_SW 开关电源 create_supply_net VSS 地网络 connect_supply_net 电源开关 Power Switch 控制 VDD → VDD_SW 通断 ② 电源域层(Power Domain) PD_TOP(常开域) VDD 持续供电 create_power_domain -name PD_TOP -elements {u_top} PD_CPU(可关断域) VDD_SW 供电 create_power_domain -name PD_CPU -elements {u_cpu} PD_GPU(可关断域) VDD_SW 供电 create_power_domain -name PD_GPU -elements {u_gpu} ③ 低功耗策略层(Power Intent) 隔离单元 Isolation Cell set_isolation 钳位到 0 / 1 / latch 电平转换器 Level Shifter set_level_shifter 低压 ↔ 高压 保持寄存器 Retention Register set_retention 掉电前保存 / 上电恢复 电源状态表 Power State Table add_power_state 定义合法状态组合

二、电源域建模的关键命令

电源域是UPF建模的核心对象。一个域代表一组共享同一供电策略的实例或模块。创建域的基本命令是:

create_power_domain PD_CPU -elements {u_cpu}
create_power_domain PD_GPU -elements {u_gpu}
create_power_domain PD_TOP -elements {u_top}

其中-elements指定该域覆盖的层次实例。域可以嵌套,子域继承父域的电源网络,但可以有自己的开关策略。域创建后,需要把电源网络连接到域上:

connect_supply_net VDD_SW -domain PD_CPU
connect_supply_net VDD_SW -domain PD_GPU
connect_supply_net VDD -domain PD_TOP

这样,PD_CPU和PD_GPU由VDD_SW供电,PD_TOP由常开的VDD供电。当电源开关断开VDD_SW时,PD_CPU和PD_GPU进入掉电状态,而PD_TOP保持工作。

三、电源开关与状态控制

电源开关是控制域供电通断的物理或行为模型。在UPF中,可以用create_power_switch描述开关:

create_power_switch sw_cpu \
  -domain PD_CPU \
  -input_supply_port {vin VDD} \
  -output_supply_port {vout VDD_SW} \
  -control_port {sleep_ctrl cpu_sleep_n} \
  -on_state {on_state vin {!sleep_ctrl}}

这段描述的含义是:当cpu_sleep_n为低电平时,开关导通,VDD送到VDD_SW;当cpu_sleep_n为高电平时,开关断开,PD_CPU掉电。Xcelium在仿真中会根据cpu_sleep_n的实时值,动态更新PD_CPU的供电状态,并触发域内信号的掉电行为。

四、隔离、电平转换与保持

域关断后,其输出信号会处于不确定状态,可能对常开域造成误触发。隔离单元的作用就是在域边界把信号钳位到确定值:

set_isolation iso_cpu \
  -domain PD_CPU \
  -isolation_power_net VDD \
  -isolation_ground_net VSS \
  -clamp_value 0 \
  -applies_to outputs

这里-clamp_value 0表示域掉电时,PD_CPU的输出被钳位到逻辑0。隔离单元由常开电源VDD供电,因此即使PD_CPU掉电,隔离逻辑仍能工作。

当两个域工作在不同电压时,跨域信号需要电平转换器。例如PD_CPU工作在0.8V,PD_TOP工作在1.2V,则PD_CPU到PD_TOP的信号需要升压:

set_level_shifter ls_cpu_to_top \
  -domain PD_CPU \
  -applies_to outputs \
  -rule both \
  -location self

保持寄存器用于在域掉电前保存关键状态,上电后恢复。典型描述为:

set_retention ret_cpu \
  -domain PD_CPU \
  -retention_power_net VDD \
  -retention_ground_net VSS \
  -save_signal {cpu_save_n posedge} \
  -restore_signal {cpu_restore_n posedge}

当cpu_save_n出现上升沿时,寄存器值被保存到保持电源域;当cpu_restore_n出现上升沿时,值被恢复。Xcelium会在仿真中模拟这一保存与恢复过程。

五、在Xcelium中加载UPF

完成UPF文件编写后,需要在Xcelium编译和仿真阶段加载。典型流程如下:

# 编译阶段加载UPF
xrun -upf design.upf -upf_delay 0 -access +rwc \
     -f filelist.f -top tb_top

# 仿真阶段指定电源状态
xrun -upf design.upf -power_domain PD_CPU \
     -power_state {PD_CPU ON} -run

其中-upf指定UPF文件,-upf_delay控制UPF加载与RTL初始化的时序关系,-access +rwc开放信号读写权限以便观察电源状态。仿真中可以通过$power_state或相关系统任务查询域状态,也可以在波形中观察隔离钳位、保持恢复等行为是否符合预期。

实践提示:UPF加载顺序很重要。电源网络和域定义必须在策略命令之前,否则Xcelium会报“domain not found”或“supply net undefined”。建议按“电源端口→电源网络→电源域→开关→隔离/电平/保持→状态表”的顺序组织UPF文件,便于调试和维护。

六、建模检查要点

在进入仿真之前,建议对UPF建模做一次快速检查:域划分是否覆盖了所有需要独立开关的模块;每个域是否都连接了正确的电源网络;开关控制信号是否来自常开域;隔离单元是否只作用于域输出;电平转换器的方向与电压关系是否匹配;保持寄存器的保存/恢复信号是否由常开逻辑驱动。这些检查能显著减少仿真中的电源状态异常和X态传播问题。

掌握以上架构与命令后,就可以在Xcelium中构建一个可运行的电源域模型,为后续的电源关断序列验证、隔离行为检查和保持恢复测试打下基础。