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 中通常用 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 不是“写完就算”的文档,而是需要与开关真值表、复位策略逐条对齐的约束集合。
check_power_domain 或工具自带的 UPF 语法检查做一次快速校验,避免错误累积到仿真阶段才暴露。五、一个可复用的建模检查清单
| 检查项 | 判断依据 | 常见问题 |
|---|---|---|
| 域边界是否完整 | 每个实例恰好属于一个域 | 顶层实例未归域 |
| 端口与网是否连通 | 每个 supply net 至少连接一个端口 | 网悬空、端口未连接 |
| 开关真值表是否正确 | on_state 表达式与设计意图一致 | 控制极性写反 |
| 域供电绑定是否明确 | 每个域都有 primary power/ground | 域使用默认网导致误连 |
| PST 是否覆盖所有合法组合 | 枚举组合与开关、复位策略一致 | 遗漏保持态或休眠态 |
完成上述建模后,设计就具备了一份可执行的电源意图描述。后续的电源状态控制、隔离单元插入、保持寄存器映射以及低功耗仿真,都建立在这份描述之上。建模阶段多花时间对齐端口、开关和 PST,能显著减少仿真阶段定位“电为什么没断”这类问题的时间。