3. 低功耗设计意图创建

低功耗设计意图(Low-Power Design Intent)是芯片在RTL到GDS全流程中保持功耗行为一致性的“契约”。它不描述具体用什么工艺、什么单元实现,而是声明“哪些区域可以被关断、关断时其他区域如何被保护、跨区域信号如何安全传递、哪些状态必须保留”。在Cadence实现流程中,这份契约以UPF(Unified Power Format,IEEE 1801)文件的形式存在,由Genus、Innovus、Voltus、Joules等工具共同读取,从而保证综合、布局布线、功耗签核各阶段对电源结构的理解完全一致。

一、UPF的核心对象与层次关系

编写UPF之前,必须先建立清晰的电源结构模型。UPF用一组命令描述这些对象:create_power_domain定义电源域,create_supply_port与create_supply_net定义供电端口和供电网络,connect_supply_net把网络连到域或端口,create_power_switch定义电源开关,set_isolation定义隔离策略,set_level_shifter定义电平转换策略,set_retention定义状态保持策略。这些对象之间存在明确的从属与引用关系:电源域是容器,供电网络是能量通道,开关是通道上的可控阀门,隔离/电平转换/保持是跨域边界上的保护规则。

UPF 电源意图对象关系图 PD_TOP(Always-On 域) VDD_EXT 外部供电端口 VDD_AON 常开供电网络 Power Switch SW_CPU(Header Switch) 控制信号:PWR_EN_CPU VDD_CPU_SW 开关后供电网络 PD_CPU(可关断域) CPU Core Logic Cache SRAM Retention FF Retention FF Isolation Cell ISO_CPU(Clamp to 0) 控制:ISO_EN_CPU Level Shifter LS_CPU(1.2V→1.8V) 方向:双向 Retention RET_CPU 保存/恢复控制 关键约束关系: • PD_CPU 的供电来自 VDD_CPU_SW,由 SW_CPU 开关控制,开关控制信号 PWR_EN_CPU 属于 PD_TOP • PD_CPU 关断时,输出到 PD_TOP 的信号必须经 ISO_CPU 隔离,防止浮空信号传播 • PD_CPU 与 PD_TOP 电压不同(1.2V vs 1.8V),跨域信号必须经 LS_CPU 电平转换 • Retention FF 在关断前保存状态到常开域,恢复时回写,避免重新初始化

二、电源域与电源开关的定义

电源域是UPF中最基本的划分单位。一个电源域内的所有实例共享同一组供电网络,可以独立开关或调压。在示例SoC中,我们划分三个域:PD_TOP为常开域,包含电源管理控制器、时钟生成和隔离控制逻辑;PD_CPU为可关断域,包含CPU核心和Cache;PD_GPU为可调压域,支持多电压工作。定义命令如下:

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

create_supply_port VDD_EXT -domain PD_TOP
create_supply_net VDD_AON -domain PD_TOP
create_supply_net VSS -domain PD_TOP
connect_supply_net VDD_AON -ports {VDD_EXT}

create_supply_net VDD_CPU_SW -domain PD_CPU
create_supply_net VSS -domain PD_CPU
set_domain_supply_net PD_CPU \
  -primary_power_net VDD_CPU_SW \
  -primary_ground_net VSS

电源开关用create_power_switch定义,它把输入供电网络、输出供电网络和控制端口关联起来。开关类型通常选择header(高电平导通)或footer(低电平导通),控制信号必须来自常开域,否则关断后无法重新开启。

create_power_switch SW_CPU \
  -domain PD_CPU \
  -input_supply_port {vin VDD_AON} \
  -output_supply_port {vout VDD_CPU_SW} \
  -control_port {sleep_ctrl PWR_EN_CPU} \
  -on_state {on_state vin {sleep_ctrl}} \
  -off_state {off_state {!sleep_ctrl}}

三、隔离、电平转换与状态保持策略

隔离策略解决“关断域输出到常开域”的问题。当PD_CPU关断时,其输出信号会浮空,若直接进入PD_TOP会导致常开域出现未知翻转和短路功耗。隔离单元在关断期间把信号钳位到确定值(通常为0或1),钳位值由接收端逻辑的无效态决定。UPF中通过set_isolation指定隔离位置、钳位值和使能信号:

set_isolation ISO_CPU \
  -domain PD_CPU \
  -isolation_power_net VDD_AON \
  -isolation_ground_net VSS \
  -clamp_value 0 \
  -applies_to outputs \
  -isolation_signal ISO_EN_CPU \
  -isolation_sense high \
  -location parent

电平转换策略解决“不同电压域之间信号传递”的问题。PD_CPU工作在1.2V,PD_TOP工作在1.8V,若1.2V信号直接驱动1.8V输入,可能无法达到阈值;反之1.8V信号直接驱动1.2V输入,可能造成栅氧过压。电平转换器根据信号方向选择不同结构,UPF中通过set_level_shifter声明:

set_level_shifter LS_CPU \
  -domain PD_CPU \
  -applies_to both \
  -rule both \
  -location self \
  -input_supply VDD_CPU_SW \
  -output_supply VDD_AON

状态保持策略解决“关断后关键状态丢失”的问题。CPU的配置寄存器、状态机当前状态、Cache标签等若在关断后丢失,恢复时需要重新初始化,既耗时又可能破坏系统一致性。Retention FF在关断前把状态保存到常开域的影子寄存器,恢复时再回写。UPF中通过set_retention和set_retention_control定义:

set_retention RET_CPU \
  -domain PD_CPU \
  -retention_power_net VDD_AON \
  -retention_ground_net VSS \
  -save_signal SAVE_CPU \
  -restore_signal RESTORE_CPU

set_retention_control RET_CPU \
  -domain PD_CPU \
  -save_signal {SAVE_CPU high} \
  -restore_signal {RESTORE_CPU high}

四、策略之间的时序配合

上述策略不是孤立的,它们必须按严格顺序生效。关断流程为:先置位SAVE_CPU保存状态,再置位ISO_EN_CPU使能隔离,最后关闭PWR_EN_CPU切断电源。开启流程相反:先打开PWR_EN_CPU恢复供电,再置位RESTORE_CPU恢复状态,最后撤销ISO_EN_CPU。若顺序错误,例如先断电再隔离,浮空信号已经传播;若先撤销隔离再恢复供电,同样会出现毛刺。这些控制信号通常由常开域中的电源管理状态机产生,UPF只声明策略,不描述状态机实现。

在Genus中读入UPF后,可用check_upf命令检查语法和对象引用完整性;用report_power_domain查看域划分结果;用report_isolation、report_level_shifter、report_retention分别确认三类策略是否按预期插入。综合完成后,在Innovus中再次读入同一份UPF,确保物理实现阶段插入的隔离/电平转换/保持单元与综合阶段一致。

五、常见错误与检查要点

UPF编写中最常见的错误包括:控制信号定义在可关断域内,导致关断后无法恢复;隔离使能信号极性写反,导致常开期间误隔离;电平转换方向声明错误,导致单向信号被插入双向单元;Retention的save/restore信号与电源开关时序不匹配。建议在UPF完成后,用Joules或Voltus做一次静态低功耗检查,确认每个跨域路径都有对应的保护策略,且没有遗漏的浮空节点。只有UPF与RTL、约束、物理实现完全对齐,低功耗设计意图才能真正落地。