Power Domain 与 Voltage Area 详解
从 UPF 逻辑定义到 ICC2 物理实现 —— 基于一份真实 UPF 的逐句拆解
0. 30 秒速懂:一句话区分
Power Domain 回答「哪些逻辑单元共用同一套电源?」——这是 逻辑视角,写在 UPF 里,没有坐标。
Voltage Area 回答「这些单元该摆在版图的哪块地?」——这是 物理视角,建在 ICC2 里,有 bbox / 多边形。
👉 一个 Power Domain 在物理实现时,需要一个(或多个)Voltage Area 来「落地」。
| 维度 | Power Domain (PD) | Voltage Area (VA) |
|---|---|---|
| 抽象层次 | 逻辑 / 电源意图(intent) | 物理 / 版图实现(implementation) |
| 定义位置 | UPF 文件 create_power_domain | ICC2 create_voltage_area |
| 本质是 | 一个 cell 集合 + 一个 supply set | 版图上一块 区域 / 多边形 |
| 有几何形状 | ❌ 没有 | ✅ 有 bbox / polygon |
| 谁负责创建 | 前端 / 低功耗架构师 | 后端 APR 工程师(你) |
| 影响什么 | 综合插 ISO/LS、STA 场景、LEC | placement 边界、PG mesh、boundary cell、CTS |
| 数量关系 | 1 个 PD ↔ 0~N 个 VA(默认 domain 可不建 VA;一个 PD 也可分散成多块 VA) | |
create_voltage_area 是连接两者的桥梁。1. 为什么需要 Power Domain
如果一颗芯片只有一路 VDD、一路 VSS,那么根本不需要 UPF、不需要 power domain、不需要 voltage area。整个 flow 会简单很多。
但现实中功耗是第一约束,于是有了下面这些手段,每一种手段都会产生新的 power domain。
1.1 低功耗设计的四大手段与对应 domain
| 手段 | 做法 | 省的是哪种功耗 | 产生的 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 多电压:结构上的差别
2. UPF 概念金字塔:先建立整体框架
2.1 五层结构:从物理电源到逻辑域
UPF 不是一堆散乱的命令,它有严格的自底向上的层次。理解了这个金字塔,你看任何 UPF 都不会迷路。
2.2 术语速查表
| 术语 | 缩写 | 含义 |
|---|---|---|
| Supply Port | — | 电源的「引脚」,是 UPF 里电源进出某个 scope 的接口 |
| Supply Net | — | 电源的「导线」,连接 port 与各个负载 |
| Supply Set | — | 一套完整供电:power + ground + nwell + pwell(4 个 function) |
| Power Domain | PD | 共用同一 primary supply set 的一组逻辑 cell |
| Voltage Area | VA | PD 在版图上的物理区域(ICC2 概念,非 UPF) |
| Always-On | AON | 永不断电的电源 / 逻辑 |
| Power Switch Off | PSO | 断电(Power Shut Off / Power Gating) |
| Power Switch | PSW | 实现断电的开关单元(MTCMOS,通常是 header PMOS) |
| Isolation Cell | ISO | 把断电域输出「钳位」到固定值,防止浮空信号传到 ON 域 |
| Level Shifter | LS | 跨电压信号的电平转换单元 |
| Enable Level Shifter | ELS | 带 enable 的 LS = LS + ISO 二合一 |
| Retention FF | SRPG | State Retention Power Gating,断电时用 AON 电保住状态 |
| Power State Table | PST | 列举所有合法的电源状态组合,给 STA/LEC 用 |
| Header / Footer | — | Header = 串在 VDD 侧(PMOS);Footer = 串在 VSS 侧(NMOS) |
3. 你的 UPF 逐句拆解 ⭐(本文重点)
- 2 路外部输入电压:0.8V 域(实际 0.72V)+ 0.65V 域(实际 0.585V)
- 2 组 Power Switch:把两路 AON 电分别转成可断电(
VDDOFF_*) - 2 个 Power Domain:
PD_POFF(0.65V,主体)+PD_POFF_0P8V(0.8V,仅pcut0P8V) - 1 个 Level Shifter 策略:控制信号从 0.65V AON 升到 0.8V AON
- 2 个电源状态:
active_mode(全开)+chip_off_mode(主体断电,AON 保持) - Dual-rail SRAM:
VDDM接 0.8V(阵列),VDD接 0.65V(周边) - 无 Retention:断电后状态全丢,唤醒需完整 reset
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
| 属性 | 值 | 作用与影响 |
|---|---|---|
lower_domain_boundary | false | domain 边界不下移到 leaf cell 层,保持在层次实例边界。影响 ISO/LS 的插入位置。设 false 更常见,边界更清晰 |
conservative_diff_supply_only_isolation | true | ⭐ 保守模式:只有当两端 supply 确实不同时才插 isolation。避免同电压之间插入无意义的 ISO,减少面积和延时 |
hetero_fanout_isolation | true | ⭐ 当一个输出扇出到多个不同 domain时,为每个目标 domain 单独插 ISO,而不是共用一个。更安全但面积略增 |
enable_bias | true | ⭐ 启用 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
🔹 命名规律:一眼看懂电源性质
| Net 名 | 方向 | 可否断电 | 来源与用途 |
|---|---|---|---|
VDD_0P8V | in | ❌ 常开 AON | 直接从 PAD / PMIC 来,供 AON 逻辑、power switch 输入、retention |
VDD_0P65V | in | ❌ 常开 AON | 同上,低压 AON |
VDDOFF_0P8V | inout | ✅ 可断 | Switch 输出的「虚拟电源」,供 PD_POFF_0P8V |
VDDOFF_0P65V | inout | ✅ 可断 | Switch 输出的「虚拟电源」,供 PD_POFF(主体) |
VSS | in | — | 公共地,全芯片共用(说明用的是 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 的物理含义。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 分别是什么
| function | 物理对应 | 说明 |
|---|---|---|
power | std cell 的 VDD pin | 主电源轨,决定这个域的工作电压 |
ground | std cell 的 VSS pin | 地轨 |
nwell | PMOS 的衬底(N-well) | ⭐ 因为开了 enable_bias,必须显式指定。这里跟着 power 走(无 body bias) |
pwell | NMOS 的衬底(P-well) | 跟着 ground 走 |
🔹 4 套 Supply Set 的正交关系
注意这 4 套 supply set 构成一个 2×2 矩阵:
| 0.8V(高压) | 0.65V(低压) | |
|---|---|---|
| AON(常开) | set_AON_0P8Vpower = VDD_0P8V 用途:AON 逻辑、LS 的 sink、switch 输入 |
set_AON_0P65Vpower = VDD_0P65V 用途: psw_en/iso_en 控制信号、PMU |
| POFF(可断) | set_POFF_0P8Vpower = VDDOFF_0P8V 用途: PD_POFF_0P8V(pcut0P8V) |
set_POFF_0P65Vpower = VDDOFF_0P65V 用途: PD_POFF(主体 80k cells) |
set_AON_0P65V 和 set_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_0P65V→ 0.585V,可断电 - 👉 这是「兜底」domain,你 block 里 80k 个 leaf cell 绝大部分在这里
- 物理上:通常直接用 整个 core area 作为 default VA,不需要显式
create_voltage_area
② PD_POFF_0P8V (特定 domain)
-elements {pcut0P8V}:只包含这一个层次实例及其子层次- Primary supply =
set_POFF_0P8V→ 0.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 = 「元素集合」+「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}}
🔹 逐个选项解释
| 选项 | 含义 |
|---|---|
-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_0P65V 和 SW_CHIP_0P8V 用的是同一个控制信号 dlink_global_psw_en。这意味着:
- 两个电压域同时上电、同时断电,不需要复杂的 power-up sequence 仲裁
- 对应到 PST 里,就是
VDDOFF_0P8V和VDDOFF_0P65V的状态总是一致的(都 ON 或都 OFF) - ✅ 简化了设计:不会出现「0.8V 域有电但 0.65V 域没电」的中间态,跨域接口不需要考虑单边断电
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
| 选项 | 含义 |
|---|---|
-domain PD_POFF | 这条策略作用在哪个 domain 的边界上 |
-elements {...} | 只对这两根控制信号生效(精确控制,不是全局插) |
-rule low_to_high | 只处理低压 → 高压方向(0.585V → 0.72V) |
-location self | LS 插在本 domain 内部(相对 parent / sibling / fanout) |
-force_shift | ⭐ 强制插入,即使工具认为电压差不大也要插。安全优先 |
-source set_AON_0P65V | 信号来源侧的 supply set |
-sink set_AON_0P8V | 信号目的侧的 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/可靠性确认)。
🔹 本设计各条跨域路径该用什么
| 信号路径 | 电压差 | 断电差 | 需要什么 |
|---|---|---|---|
| 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}
| 命名 | 实际电压 | 说明 |
|---|---|---|
VDD_0P8V | 0.720 V | 名字叫 0.8V,实际跑 0.72V(可能是 0.8V ± 10% 的低档,或工艺 SS corner 值) |
VDD_0P65V | 0.585 V | 0.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}
| 状态名 | VDD_0P8V AON 0.72V |
VDD_0P65V AON 0.585V |
VDDOFF_0P8V 可断 |
VDDOFF_0P65V 可断 |
VSS | 含义 |
|---|---|---|---|---|---|---|
active_mode |
ON | ON | ON | ON | GND | 正常工作,全部有电 |
chip_off_mode |
ON | ON | OFF | OFF | GND | ⭐ 主体断电,AON 保持(待机 / 深度睡眠) |
🔹 PST 的三大用途
- 限制 STA 分析范围:告诉 PrimeTime「只有这两种组合是可能的」,不要去分析不存在的场景(例如 AON 断电而 POFF 有电),避免假的 violation。
- 指导 ISO/LS 插入:工具通过对比 PST 各状态,判断哪些 domain 之间存在「一边 ON 一边 OFF」的情况 → 必须插 ISO。
- LEC(Formality)验证依据:形式验证需要按 PST 逐个状态验证 UPF 前后的逻辑等价性。
active_mode 与 chip_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}
这颗 SRAM(DTCM0_sp8192x1x32)是 dual-rail memory,有两路独立的电源 pin,绝对不能都接同一路 VDD!
| 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 | 公共地 |
VDDM 和 VDD 铺两套独立的 PG mesh。- SRAM 上方必须同时有三套 mesh:
VDDOFF_0P8V+VDDOFF_0P65V+VSS。而 SRAM 占 cell area 的 88%,意味着几乎整个 core 都要铺三套。 - 两路 VDD 不能短路:0.8V 和 0.65V 的 mesh 必须物理隔离,不能共用任何 via stack。这会占用大量 M4~M6 资源,floorplan 阶段就要规划走线层。
VDDM_i不能漏连:它常在 macro 内部的靠中间位置。如果只连了VDDM而漏了VDDM_i,LVS 可能还是过,但阵列中部的 IR-drop 会超标,导致间歇性读失败。- 你有 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. 供电架构全景图(文字版)
把上面所有信息汇总成一张「从外部到版图」的完整链条:
| 层 | 0.8V 侧 | 0.65V 侧 | 说明 |
|---|---|---|---|
| ①外部 | VDD_0P8V = 0.720V | VDD_0P65V = 0.585V | PAD / PMIC,常开 AON;VSS = 0V 公共地 |
| ②Switch | SW_CHIP_0P8Vdomain = PD_POFF_0P8V | SW_CHIP_0P65Vdomain = PD_POFF | EN = dlink_global_psw_en(低有效)两者共用同一 EN → 同步开关 |
| ③虚拟电源 | VDDOFF_0P8V | VDDOFF_0P65V | -resolve parallel,N 个 switch 并联驱动 |
| ④SupplySet | set_POFF_0P8V(另有 set_AON_0P8V) | set_POFF_0P65V(另有 set_AON_0P65V) | power+ground+nwell+pwell 四件套 2×2 正交:电压 × 可否断电 |
| ⑤Domain | PD_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_enDual-rail SRAM:VDDM/VDDM_i→0.8V,VDD→0.65V | ISO 策略可能在 top UPF,需确认 | |
| ⑦PST | active_mode = {ON ON ON ON GND}chip_off_mode = {ON ON OFF OFF GND} | 给 PT 限定场景,给 Formality 做 LEC | |
| ⑧ICC2 | create_voltage_area + PG mesh + boundary cell + switch array | 落到版图上 | |
5. 三种 MV 单元详解
5.1 Power Switch
- 本质:一个大 PMOS(header)或 NMOS(footer),由 AON 域的使能信号控制通断
- Header vs Footer:Header 串在 VDD 侧(PMOS),虚拟电源接近 0V 时彻底断电;Footer 串在 VSS 侧(NMOS),虚拟地会浮空到接近 VDD。本设计用
VSS公共 → Header - 数量计算:由 IR-drop 目标反推,公式近似
N = I_total / I_per_switch,其中I_per_switch由 foundry 给出 - 物理摆放:常见 ring(围一圈)、column(列状插入 std cell row)、grid(网格分布)三种。列状最常见
- EN daisy-chain:不能让所有 switch 同时导通(inrush current 会拉垮 AON 电源),必须分段延时
5.2 Isolation Cell
ISO 的作用是把断电域输出的浮空信号钳位到固定值(0 或 1),防止接收侧收到中间电平导致 crowbar。
❌ 不插 ISO 的后果
- 🔴 接收端 P/N 同时导通 → 持续大漏电
- 🔴 AON 状态机收到随机值 → 可能锁死
- 🔴 若污染 PMU → 芯片无法唤醒
- 🔴 仿真用理想模型难发现,硅上才暴露
✅ ISO 的三条铁律
- 位置:必须在接收侧(ON 域),UPF 用
-location parent/fanout - 供电:ISO cell 自己必须由 AON 电源供电
- 使能:
iso_en必须来自 AON 域
set_isolation
但有 dlink_global_iso_en 信号,且设了 conservative_diff_supply_only_isolation / hetero_fanout_isolation。可能情况:
- ISO 策略在上层 top UPF 里定义(你截图只到
connect_supply_net结束) - 或依赖工具自动 isolation 推断(不推荐,容易漏)
✅ 务必确认:跑完 place_opt 后用 report_qor 看 Isolation Cell Count 是否为 0。若为 0 而设计确有断电域,那是严重问题。
5.3 Level Shifter
| 类型 | 方向 | 电源 | 说明 |
|---|---|---|---|
| L2H | 低压 → 高压 | 双 rail | ⭐ 必须插。否则接收端 PMOS 关不断 → crowbar。LS_AON_OP8 属此类 |
| H2L | 高压 → 低压 | 单 rail 或双 rail | 功能上常可直连,但需查栅氧可靠性 EOS 与 overshoot |
| ELS | 跨电压 + 跨断电 | 双 rail + enable | LS + ISO 二合一。两域既不同电压又有一边会断时用,比分开插省面积 |
5.4 Retention FF 与 AON Buffer
Retention FF:本设计没用到(无 set_retention),说明断电后寄存器状态全丢,唤醒需完整 reset。这简化了 PG(不需要给每个 FF 拉 AON shadow rail),但牺牲了唤醒速度。
AON Buffer:psw_en / iso_en 要从 AON 区走到分布在整个 VA 里的每个 switch 与 ISO cell。这些线上的 buffer 必须是 AON buffer(接常开电),因此需要:
- 在断电 VA 内部额外铺一条 AON rail(常做成专用窄 mesh,走在 std cell rail 之上某层)
- ICC2 里用
set_dont_touch+ 手工 buffer 树,或用 secondary PG 策略 - CTS/routing 阶段要防止工具用普通 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
| # | 约束 | 具体表现 |
|---|---|---|
| 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 / CTS | signal 可穿越 VA;但 clock buffer 归属必须正确(VA 内的 buffer 要用 VA 电压的库),PG 严格隔离 |
6.2 版图俯视图
6.3 VA 边界处理(最易出 DRC/LVS 的地方)
7. PD 与 VA 的映射关系
| 步 | 动作 | 命令 | 产出 / 检查 |
|---|---|---|---|
| 1️⃣ | 读入 UPF | load_upf ./upf/block.upf | report_power_domains 应看到 2 个 domain |
| 2️⃣ | 确认 supply / supply set | report_supply_nets -verbosereport_supply_sets | 5 个 net、4 个 supply set |
| 3️⃣ | 确认 cell 归属 | get_attribute [get_cells pcut0P8V] power_domain | 应返回 PD_POFF_0P8V |
| 4️⃣ | ⭐ 为非默认 PD 建 VA | create_voltage_area -power_domain PD_POFF_0P8V -region {...} | report_voltage_areas |
| 5️⃣ | 铺独立 PG mesh | create_pg_strategycompile_pg | 三套 mesh:0.8V / 0.65V / VSS + AON rail |
| 6️⃣ | 插 boundary cell | create_boundary_cellsadd_end_caps / add_well_taps | VA 边界完整包围 |
| 7️⃣ | 摆 power switch | create_power_switch_array(视版本) | column 型;EN daisy-chain |
| 8️⃣ | MV 优化(插 ISO/LS) | place_opt | report_qor 看 ISO/LS count ≠ 0 |
| 9️⃣ | 全面 MV 检查 | check_mv_design -verbosecheck_pg_connectivity | 0 error 才能往下走 |
| 🔟 | IR-drop / EM 签核 | RedHawk / PrimeRail | 虚拟电源 IR-drop < 3% 标称值 |
8. APR 实施步骤(详细)
8.1 Floorplan 阶段
- 读入 UPF 并验证:
load_upf→report_power_domains确认 2 个 domain - 计算 VA 面积:
# 查 pcut0P8V 的面积 get_attribute [get_cells pcut0P8V] area # 假设得到 A,按 util 目标(如 65%)反推 # VA 面积 ≈ A / 0.65 - 确定 VA 位置:优先靠近 SRAM 与数据流;避开 macro;形状尽量矩形
- 建 VA:
create_voltage_area -power_domain PD_POFF_0P8V -region {...} - 摆放 macro:7 颗 SRAM 优先摆放,预留 PG channel
- 规划 PG 层:0.8V / 0.65V / VSS 三套 mesh 分配不同层,避免 via 冲突
8.2 Placement 阶段
- 插 boundary cell:
create_boundary_cells包围 VA - 摆 power switch:按 IR-drop 目标计算数量,column 型排列
- 铺 PG mesh:
compile_pg,注意 AON rail 需穿越断电区 - place_opt:工具会自动插 ISO/LS
- 检查 MV 单元数量:
report_qor
8.3 CTS 与 Routing 阶段
- CTS:确认 clock buffer 的
power_domain属性正确 - AON 信号保护:
psw_en/iso_en用set_dont_touch,防止普通 buffer 打断 - Routing:PG 严格按策略走,signal 可穿越 VA
- PG DRC:
check_pg_drc
8.4 Signoff 阶段
- MV 检查:
check_mv_design -verbose - PG 连通性:
check_pg_connectivity - IR-drop / EM:RedHawk / PrimeRail
- STA:按 PST 场景分析
- LEC:Formality with UPF + PST
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. 常见坑清单
| # | 坑 | 现象 | 对策 |
|---|---|---|---|
| 1 | UPF 没读进来 | report_qor 里 ISO/LS/ELS 全 0 | load_upf 后立刻 report_power_domains 确认 |
| 2 | 库电压与 UPF 不匹配 | 时序乐观,PT 与 ICC2 差异大 | 核对 report_scenarios 的 operating condition vs add_port_state |
| 3 | VA 边界未对齐 row | legalize 失败 / rail 断裂 | 边界取 row height × N,site width × M |
| 4 | 忘插 boundary cell | LVS well short / DRC spacing | create_boundary_cells + 留 guard band |
| 5 | ISO 放在发送侧 | 断电后仍传浮空值 | UPF 用 -location parent/fanout,ISO 由 AON 供电 |
| 6 | iso_en/psw_en 被普通 buffer 打断 | 断电后无法唤醒 | 用 AON buffer + set_dont_touch,铺 AON rail |
| 7 | VDDM_i 漏连 | LVS 过,但阵列中部 IR-drop 超标 | 逐颗 macro 列出所有 PG pin 核对 |
| 8 | SRAM 两路 VDD 短路 | LVS short / 功能失效 | check_pg_connectivity;0.8V 走高层不接 M1/M2 rail |
| 9 | switch 数量不足 | 虚拟电源 IR-drop 大,上电慢 | RedHawk/PrimeRail 迭代;IR-drop < 3% 标称 |
| 10 | EN 未做 daisy-chain | inrush current 拉垮 AON 电源 | 分段延时开通 |
| 11 | VA 内 CTS 用错库 | 时序不准,硅上失效 | 确认 clock buffer 的 power_domain 属性正确 |
| 12 | ECO 后未重跑 LEC | 逻辑改错未被发现 | 每轮 ECO 后跑 Formality(带 UPF + PST) |
11. 针对你这个 Block 的具体建议
- Leaf cell ≈ 80,512;Comb:Flop ≈ 10:1(逻辑深)
- Macro 7 颗,占 cell area 的 88%(587,027 / 666,827)
- MBFF banking 91%,但 BitsPerFlop 仅 1.85(平均 2-bit)
- ICG 434 个;Net YLength 是 XLength 的 2.55 倍
- UPF:2 domain、2 switch、dual-rail SRAM,无 retention
11.1 优先级排序的行动清单
| 优先 | 动作 | 原因 |
|---|---|---|
| 🥇 | 逐颗确认 7 颗 macro 的 PG pin 与 dual-rail 属性 | 88% 面积是 macro,PG 错了整个 block 报废。特别注意 VDDM/VDDM_i/VDD 的数量与位置 |
| 🥈 | 规划 VDDOFF_0P8V 跨 VA 到 SRAM 的走线 | 这是本设计最大 PG 难点,必须在 floorplan 阶段定,不能等 PG 阶段再想 |
| 🥉 | 确认 pcut0P8V 的面积并划 VA | 用 get_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 |
| 6 | Y 向线长 2.55× 的原因分析 | 若 die 非竖长形,说明 macro 阵列堵死水平通道。用 Dataflow 分析重排 macro |
| 7 | AON rail 规划 | psw_en/iso_en 要送到分布全芯片的 switch/ISO,需专用 AON mesh |
| 8 | 评估 MBFF 升级到 4-bit | BitsPerFlop 1.85 偏低,若时钟功耗是目标可重新 banking;若 congestion 严重则反向 debank |
11.2 无 Retention 的连带影响
- ✅ 好处:不需要 AON rail 走到每个 FF,PG 简单很多;面积省
- ❌ 代价:
chip_off_mode唤醒后所有状态丢失,需完整 reset + 软件重新初始化 → 唤醒延迟大 - ⚠️ 需确认:系统架构是否接受这个唤醒时间。若不接受,前端需加 retention,那 PG 方案要大改
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
🔹 三句话记住
- PD 说「这群人是一个部门」,VA 说「这个部门坐在 3 楼东区」。
- 电压不同 → 必须不同 domain → 必须独立 VA + 独立 PG + LS。
- 可否断电不同 → 也是不同 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_0P8V,VDDOFF_0P65V |
| Supply Set | set_AON_0P8V / set_AON_0P65V / set_POFF_0P8V / set_POFF_0P65V |
| Domain | PD_POFF(0.65V 主体)、PD_POFF_0P8V(pcut0P8V) |
| Switch | SW_CHIP_0P65V、SW_CHIP_0P8V,共用 dlink_global_psw_en(低有效) |
| LS | LS_AON_OP8,low_to_high,force_shift,作用于 psw_en/iso_en |
| PST | active_mode={ON ON ON ON GND};chip_off_mode={ON ON OFF OFF GND} |
| Dual-rail SRAM | VDDM/VDDM_i→VDDOFF_0P8V;VDD→VDDOFF_0P65V |
本文档基于所提供 UPF 片段分析生成。
具体命令选项在不同 ICC2 版本可能存在差异,执行前请以 man <command> 为准。