Power Domain 与 Voltage Area 详解

从 UPF 逻辑定义到 ICC2 物理实现 —— 基于一份真实 UPF 的逐句拆解

适用工具链:Synopsys ICC2 / Fusion Compiler + StarRC + PrimeTime  |  UPF 版本:IEEE 1801  |  面向读者:APR / PD 工程师

速懂UPF 拆解MV 单元VAAPR 步骤速查卡

0. 30 秒速懂:一句话区分

🔑 最核心的一句话

Power Domain 回答「哪些逻辑单元共用同一套电源?」——这是 逻辑视角,写在 UPF 里,没有坐标

Voltage Area 回答「这些单元该摆在版图的哪块地?」——这是 物理视角,建在 ICC2 里,有 bbox / 多边形

👉 一个 Power Domain 在物理实现时,需要一个(或多个)Voltage Area 来「落地」。

表 0-1 Power Domain 与 Voltage Area 的核心区别
维度Power Domain (PD)Voltage Area (VA)
抽象层次逻辑 / 电源意图(intent)物理 / 版图实现(implementation)
定义位置UPF 文件 create_power_domainICC2 create_voltage_area
本质是一个 cell 集合 + 一个 supply set版图上一块 区域 / 多边形
有几何形状❌ 没有✅ 有 bbox / polygon
谁负责创建前端 / 低功耗架构师后端 APR 工程师(你)
影响什么综合插 ISO/LS、STA 场景、LECplacement 边界、PG mesh、boundary cell、CTS
数量关系1 个 PD ↔ 0~N 个 VA(默认 domain 可不建 VA;一个 PD 也可分散成多块 VA)
Power Domain 与 Voltage Area 对比 左侧为逻辑视角的 Power Domain 列表,右侧为物理视角的 Voltage Area 区域。 Power Domain(逻辑) UPF 里的一个 cell 集合,没有位置概念 PD_POFF (supply = set_POFF_0P65V) u_core u_dma u_bus u_mbist ... 72k cells ← 只是「名单」,工具不知道它们在芯片哪里 PD_POFF_0P8V (supply = set_POFF_0P8V) pcut0P8V ← 只包含这一个层次实例(含 SRAM) 无坐标 · 无形状 · 无 row · 无 PG 落地 create_ voltage_area Voltage Area(物理) 版图上真实的一块地,有坐标、有 row、有 PG Core Area (default VA = PD_POFF) VA: PD_POFF_0P8V rail 接 VDDOFF_0P8V bbox {700 128} {850 214} 边界必须插 boundary cell 有坐标 · 有形状 · 约束 placement 与 PG
图 0-1 左:Power Domain 是「名单」;右:Voltage Area 是「地盘」。create_voltage_area 是连接两者的桥梁。

1. 为什么需要 Power Domain

如果一颗芯片只有一路 VDD、一路 VSS,那么根本不需要 UPF、不需要 power domain、不需要 voltage area。整个 flow 会简单很多。

但现实中功耗是第一约束,于是有了下面这些手段,每一种手段都会产生新的 power domain

1.1 低功耗设计的四大手段与对应 domain

表 1-1 低功耗手段与产生的 domain / MV 单元
手段做法省的是哪种功耗产生的 domain需要的 MV 单元
Clock Gating 不用时关时钟 动态功耗(switching) 不产生新 domain ICG
Multi-Vt / DVFS 不同模块用不同电压 动态功耗 ∝ V² 多个不同电压的 domain Level Shifter
Power Gating (PSO) 不用时整块断电 漏电功耗(leakage)⭐ 可断电 domain + AON domain Power Switch + Isolation
State Retention 断电但保住寄存器状态 漏电,且快速唤醒 可断电 domain(带 retention) Retention FF (SRPG)
💡 关键认知

在先进工艺(16nm 以下)中,漏电功耗常常超过动态功耗的一半。Clock gating 只能省动态功耗,只有断电(power gating)才能省漏电。这就是 Power Domain 存在的最根本原因。

1.2 单电压 vs 多电压:结构上的差别

单电压 vs 多电压+可断电设计 A. 单电压设计(无需 UPF) VDD (0.8V) CPU0.8V DSP0.8V SRAM0.8V Periph0.8V ✅ 简单 ❌ 无法省 leakage,无法 DVFS B. 多电压 + 可断电(需要 UPF) VDD_0P8V (AON) VDD_0P65V (AON) SW_CHIP_0P8V SW_CHIP_0P65V VDDOFF_0P8V VDDOFF_0P65V PD_POFF_0P8V pcut0P8V · 0.72V 可断电 PD_POFF 主体逻辑 · 0.585V 可断电 Level Shifter AON 区(常开):PMU / wakeup / psw_en / iso_en ✅ 可省 leakage、可 DVFS ❌ 复杂:需 UPF/ISO/LS/VA/PG 隔离
图 1-1 单电压设计与多电压+可断电设计的结构对比。右图正是你这份 UPF 描述的架构。

2. UPF 概念金字塔:先建立整体框架

2.1 五层结构:从物理电源到逻辑域

UPF 不是一堆散乱的命令,它有严格的自底向上的层次。理解了这个金字塔,你看任何 UPF 都不会迷路。

UPF 五层概念金字塔 ① Supply Port / Supply Net 物理电源的「引脚」与「导线」。create_supply_port / create_supply_net / connect_supply_net VDD_0P8V · VDD_0P65V VDDOFF_* · VSS ② Supply Set 把 power / ground / nwell / pwell「打包」成一套完整供电。create_supply_set set_AON_0P8V / 0P65V set_POFF_0P8V / 0P65V ③ Power Domain ⭐ 核心 「哪些 cell」+「用哪套 supply set」。create_power_domain PD_POFF PD_POFF_0P8V ④ MV 策略 (Strategy) create_power_switch / set_isolation / set_level_shifter / set_retention ⑤ 状态描述 (State) add_port_state / create_pst / add_pst_state → 给 STA 和 LEC 用 ICC2 物理实现 create_voltage_area + PG mesh + boundary cell 物理 抽象
图 2-1 UPF 五层金字塔。读任何 UPF 都按这个顺序看,就不会乱。

2.2 术语速查表

表 2-1 UPF 常用术语
术语缩写含义
Supply Port电源的「引脚」,是 UPF 里电源进出某个 scope 的接口
Supply Net电源的「导线」,连接 port 与各个负载
Supply Set一套完整供电:power + ground + nwell + pwell(4 个 function)
Power DomainPD共用同一 primary supply set 的一组逻辑 cell
Voltage AreaVAPD 在版图上的物理区域(ICC2 概念,非 UPF)
Always-OnAON永不断电的电源 / 逻辑
Power Switch OffPSO断电(Power Shut Off / Power Gating)
Power SwitchPSW实现断电的开关单元(MTCMOS,通常是 header PMOS)
Isolation CellISO把断电域输出「钳位」到固定值,防止浮空信号传到 ON 域
Level ShifterLS跨电压信号的电平转换单元
Enable Level ShifterELS带 enable 的 LS = LS + ISO 二合一
Retention FFSRPGState Retention Power Gating,断电时用 AON 电保住状态
Power State TablePST列举所有合法的电源状态组合,给 STA/LEC 用
Header / FooterHeader = 串在 VDD 侧(PMOS);Footer = 串在 VSS 侧(NMOS)

3. 你的 UPF 逐句拆解 ⭐(本文重点)

📋 这份 UPF 描述的架构总结

3.0 全局属性设置(第 1~5 行)

set_design_attributes -elements {.} -attribute lower_domain_boundary false
set_design_attributes -elements {.} -attribute conservative_diff_supply_only_isolation true
set_design_attributes -elements {.} -attribute hetero_fanout_isolation true
set_design_attributes -elements {.} -attribute enable_bias true
表 3-1 四条全局属性的作用
属性作用与影响
lower_domain_boundaryfalsedomain 边界不下移到 leaf cell 层,保持在层次实例边界。影响 ISO/LS 的插入位置。设 false 更常见,边界更清晰
conservative_diff_supply_only_isolationtrue保守模式:只有当两端 supply 确实不同时才插 isolation。避免同电压之间插入无意义的 ISO,减少面积和延时
hetero_fanout_isolationtrue⭐ 当一个输出扇出到多个不同 domain时,为每个目标 domain 单独插 ISO,而不是共用一个。更安全但面积略增
enable_biastrue启用 well bias(nwell/pwell)建模。这就是后面 supply set 里必须写 nwell/pwell function 的原因。先进工艺 / body bias 设计必须开
💡 为什么 enable_bias true 很重要(对 APR 影响大)

开启后,工具会检查 nwell / pwell 的电位一致性。在 Voltage Area 边界上,如果两侧 nwell 电位不同,必须插 well tap / 断开 well,否则会出现 latch-up 或漏电通路。这直接决定了你在 ICC2 里 VA 边界要留多宽的 guard band、插什么 boundary cell。

3.1 Supply Port 与 Supply Net(第 6~17 行)

# ---- 外部输入:常开电(AON) ----
create_supply_port VDD_0P8V   -direction in
create_supply_port VDD_0P65V  -direction in
create_supply_port VSS        -direction in

# ---- 开关之后:可断电(switchable) ----
create_supply_port VDDOFF_0P8V  -direction inout
create_supply_port VDDOFF_0P65V -direction inout

create_supply_net VDD_0P8V
create_supply_net VDD_0P65V
create_supply_net VSS
create_supply_net VDDOFF_0P8V  -resolve parallel
create_supply_net VDDOFF_0P65V -resolve parallel

connect_supply_net VDD_0P8V      -ports VDD_0P8V
connect_supply_net VDD_0P65V     -ports VDD_0P65V
connect_supply_net VDDOFF_0P8V   -ports VDDOFF_0P8V
connect_supply_net VDDOFF_0P65V  -ports VDDOFF_0P65V
connect_supply_net VSS           -ports VSS

🔹 命名规律:一眼看懂电源性质

表 3-2 五个电源 net 的归属
Net 名方向可否断电来源与用途
VDD_0P8Vin❌ 常开 AON直接从 PAD / PMIC 来,供 AON 逻辑、power switch 输入、retention
VDD_0P65Vin❌ 常开 AON同上,低压 AON
VDDOFF_0P8Vinout✅ 可断Switch 输出的「虚拟电源」,供 PD_POFF_0P8V
VDDOFF_0P65Vinout✅ 可断Switch 输出的「虚拟电源」,供 PD_POFF(主体)
VSSin公共地,全芯片共用(说明用的是 header switch 而非 footer)

🔹 -direction inout-resolve parallel 的深层含义

⚠️ 两个容易忽略但很关键的细节

① 为什么 VDDOFF_*inout 而不是 in
因为它不是从外部灌进来的,而是芯片内部 switch 产生的,同时又可能被上层引出去做 probe/测试。inout 表示这个 port 既可作为源也可作为负载。

-resolve parallel 是什么意思?
表示这根 supply net 允许被多个驱动源同时驱动,且它们是并联关系。这正是 power switch 阵列的物理现实:成百上千个 switch cell 并联驱动同一根虚拟电源。
如果不写 -resolve parallel,工具会报「multiple drivers on supply net」错误。

-resolve parallel:为什么虚拟电源需要它 -resolve parallel:为什么虚拟电源需要它 VDD_0P65V(AON,真实电源) SW #1 SW #2 SW #3 · · · SW #N-1 SW #N VDDOFF_0P65V(虚拟电源,N 个 switch 并联驱动) → N 个驱动源同时驱动一根 net,必须声明 -resolve parallel 否则 UPF 检查会报 multiple driver 错误;同时这也是 IR-drop 分析的关键结构
图 3-1 Power switch 阵列并联驱动虚拟电源,这是 -resolve parallel 的物理含义。

3.2 Supply Set:把电源「打包」(第 18~21 行)

create_supply_set set_AON_0P8V   -function {power VDD_0P8V}      -function {ground VSS} \
                                 -function {nwell VDD_0P8V}      -function {pwell VSS}
create_supply_set set_AON_0P65V  -function {power VDD_0P65V}     -function {ground VSS} \
                                 -function {nwell VDD_0P65V}     -function {pwell VSS}
create_supply_set set_POFF_0P8V  -function {power VDDOFF_0P8V}   -function {ground VSS} \
                                 -function {nwell VDDOFF_0P8V}   -function {pwell VSS}
create_supply_set set_POFF_0P65V -function {power VDDOFF_0P65V}  -function {ground VSS} \
                                 -function {nwell VDDOFF_0P65V}  -function {pwell VSS}

🔹 4 个 function 分别是什么

表 3-3 Supply Set 的四个 function
function物理对应说明
powerstd cell 的 VDD pin主电源轨,决定这个域的工作电压
groundstd cell 的 VSS pin地轨
nwellPMOS 的衬底(N-well)⭐ 因为开了 enable_bias,必须显式指定。这里跟着 power 走(无 body bias)
pwellNMOS 的衬底(P-well)跟着 ground 走

🔹 4 套 Supply Set 的正交关系

注意这 4 套 supply set 构成一个 2×2 矩阵

表 3-4 Supply Set 的 2×2 正交矩阵
0.8V(高压)0.65V(低压)
AON(常开) set_AON_0P8V
power = VDD_0P8V
用途:AON 逻辑、LS 的 sink、switch 输入
set_AON_0P65V
power = VDD_0P65V
用途:psw_en/iso_en 控制信号、PMU
POFF(可断) set_POFF_0P8V
power = VDDOFF_0P8V
用途:PD_POFF_0P8V(pcut0P8V)
set_POFF_0P65V
power = VDDOFF_0P65V
用途:PD_POFF(主体 80k cells)
🔑 重要认知:同电压 ≠ 同 domain

set_AON_0P65Vset_POFF_0P65V 电压完全一样(0.585V),但它们是两套不同的 supply set,因为「可否被关掉」不同

这意味着:它们之间的信号跨越,虽然不需要 Level Shifter(电压相同),但需要 Isolation Cell(一边会断电)。这也解释了为什么 UPF 里设了 conservative_diff_supply_only_isolation true —— 让工具智能判断到底该插什么。

3.3 Power Domain:最关键的两句 ⭐(第 22~23 行)

create_power_domain PD_POFF -include_scope -supply {primary set_POFF_0P65V}
create_power_domain PD_POFF_0P8V -elements {pcut0P8V} -supply {primary set_POFF_0P8V}

PD_POFF (默认 domain)

  • -include_scope:把当前 scope 下的所有元素都收进来
  • 唯一例外:被其他 domain 用 -elements 明确拿走的(即 pcut0P8V
  • Primary supply = set_POFF_0P65V0.585V,可断电
  • 👉 这是「兜底」domain,你 block 里 80k 个 leaf cell 绝大部分在这里
  • 物理上:通常直接用 整个 core area 作为 default VA,不需要显式 create_voltage_area

PD_POFF_0P8V (特定 domain)

  • -elements {pcut0P8V}包含这一个层次实例及其子层次
  • Primary supply = set_POFF_0P8V0.72V,可断电
  • 名字 pcut 很可能是 Power cut / partition cut 的意思,是专门为电压切分而在 RTL 里划出的层次
  • 👉 必须在 ICC2 里为它建一个独立 Voltage Area ⭐(电压不同 → PG 必须物理隔离)
⚠️ -include_scope 的执行顺序陷阱

UPF 是顺序执行的脚本。-include_scope 的「兜底」行为是在 UPF 全部读完后才最终确定归属的,所以 PD_POFF 写在前面、PD_POFF_0P8V 写在后面不会导致 pcut0P8V 被错误地划给 PD_POFF

但为了可读性和避免版本差异,建议的写法是先定义具体 domain,最后定义 -include_scope 的默认 domain

🔹 一定要理解:Power Domain 里到底装了什么

create_power_domain 的两个必要成分 create_power_domain 的两个必要成分 成分 A:元素集合(Elements) -include_scope = 当前 scope 下所有 cell(减去被其他域拿走的) u_core u_dma u_mbist u_sram 72k comb 7.5k flop 434 ICG pcut0P8V 被排除 → ⚠️ 注意:这里只有「名字」,没有任何坐标 或 -elements {pcut0P8V} = 精确指定某几个层次实例(含其子层次) pcut0P8V + 成分 B:Primary Supply Set -supply {primary set_POFF_0P65V} power = VDDOFF_0P65V (0.585V, 可断) ground = VSS · nwell = VDDOFF_0P65V · pwell = VSS → 决定:库的 PVT / std cell rail 电压 / STA corner 这句话同时决定了三件事: ① 综合/APR 用哪个电压的 .db / .lib ② 边界上需不需要插 ISO / LS(与相邻域比较) ③ ICC2 里这块 VA 的 PG mesh 要接哪根 net
图 3-2 create_power_domain = 「元素集合」+「primary supply set」,两者缺一不可。

🔹 set_related_supply_net:控制信号的特殊处理

if {[info exists upf_extension] && $upf_extension} {
  set_related_supply_net -power {VDD_0P65V} -ground {VSS} \
                         -object_list {dlink_global_psw_en dlink_global_iso_en}
}
💡 为什么这两个信号要特殊处理

dlink_global_psw_en(switch 使能)和 dlink_global_iso_en(isolation 使能)是控制断电的信号

逻辑必然性:控制「断电」的信号自己绝对不能被断电,否则断电后无法再唤醒(死锁)。所以这里强制把它们的 related supply 指到 AON 电源 VDD_0P65V

👉 对 APR 的影响:这两根线在物理上必须由 AON buffer 驱动,走线穿过断电区时不能被普通 buffer 打断。ICC2 里要注意 set_dont_touch 或用 AON buffer 做 CTS/routing。

3.4 Power Switch:断电靠它实现(第 26~27 行)

create_power_switch SW_CHIP_0P65V \
    -domain PD_POFF \
    -output_supply_port {vout VDDOFF_0P65V} \
    -input_supply_port  {vin  VDD_0P65V} \
    -control_port       {EN   dlink_global_psw_en} \
    -on_state  {full_on  vin {!EN}} \
    -off_state {full_off      {EN}}

create_power_switch SW_CHIP_0P8V \
    -domain PD_POFF_0P8V \
    -output_supply_port {vout VDDOFF_0P8V} \
    -input_supply_port  {vin  VDD_0P8V} \
    -control_port       {EN   dlink_global_psw_en} \
    -on_state  {full_on  vin {!EN}} \
    -off_state {full_off      {EN}}

🔹 逐个选项解释

表 3-5 create_power_switch 选项解释
选项含义
-domain PD_POFF这个 switch 属于(负责供电给)哪个 domain
-input_supply_port {vin VDD_0P65V}输入端接常开电(AON)
-output_supply_port {vout VDDOFF_0P65V}输出端产生虚拟电源(可断)
-control_port {EN dlink_global_psw_en}使能信号,来自 AON 域
-on_state {full_on vin {!EN}}EN=0 时开通(低有效)。full_on 表示完全导通
-off_state {full_off {EN}}EN=1 时关断full_off 表示完全断开
⚠️ 极性容易看错!

{!EN} 中的 ! 表示取反。所以逻辑是:
dlink_global_psw_en = 0 → switch 导通 → 电源接通 → 芯片工作
dlink_global_psw_en = 1 → switch 关断 → 断电(PSO)

信号名叫 psw_en(power switch enable)但实际是「断电使能」,属于命名容易误导的情况,务必以 UPF 里的 on_state/off_state 为准。

🔹 两个 switch 共用同一个 EN → 同时开关

注意 SW_CHIP_0P65VSW_CHIP_0P8V 用的是同一个控制信号 dlink_global_psw_en。这意味着:

Power Switch(Header 型)工作原理与物理实现 Power Switch(Header 型)工作原理与物理实现 电路原理(Header / PMOS) VDD_0P65V (vin, AON) EN (psw_en) PMOS (header) VDDOFF_0P65V (vout, 虚拟电源) PD_POFF 内部逻辑 80k std cells + 7 SRAM VSS(公共地,不断开) 真值表 ENSwitchVDDOFF 0full_on0.585V ✅ 1full_off浮空 / 0V ❌ 物理实现:Switch Cell 阵列(ring / column) Voltage Area / Core SW SW SW SW SW SW SRAM SRAM EN Switch cell 数量由 IR-drop 决定,不是随便定的 太少 → 导通电阻大 → 虚拟电源 IR-drop 严重、上电时间长 太多 → 面积浪费、rush current 过大可能拉垮 AON 电源 EN 需做 daisy-chain 分段延时,避免同时开通的 inrush current
图 3-3 Power switch 的电路原理(左)与物理实现(右)。你需要用 RedHawk / PrimeRail 验证 switch 数量是否足够。

3.5 Level Shifter 策略(第 28 行)

set_level_shifter LS_AON_OP8 \
    -domain PD_POFF \
    -elements {dlink_global_psw_en dlink_global_iso_en} \
    -rule low_to_high \
    -location self \
    -force_shift \
    -source set_AON_0P65V \
    -sink   set_AON_0P8V
表 3-6 set_level_shifter 选项解释
选项含义
-domain PD_POFF这条策略作用在哪个 domain 的边界上
-elements {...}只对这两根控制信号生效(精确控制,不是全局插
-rule low_to_high只处理低压 → 高压方向(0.585V → 0.72V)
-location selfLS 插在本 domain 内部(相对 parent / sibling / fanout
-force_shift强制插入,即使工具认为电压差不大也要插。安全优先
-source set_AON_0P65V信号来源侧的 supply set
-sink set_AON_0P8V信号目的侧的 supply set
🔑 为什么这两根信号一定要 LS,而且用的是 AON 的 supply set?

① 为什么用 AON supply?
psw_en / iso_en 是控制断电的信号,必须常开。所以 source/sink 都指向 set_AON_*,而不是 set_POFF_*

② 为什么 low_to_high 必须 shift?
0.585V 的逻辑「1」送到 0.72V 的电路:接收端 PMOS 的 |Vgs| = 0.72 - 0.585 = 0.135V,如果 |Vth| 也差不多这个量级,PMOS 无法完全关断 → 输出级 PMOS 和 NMOS 同时导通 → 持续的直通电流(crowbar current) → 大量漏电、甚至逻辑错误。

③ high_to_low 为什么通常不需要?
0.72V 的「1」对 0.585V 的电路来说是「超饱和的 1」,能正常识别。只要不超过栅氧可靠性上限,功能上通常可以直连(但仍需 EM/可靠性确认)。

为什么 low_to_high 必须插 Level Shifter 为什么 low_to_high 必须插 Level Shifter ❌ 不插 LS:直连的后果 0.65V 域 VDD = 0.585V 输出「1」= 0.585V 0.585V 0.8V 域 VDD = 0.72V 期望「1」= 0.72V 接收端反相器内部 0.72V in=0.585V |Vgs|=0.135V → 关不断! 导通 ✓ VSS 直通电流 crowbar ✅ 插入 LS:正确做法 0.65V AON psw_en / iso_en out = 0.585V LS_AON_OP8 low_to_high 双 rail 供电 0.8V AON SW_CHIP_0P8V in = 0.72V ✓ 波形示意 in 0.585 0V out 0.72 0V 摆幅被抬高 ✓
图 3-4 不插 LS 会在接收端造成 crowbar current;LS 内部有双电源轨,能把摆幅正确抬升。

🔹 本设计各条跨域路径该用什么

表 3-7 跨域路径与所需 MV 单元
信号路径电压差断电差需要什么
PD_POFF (0.585V可断) → PD_POFF_0P8V (0.72V可断)无(同 EN)只需 LS
PD_POFF (0.585V可断) → AON_0P65V (0.585V常开)只需 ISO
PD_POFF (0.585V可断) → AON_0P8V (0.72V常开)ELS(或 LS+ISO)
AON_0P65V → AON_0P8V(psw_en / iso_en)LS ← 即 LS_AON_OP8

3.6 Port State:声明每个电源的电压值(第 29~36 行)

add_port_state VDD_0P8V        -state {ON  0.720000}
add_port_state VDD_0P8V        -state {OFF off}
add_port_state VDD_0P65V       -state {ON  0.585000}
add_port_state VDD_0P65V       -state {OFF off}
add_port_state SW_CHIP_0P8V/vout   -state {ON  0.720000}
add_port_state SW_CHIP_0P8V/vout   -state {OFF off}
add_port_state SW_CHIP_0P65V/vout  -state {ON  0.585000}
add_port_state SW_CHIP_0P65V/vout  -state {OFF off}
add_port_state VSS             -state {GND 0.000000}
💡 关键观察:标称电压 vs 实际电压
命名实际电压说明
VDD_0P8V0.720 V名字叫 0.8V,实际跑 0.72V(可能是 0.8V ± 10% 的低档,或工艺 SS corner 值)
VDD_0P65V0.585 V0.65V × 0.9 = 0.585V,典型的「标称 −10%」

⚠️ 对 APR/STA 的影响库的选择必须匹配这个实际电压。如果你用 0.8V 的 .db 去跑一个实际 0.72V 的域,时序会严重乐观。务必确认 report_scenarios 里每个 corner 的 operating_conditions 电压与 UPF 一致。

注意 SW_CHIP_*/vout 也要声明 state:因为 switch 的输出是一个新的电源源头,STA 需要知道它导通时的电压值(这里理想化地等于输入电压,实际会有 IR-drop)。

3.7 Power State Table(PST)(第 37~39 行)

create_pst km0 -supplies [list VDD_0P8V VDD_0P65V VDDOFF_0P8V VDDOFF_0P65V VSS]

add_pst_state active_mode   -pst km0 -state {ON ON ON  ON  GND}
add_pst_state chip_off_mode -pst km0 -state {ON ON OFF OFF GND}
表 3-8 km0 的两种电源状态
状态名 VDD_0P8V
AON 0.72V
VDD_0P65V
AON 0.585V
VDDOFF_0P8V
可断
VDDOFF_0P65V
可断
VSS 含义
active_mode ONONONONGND 正常工作,全部有电
chip_off_mode ONONOFFOFFGND ⭐ 主体断电,AON 保持(待机 / 深度睡眠)

🔹 PST 的三大用途

  1. 限制 STA 分析范围:告诉 PrimeTime「只有这两种组合是可能的」,不要去分析不存在的场景(例如 AON 断电而 POFF 有电),避免假的 violation
  2. 指导 ISO/LS 插入:工具通过对比 PST 各状态,判断哪些 domain 之间存在「一边 ON 一边 OFF」的情况 → 必须插 ISO。
  3. LEC(Formality)验证依据:形式验证需要按 PST 逐个状态验证 UPF 前后的逻辑等价性。
两种电源状态的实际含义 两种电源状态的实际含义 active_mode(EN=0,switch 导通) AON 区:PMU / wakeup / psw_en / iso_en 🟢 有电 PD_POFF 0.585V 🟢 有电,工作中 80k cells + 7 SRAM PD_POFF_0P8V 0.72V 🟢 有电,工作中 pcut0P8V 功耗:动态 + 漏电全开 | ISO 处于 透传 状态 时序需在此模式下完整分析(setup / hold / 全 corner) chip_off_mode(EN=1,switch 关断) AON 区:PMU / wakeup / psw_en / iso_en 🟢 仍有电 PD_POFF 0V(浮空) 🔴 断电 输出必须被 ISO 钳位 PD_POFF_0P8V 0V(浮空) 🔴 断电 同一个 EN,同步断 漏电 ≈ 0(仅 AON 部分)| ISO 处于 钳位 状态 此模式下断电域无需时序分析,但需验证 ISO 功能与唤醒序列
图 3-5 active_modechip_off_mode 的实际状态对比。注意两个 POFF domain 由同一个 EN 控制,总是同步。

3.8 Memory 的 Dual-Rail 连接 ⭐(最后几行,非常重要)

# 完整路径(来自截图)
connect_supply_net VDDOFF_0P8V  -ports {u_mbist_dtcm0/mbist_dtcm0_DTCM0_sp8192x1x32_wrapper_block_instance_0/DTCM0_sp8192x1x32_wrapper_instance_0/U_MEM/VDDM}
connect_supply_net VDDOFF_0P8V  -ports {u_mbist_dtcm0/mbist_dtcm0_DTCM0_sp8192x1x32_wrapper_block_instance_0/DTCM0_sp8192x1x32_wrapper_instance_0/U_MEM/VDDM_i}
connect_supply_net VDDOFF_0P65V -ports {u_mbist_dtcm0/mbist_dtcm0_DTCM0_sp8192x1x32_wrapper_block_instance_0/DTCM0_sp8192x1x32_wrapper_instance_0/U_MEM/VDD}
🔴 这是本 UPF 里对 APR 最直接、最容易出错的部分

这颗 SRAM(DTCM0_sp8192x1x32)是 dual-rail memory,有两路独立的电源 pin绝对不能都接同一路 VDD

表 3-9 Dual-rail SRAM 的电源 pin 分配
Memory Pin接的 supply net电压供给谁 / 为什么
VDDM VDDOFF_0P8V 0.72V 存储阵列(bitcell array)电源。SRAM bitcell 的 6T 结构对电压最敏感,低压下 读扰动(read disturb)写失败(write margin)风险大,所以用高压保证稳定性
VDDM_i VDDOFF_0P8V 0.72V 阵列电源的内部/第二个 pin(`_i` = internal)。大 SRAM 常有多个 VDDM pin 分布在不同位置以降低 IR-drop,每一个都必须连
VDD VDDOFF_0P65V 0.585V 周边逻辑电源(address decoder / word-line driver / sense amp control / IO latch)。这部分是普通逻辑,用低压省功耗,且要与外部 0.65V 逻辑直接对接(无需 LS)
VSS VSS 0V 公共地
Dual-Rail SRAM 的内部电源划分与物理 PG 对接 Dual-Rail SRAM 的内部电源划分与物理 PG 对接 VDDOFF_0P8V (0.72V) VDDOFF_0P65V (0.585V) U_MEM (DTCM0_sp8192x1x32) Bitcell Array (6T) 8192 x 32 bit 供电:VDDM / VDDM_i = 0.72V(高压) 低压会导致 read disturb / write margin 不足 周边逻辑 Address Decoder Word-line Driver Control Logic Sense-Amp Ctrl 供电:VDD = 0.585V IO / Latch Q[31:0] D[31:0] VDD = 0.585V 与外部 0.65V 逻辑 直连,无需 LS ✓ 内建 LS 内建 LS VDDM VDDM_i VDD VSS ❌ 若把 VDDM 误接 0.65V → 功能间歇失效,仿真难发现,硅上才暴露 ✅ 检查方法 check_mv_design + check_pg_connectivity
图 3-6 Dual-rail SRAM 内部有两个电压区,且自带 level shifter。APR 必须为 VDDMVDD两套独立的 PG mesh
⚠️ 这对你的 PG 规划意味着什么(重要)
  1. SRAM 上方必须同时有三套 meshVDDOFF_0P8V + VDDOFF_0P65V + VSS。而 SRAM 占 cell area 的 88%,意味着几乎整个 core 都要铺三套。
  2. 两路 VDD 不能短路:0.8V 和 0.65V 的 mesh 必须物理隔离,不能共用任何 via stack。这会占用大量 M4~M6 资源,floorplan 阶段就要规划走线层
  3. VDDM_i 不能漏连:它常在 macro 内部的靠中间位置。如果只连了 VDDM 而漏了 VDDM_i,LVS 可能还是过,但阵列中部的 IR-drop 会超标,导致间歇性读失败。
  4. 你有 7 颗 macro:需要逐颗确认是否都是 dual-rail,各有几个 VDDM* pin。
# ICC2 逐颗确认 macro PG pin(用 port_type,不是 is_pg_pin!)
foreach_in_collection m [get_cells -hier -filter "is_hard_macro==true"] {
    puts "=== [get_object_name $m]  ref=[get_attribute $m ref_name] ==="
    foreach_in_collection p [get_pins -of_objects $m -quiet] {
        set pt [get_attribute $p port_type -quiet]
        if {$pt ne "signal" && $pt ne ""} {
            puts [format "   %-14s type=%-8s net=%s" \
                  [lindex [split [get_object_name $p] "/"] end] $pt \
                  [get_object_name [get_nets -of_objects $p -quiet]]]
        }
    }
}

4. 供电架构全景图(文字版)

把上面所有信息汇总成一张「从外部到版图」的完整链条:

表 4-1 供电架构全景(从外部 PAD 到版图 VA)
0.8V 侧0.65V 侧说明
①外部VDD_0P8V = 0.720VVDD_0P65V = 0.585VPAD / PMIC,常开 AONVSS = 0V 公共地
②SwitchSW_CHIP_0P8V
domain = PD_POFF_0P8V
SW_CHIP_0P65V
domain = PD_POFF
EN = dlink_global_psw_en(低有效)
两者共用同一 EN → 同步开关
③虚拟电源VDDOFF_0P8VVDDOFF_0P65V-resolve parallel,N 个 switch 并联驱动
④SupplySetset_POFF_0P8V
(另有 set_AON_0P8V
set_POFF_0P65V
(另有 set_AON_0P65V
power+ground+nwell+pwell 四件套
2×2 正交:电压 × 可否断电
⑤DomainPD_POFF_0P8V
-elements {pcut0P8V}
→ 需独立 VA
PD_POFF
-include_scope(80k cells + 7 SRAM)
→ 用整个 core 作 default VA
本设计只有 2 个 domain
⑥MV策略LS_AON_OP8:low_to_high,force_shift,作用于 psw_en / iso_en
Dual-rail SRAM:VDDM/VDDM_i→0.8V,VDD→0.65V
ISO 策略可能在 top UPF,需确认
⑦PSTactive_mode = {ON ON ON ON GND}
chip_off_mode = {ON ON OFF OFF GND}
给 PT 限定场景,给 Formality 做 LEC
⑧ICC2create_voltage_area + PG mesh + boundary cell + switch array落到版图上

5. 三种 MV 单元详解

5.1 Power Switch

5.2 Isolation Cell

ISO 的作用是把断电域输出的浮空信号钳位到固定值(0 或 1),防止接收侧收到中间电平导致 crowbar。

❌ 不插 ISO 的后果

  • 🔴 接收端 P/N 同时导通 → 持续大漏电
  • 🔴 AON 状态机收到随机值 → 可能锁死
  • 🔴 若污染 PMU → 芯片无法唤醒
  • 🔴 仿真用理想模型难发现,硅上才暴露

✅ ISO 的三条铁律

  1. 位置:必须在接收侧(ON 域),UPF 用 -location parent / fanout
  2. 供电:ISO cell 自己必须由 AON 电源供电
  3. 使能iso_en 必须来自 AON 域
⚠️ 你这份 UPF 里没有显式的 set_isolation

但有 dlink_global_iso_en 信号,且设了 conservative_diff_supply_only_isolation / hetero_fanout_isolation。可能情况:

  1. ISO 策略在上层 top UPF 里定义(你截图只到 connect_supply_net 结束)
  2. 或依赖工具自动 isolation 推断(不推荐,容易漏)

务必确认:跑完 place_opt 后用 report_qorIsolation Cell Count 是否为 0。若为 0 而设计确有断电域,那是严重问题

5.3 Level Shifter

表 5-1 Level Shifter 的三种类型
类型方向电源说明
L2H低压 → 高压双 rail必须插。否则接收端 PMOS 关不断 → crowbar。LS_AON_OP8 属此类
H2L高压 → 低压单 rail 或双 rail功能上常可直连,但需查栅氧可靠性 EOS 与 overshoot
ELS跨电压 + 跨断电双 rail + enableLS + ISO 二合一。两域既不同电压又有一边会断时用,比分开插省面积

5.4 Retention FF 与 AON Buffer

Retention FF:本设计没用到(无 set_retention),说明断电后寄存器状态全丢,唤醒需完整 reset。这简化了 PG(不需要给每个 FF 拉 AON shadow rail),但牺牲了唤醒速度。

AON Bufferpsw_en / iso_en 要从 AON 区走到分布在整个 VA 里的每个 switch 与 ISO cell。这些线上的 buffer 必须是 AON buffer(接常开电),因此需要:

6. Voltage Area 是什么

6.1 定义与五大约束

# 基本用法
create_voltage_area -power_domain PD_POFF_0P8V \
                    -region {{120.0 200.0} {480.0 620.0}}

# 多个不连续区域
create_voltage_area -power_domain PD_POFF_0P8V \
                    -region {{120 200} {480 620}} {{600 200} {760 400}}

# 基于已有 bound 的形状
create_voltage_area -power_domain PD_POFF_0P8V \
                    -shape [get_attribute [get_bounds b1] boundary]

# 查看
report_voltage_areas
get_attribute [get_voltage_areas] bbox
get_attribute [get_voltage_areas] area
表 6-1 Voltage Area 的五大约束
#约束具体表现
1️⃣Placement 边界PD_POFF_0P8V 的 cell 只能摆在 VA 内;其他 domain cell 不能进来。ICC2 按 hard bound 处理
2️⃣Power rail 归属VA 内 row rail 接 VDDOFF_0P8V,VA 外接 VDDOFF_0P65V边界必须物理断开
3️⃣Row / Site 对齐VA 边界应对齐 row 与 site grid,否则产生不完整 row,legalize 失败或 rail 断裂
4️⃣Boundary cell边界必须插 end-cap / tap / well-isolation cell,防不同电位 well 打通(latch-up)
5️⃣Routing / CTSsignal 可穿越 VA;但 clock buffer 归属必须正确(VA 内的 buffer 要用 VA 电压的库),PG 严格隔离

6.2 版图俯视图

Voltage Area 在版图上的实际样子 Voltage Area 在版图上的实际样子 Die / Core Boundary AON 区 / AON rail(PMU · psw_en · iso_en 的 AON buffer) SRAM #1 VDDM→0.8V VDD→0.65V SRAM #2 SRAM #3 SRAM #4 SRAM #5 SRAM #6 SRAM #7 Voltage Area: PD_POFF_0P8V contents: pcut0P8V rail = VDDOFF_0P8V (0.72V) ↑ guard band(boundary cell / well 隔离) SW SW LS Default VA = PD_POFF(rail = VDDOFF_0P65V, 0.585V) 图例 & 检查点 VA: PD_POFF_0P8V (0.72V) Default VA cell (0.585V) Power Switch 列 Boundary cell / LS / ISO SRAM(dual-rail,7 颗) Guard band ⚠️ 12 个关键检查点 ① VA 边界对齐 row / site grid ② VA 边界插 end-cap + tap ③ 两路 rail 在边界物理断开 ④ nwell 电位不同需 well 隔离 ⑤ LS 需两路 PG 都到位 ⑥ ISO 放 ON 侧 + AON 供电 ⑦ AON rail 需穿越断电区 ⑧ SRAM 两路 mesh 不可短路 ⑨ VDDM_i 不能漏连 ⑩ switch 数量按 IR-drop 计算 ⑪ EN daisy-chain 防 inrush ⑫ VA 内 CTS buffer 用对库 VA utilization 经验值 目标 util 比 default VA 低 5~10% (要留 boundary cell 与 PG 空间)
图 6-1 完整 VA 版图示意,含 7 颗 dual-rail SRAM、switch 列、boundary cell 与 12 个关键检查点。

6.3 VA 边界处理(最易出 DRC/LVS 的地方)

VA 边界剖面:为什么必须插 boundary cell VA 边界剖面:为什么必须插 boundary cell ❌ 直接相邻:well 打通 VDDOFF_0P65V rail VDDOFF_0P8V rail std cell 0.585V PMOS in N-well std cell 0.72V PMOS in N-well 连续 N-well(未断开!) 0.585V ←→ 0.72V 通过 well 短路 P-substrate 🔴 0.135V 压差 → well 漏电通路 🔴 严重时触发 latch-up(不可恢复) 🔴 LVS 报 short;DRC 报 well spacing ✅ 插 boundary cell + guard band VDDOFF_0P65V VDDOFF_0P8V rail 断开区 std cell 0.585V Boundary Cell end-cap + tap + well isolation std cell 0.72V N-well @0.585V well gap (满足 spacing) N-well @0.72V P-substrate(共用,由 pwell tap 接 VSS) ✅ 两侧 N-well 物理隔开,无漏电通路 ✅ rail 在 boundary 区断开,PG 独立 ✅ end-cap 保证 row 完整性;tap 防 latch-up
图 6-2 VA 边界必须有 boundary cell + well gap,否则不同电位 N-well 打通导致漏电/latch-up。

7. PD 与 VA 的映射关系

表 7-1 从 UPF 到 ICC2 的完整映射步骤
动作命令产出 / 检查
1️⃣读入 UPFload_upf ./upf/block.upfreport_power_domains 应看到 2 个 domain
2️⃣确认 supply / supply setreport_supply_nets -verbose
report_supply_sets
5 个 net、4 个 supply set
3️⃣确认 cell 归属get_attribute [get_cells pcut0P8V] power_domain应返回 PD_POFF_0P8V
4️⃣为非默认 PD 建 VAcreate_voltage_area -power_domain PD_POFF_0P8V -region {...}report_voltage_areas
5️⃣铺独立 PG meshcreate_pg_strategy
compile_pg
三套 mesh:0.8V / 0.65V / VSS + AON rail
6️⃣插 boundary cellcreate_boundary_cells
add_end_caps / add_well_taps
VA 边界完整包围
7️⃣摆 power switchcreate_power_switch_array(视版本)column 型;EN daisy-chain
8️⃣MV 优化(插 ISO/LS)place_optreport_qor 看 ISO/LS count ≠ 0
9️⃣全面 MV 检查check_mv_design -verbose
check_pg_connectivity
0 error 才能往下走
🔟IR-drop / EM 签核RedHawk / PrimeRail虚拟电源 IR-drop < 3% 标称值

8. APR 实施步骤(详细)

8.1 Floorplan 阶段

  1. 读入 UPF 并验证load_upfreport_power_domains 确认 2 个 domain
  2. 计算 VA 面积
    # 查 pcut0P8V 的面积
    get_attribute [get_cells pcut0P8V] area
    # 假设得到 A,按 util 目标(如 65%)反推
    # VA 面积 ≈ A / 0.65
  3. 确定 VA 位置:优先靠近 SRAM 与数据流;避开 macro;形状尽量矩形
  4. 建 VAcreate_voltage_area -power_domain PD_POFF_0P8V -region {...}
  5. 摆放 macro:7 颗 SRAM 优先摆放,预留 PG channel
  6. 规划 PG 层:0.8V / 0.65V / VSS 三套 mesh 分配不同层,避免 via 冲突

8.2 Placement 阶段

  1. 插 boundary cellcreate_boundary_cells 包围 VA
  2. 摆 power switch:按 IR-drop 目标计算数量,column 型排列
  3. 铺 PG meshcompile_pg,注意 AON rail 需穿越断电区
  4. place_opt:工具会自动插 ISO/LS
  5. 检查 MV 单元数量report_qor

8.3 CTS 与 Routing 阶段

8.4 Signoff 阶段

9. 检查与调试命令

9.1 UPF / Domain 检查

report_power_domains -verbose        ;# 应看到 PD_POFF / PD_POFF_0P8V
report_supply_nets   -verbose        ;# 5 个 net
report_supply_sets                   ;# 4 个 supply set
report_pst                           ;# km0 两个状态
report_level_shifter_cells
report_isolation_cells
report_voltage_areas

# 某个 cell 属于哪个 domain
get_attribute [get_cells pcut0P8V] power_domain

# 全面 MV 检查 ⭐ 最重要
check_mv_design -verbose

9.2 PG 检查

check_pg_connectivity
check_pg_drc
check_pg_missing_vias
report_pg_strategies
report_pg_patterns

# macro PG pin(注意用 port_type,ICC2 没有 is_pg_pin)
get_pins -of_objects [get_cells u_.../U_MEM] -filter "port_type != signal"

9.3 MV 单元数量核对(跑完 place_opt 后)

report_qor    ;# 看这几行:
#   Single-bit Isolation Cell Count:      应 > 0
#   Single-bit Level Shifter Cell Count:  应 > 0

sizeof_collection [get_cells -hier -filter "is_isolation_cell==true"]
sizeof_collection [get_cells -hier -filter "is_level_shifter==true"]
sizeof_collection [get_cells -hier -filter "is_power_switch==true"]
⚠️ 属性名可能因版本而异

ICC2 的属性名和 DC/PT 不一致(例如 pin 上是 port_type 而非 is_pg_pin)。写脚本前先探属性

list_attributes -application -class cell
list_attributes -application -class pin
report_attributes -application [index_collection [get_cells -hier] 0]

10. 常见坑清单

表 10-1 Power Domain / Voltage Area 常见坑
#现象对策
1UPF 没读进来report_qor 里 ISO/LS/ELS 全 0load_upf 后立刻 report_power_domains 确认
2库电压与 UPF 不匹配时序乐观,PT 与 ICC2 差异大核对 report_scenarios 的 operating condition vs add_port_state
3VA 边界未对齐 rowlegalize 失败 / rail 断裂边界取 row height × N,site width × M
4忘插 boundary cellLVS well short / DRC spacingcreate_boundary_cells + 留 guard band
5ISO 放在发送侧断电后仍传浮空值UPF 用 -location parent/fanout,ISO 由 AON 供电
6iso_en/psw_en 被普通 buffer 打断断电后无法唤醒用 AON buffer + set_dont_touch,铺 AON rail
7VDDM_i 漏连LVS 过,但阵列中部 IR-drop 超标逐颗 macro 列出所有 PG pin 核对
8SRAM 两路 VDD 短路LVS short / 功能失效check_pg_connectivity;0.8V 走高层不接 M1/M2 rail
9switch 数量不足虚拟电源 IR-drop 大,上电慢RedHawk/PrimeRail 迭代;IR-drop < 3% 标称
10EN 未做 daisy-chaininrush current 拉垮 AON 电源分段延时开通
11VA 内 CTS 用错库时序不准,硅上失效确认 clock buffer 的 power_domain 属性正确
12ECO 后未重跑 LEC逻辑改错未被发现每轮 ECO 后跑 Formality(带 UPF + PST)

11. 针对你这个 Block 的具体建议

📊 已知信息回顾

11.1 优先级排序的行动清单

表 11-1 行动清单(按优先级)
优先动作原因
🥇逐颗确认 7 颗 macro 的 PG pin 与 dual-rail 属性88% 面积是 macro,PG 错了整个 block 报废。特别注意 VDDM/VDDM_i/VDD 的数量与位置
🥈规划 VDDOFF_0P8V 跨 VA 到 SRAM 的走线这是本设计最大 PG 难点,必须在 floorplan 阶段定,不能等 PG 阶段再想
🥉确认 pcut0P8V 的面积并划 VAget_attribute [get_cells pcut0P8V] area 得到面积,按 util 目标反推 VA 尺寸
4补 IR-drop / EM 签核环节你的 flow(ICC2+StarRC+PT+Virtuoso)缺 power signoff。memory-dominated + power switch,IR-drop 风险极高
5确认 ISO 策略在哪定义你贴的 UPF 无 set_isolation。跑完 place_opt 若 ISO count = 0 需追查 top UPF
6Y 向线长 2.55× 的原因分析若 die 非竖长形,说明 macro 阵列堵死水平通道。用 Dataflow 分析重排 macro
7AON rail 规划psw_en/iso_en 要送到分布全芯片的 switch/ISO,需专用 AON mesh
8评估 MBFF 升级到 4-bitBitsPerFlop 1.85 偏低,若时钟功耗是目标可重新 banking;若 congestion 严重则反向 debank

11.2 无 Retention 的连带影响

12. 一页速查卡

Power Domain(逻辑)

定义:UPF 中共用同一 primary supply set 的 cell 集合

命令create_power_domain

要素:元素集合 + supply set

:坐标 / 形状 / row / PG

本设计PD_POFF(0.585V可断)、PD_POFF_0P8V(0.72V可断)

Voltage Area(物理)

定义:PD 在版图上的实际区域

命令create_voltage_area

约束:placement / rail / row 对齐 / boundary cell / CTS

:bbox / polygon / 坐标

本设计:只需为 PD_POFF_0P8V 建;PD_POFF 用 default VA

🔹 三句话记住

  1. PD 说「这群人是一个部门」,VA 说「这个部门坐在 3 楼东区」。
  2. 电压不同 → 必须不同 domain → 必须独立 VA + 独立 PG + LS。
  3. 可否断电不同 → 也是不同 domain → 需要 ISO(即使电压相同)。

🔹 最小检查序列(拿到 block 就跑)

load_upf ./upf/block.upf
report_power_domains -verbose
report_supply_nets   -verbose
report_supply_sets
report_pst
report_voltage_areas
check_mv_design -verbose
check_pg_connectivity

🔹 本设计关键数字速记

项目
外部电压VDD_0P8V=0.720V,VDD_0P65V=0.585V,VSS=0V
虚拟电源VDDOFF_0P8VVDDOFF_0P65V
Supply Setset_AON_0P8V / set_AON_0P65V / set_POFF_0P8V / set_POFF_0P65V
DomainPD_POFF(0.65V 主体)、PD_POFF_0P8Vpcut0P8V
SwitchSW_CHIP_0P65VSW_CHIP_0P8V,共用 dlink_global_psw_en(低有效)
LSLS_AON_OP8,low_to_high,force_shift,作用于 psw_en/iso_en
PSTactive_mode={ON ON ON ON GND};chip_off_mode={ON ON OFF OFF GND}
Dual-rail SRAMVDDM/VDDM_iVDDOFF_0P8VVDDVDDOFF_0P65V

本文档基于所提供 UPF 片段分析生成。
具体命令选项在不同 ICC2 版本可能存在差异,执行前请以 man <command> 为准。