4. 电源域与电源网络建模

低功耗验证的第一步不是写测试用例,而是把设计的“电源意图”用机器可读的方式描述清楚。UPF(Unified Power Format,IEEE 1801)正是承担这一职责的标准格式:它把散落在设计文档、架构图和口头约定中的供电关系,固化成可被仿真器、综合工具和实现工具共同解析的命令集合。本节围绕四个核心对象展开——电源域(power domain)、供电网络(supply network)、电源端口(power port)与电源状态表(power state table, PST),并给出可直接参考的建模示例。

一、四个对象各自解决什么问题

电源域回答“哪些实例共享同一个可开关的电源”。它是一组逻辑实例的集合,这些实例要么整体上电,要么整体断电,域内不存在部分实例独立关断的情况。供电网络回答“电从哪来、经过哪些开关和网络、送到哪个域”。它由电源端口、电源网(supply net)、电源开关(power switch)和供电集合(supply set)构成。电源端口是供电网络的边界,是模块或设计对外暴露的供电接入点,例如 VDD、VDD_SW、VSS。电源状态表则回答“哪些电源组合是合法的、在什么条件下成立”,它把多个电源端口的状态组合枚举出来,并给每种组合命名,供后续的电源状态控制与覆盖率检查使用。

四者的关系可以概括为:电源端口是供电网络的端点,供电网络为电源域供电,电源状态表约束这些供电组合的合法性。缺少任何一环,低功耗验证都会出现“域划分了但不知道电从哪来”或“电接通了但不知道组合是否合法”的断链。

UPF 电源建模四要素关系图 电源端口层(Power Ports) VDD (1.0V) VDD_SW (开关后) VDD_RET VSS (0V) 供电网络层(Supply Network) 电源开关 sw_pd_cpu 供电网 VDD_SW on/off 可控 常开供电网 VDD always-on 电源域层(Power Domains) PD_CPU 可关断 · 接 VDD_SW PD_AON 常开 · 接 VDD PD_RET 保持 · 接 VDD_RET 电源状态表 PST 合法组合:ON-ON-ON / ON-OFF-ON / ON-OFF-OFF / OFF-OFF-ON(保持态) 非法组合:OFF-ON-* 等

二、创建电源域:从实例集合到域边界

创建电源域的核心是确定“哪些实例归入哪个域”。在 UPF 中通常用 create_power_domain 完成,并通过 -elements 指定域内实例。以下示例假设顶层有三个子模块:u_cpu、u_aon、u_ret,分别对应可关断的 CPU 逻辑、常开逻辑和保持逻辑。

create_power_domain PD_CPU -elements {u_cpu}
create_power_domain PD_AON -elements {u_aon}
create_power_domain PD_RET -elements {u_ret}

这里有一个容易出错的点:域边界必须与实例层次一致。如果 u_cpu 内部还有子模块,默认它们随 u_cpu 一起属于 PD_CPU;若某个子模块需要独立供电,就必须把它单独划出,否则会出现“域内部分实例被错误关断”的验证失败。此外,顶层本身也需要一个默认域,通常用 -include_scope 或显式指定顶层实例来覆盖,避免出现“无主”实例。

三、供电网络:端口、网与开关的串联

供电网络的建模顺序建议从端口开始,再建网,最后接开关。端口用 create_supply_port 声明,网用 create_supply_net 声明,两者通过 connect_supply_net 关联。开关则用 create_power_switch 描述其输入、输出和控制信号。

create_supply_port VDD
create_supply_port VDD_SW
create_supply_port VSS

create_supply_net VDD
create_supply_net VDD_SW
create_supply_net VSS

connect_supply_net VDD -ports {VDD}
connect_supply_net VDD_SW -ports {VDD_SW}
connect_supply_net VSS -ports {VSS}

create_power_switch sw_pd_cpu \
  -domain PD_CPU \
  -input_supply_port {in VDD} \
  -output_supply_port {out VDD_SW} \
  -control_port {sleep_ctrl cpu_sleep_n} \
  -on_state {on in {!sleep_ctrl}}

这段配置表达的逻辑是:当 cpu_sleep_n 为高(即 !sleep_ctrl 成立)时,开关导通,VDD 送到 VDD_SW;否则 VDD_SW 断电。注意 -on_state 中的布尔表达式是开关行为的核心,写错会导致“该断电时没断”或“该上电时上不了电”,是低功耗验证中最常见的缺陷来源之一。

端口与网连接完成后,还需要把域与供电网绑定,通常用 set_domain_supply_net 指定域的主供电和地:

set_domain_supply_net PD_CPU \
  -primary_power_net VDD_SW \
  -primary_ground_net VSS
set_domain_supply_net PD_AON \
  -primary_power_net VDD \
  -primary_ground_net VSS

四、电源状态表:把合法组合显式枚举

电源状态表用 add_port_state 定义每个端口可能的状态,再用 create_pst 和 add_pst_state 枚举合法组合。端口状态通常包含电压值和 on/off 语义,例如:

add_port_state VDD -state {ON 1.0}
add_port_state VDD_SW -state {ON 1.0} -state {OFF off}
add_port_state VDD_RET -state {RET 0.8} -state {OFF off}

create_pst pst_top -supplies {VDD VDD_SW VDD_RET}
add_pst_state S1 -pst pst_top -state {ON ON RET}
add_pst_state S2 -pst pst_top -state {ON OFF RET}
add_pst_state S3 -pst pst_top -state {ON OFF OFF}
add_pst_state S4 -pst pst_top -state {ON OFF RET}

PST 的价值在于两点:一是为后续的电源状态控制提供合法目标,二是为验证提供覆盖率检查依据。仿真时如果出现 PST 中未列出的组合(例如 VDD_SW=ON 而 VDD=OFF),工具会报出非法状态,这往往意味着开关控制逻辑或复位顺序存在问题。因此 PST 不是“写完就算”的文档,而是需要与开关真值表、复位策略逐条对齐的约束集合。

建模顺序建议:先端口、再供电网、再开关、再域绑定、最后 PST。每完成一层就用 check_power_domain 或工具自带的 UPF 语法检查做一次快速校验,避免错误累积到仿真阶段才暴露。

五、一个可复用的建模检查清单

检查项判断依据常见问题
域边界是否完整每个实例恰好属于一个域顶层实例未归域
端口与网是否连通每个 supply net 至少连接一个端口网悬空、端口未连接
开关真值表是否正确on_state 表达式与设计意图一致控制极性写反
域供电绑定是否明确每个域都有 primary power/ground域使用默认网导致误连
PST 是否覆盖所有合法组合枚举组合与开关、复位策略一致遗漏保持态或休眠态

完成上述建模后,设计就具备了一份可执行的电源意图描述。后续的电源状态控制、隔离单元插入、保持寄存器映射以及低功耗仿真,都建立在这份描述之上。建模阶段多花时间对齐端口、开关和 PST,能显著减少仿真阶段定位“电为什么没断”这类问题的时间。