2000s - 低功耗設計:Power Intent 與手機時代的電池保衛戰#
案件摘要#
2000 年代,手機讓功耗從「次要指標」變成「第一約束」:電池容量只成長 1.2 倍,晶片功能卻翻了 10 倍。 製程微縮進入 45nm 後漏電流爆衝,傳統「只管動態功耗」的方法失效。 工程師必須在 RTL 之外再寫一份「電源意圖」(power intent):power gating、DVFS、multi-voltage domain、UPF/CPF——EDA 工具從此學會讀懂電壓。
前因 -- 為什麼會有這個案子#
- 手機時代驅動:2000 年代功能機到智慧機,待機時間是賣點;晶片若不省電,再強的 CPU 也賣不掉。行動 SoC(聯發科、高通)把功耗設計推到最前線。
- 漏電爆衝(45nm 後):CMOS 微縮後閘極氧化層變薄、通道變短,次臨界漏電與閘極漏電隨溫度指數上升。漏電在待機時也在燒電池——關掉時脈已經不夠,必須關掉電源。
- Dennard scaling 破功:1960s–2000s 初,微縮同時降電壓、升頻率、功耗密度不變(Dennard)。90nm/65nm 後電壓降不下去( \(V_{dd}\) 卡在 1V 附近),功耗密度失控,催生低功耗設計方法學。
- 關鍵推理:不同模組的省電手段不同(省動態 vs 省漏電 vs 兩者都要),必須把「電源意圖」從口頭約定變成機器可讀的檔案:
- 標準化競賽:Si2 於 2005 年推出 CPF(Common Power Format),Accellera 於 2007 年推出 UPF(Unified Power Format);2009 年 UPF 被收編為 IEEE 1801 標準,power intent 從此成為流程標配。
線索與推理 -- 數學式、程式、理論#
1. 案件現場:CMOS 功耗的兩個兇手#
- 動態功耗:對負載電容 \(C\) 充放電, \(\alpha\) 是開關活動率。clock gating 直接把 \(\alpha\) 歸零。
- 漏電功耗: \(I_{\text{leak}}\) 主要是次臨界漏電:
\(V_{th}\) (臨界電壓)每降 100mV,漏電約升 10 倍——這是 multi- \(V_t\) cell 的物理根源:高速路徑用 low- \(V_t\) (快但漏),其他用 high- \(V_t\) (慢但省)。
2. Clock Gating:省動態#
閒置模組關時脈,時脈樹上的 flop 不再翻轉, \(\alpha \to 0\) :
- 細粒度:RTL 層的手動 gating(
if (enable)包住 flop)→ 綜合工具自動插入 ICG(integrated clock gating cell)。 - 局限:只省動態;漏電照燒,且時脈樹本身有開銷。
3. Power Gating:省漏電與 Power Domain#
把整個模組的電源切掉,漏電歸零。但斷電前後有陷阱,需要三件輔助硬體:
- Switch(電源開關):高側(PMOS)或低側(NMOS)開關,串在 virtual \(V_{dd}\) 與真實 \(V_{dd}\) 之間;開啟時湧浪電流(rush current)要限流。
- Isolation cell(隔離單元):斷電域的輸出在斷電時是 X(未知),會污染還活著的鄰居——隔離 cell 在斷電時把輸出夾到 0 或 1。
- Retention register(保持暫存器):斷電時用備用電源(always-on rail)保留關鍵狀態,恢復時快速續跑,不必重新初始化。
Power domain(電源域):把晶片切成多個 \(V_{dd}\) 區(CPU domain、GPU domain、always-on domain),各域可獨立斷電/降壓。
4. DVFS:電壓頻率調節的平方收益#
降壓降頻,由 \(P \propto V^2 f\) 且 \(f\) 大致正比於 \((V - V_{th})\) :
DVFS 能耗最佳化:給定 workload 需求(多少 cycle 的工作)與時限 \(T\) ,從候選 \((V, f)\) 點中選配,最小化總能耗:
由於 \(P \propto V^2 f\) 、 \(E \propto V^2 \cdot \text{workload}\) (workload 固定時與 \(f\) 無關),最佳策略是:在不違反時限的前提下,儘量用最低電壓慢慢跑(Energy ∝ V²,時間越長省越多——這就是「Race to Idle」vs「Slow and Steady」的取捨)。能耗對 \(V\) 是凸函數,凸最佳化保證全域最優。
5. Python 實作:DVFS 能耗最佳化#
import math
def energy_of(workload, v_f, cap_nF, alpha=0.5):
"""workload: 總 cycle 數;v_f: [(V, f_MHz)] 候選點;回傳 (總能耗mJ, 配置)"""
cap = cap_nF * 1e-9 # nF → F
T_deadline = 10e-3 # 10ms 時限
# 貪婪:時限內儘量用最低電壓(能耗 ∝ V²),但預留時間讓剩餘工作趕得上時限
plan, budget, remaining = [], 0.0, workload
f_max = max(f for _, f in v_f) * 1e6 # 最快頻率(cycles/s)
for V, f in sorted(v_f, key=lambda x: x[0]): # 電壓由低到高
c = f * 1e6 # 此點速度(cycles/s)
t_room = T_deadline - budget # 時限還剩多少
t_needed = remaining / c # 全用此點所需時間
t_reserve = (f_max * t_room - remaining) / (f_max - c) if f_max > c else t_room
t_use = min(t_needed, t_room, max(t_reserve, 0))
if t_use <= 0: continue
P = alpha * cap * V**2 * f * 1e6 # W(f MHz→Hz)
plan.append((V, f, t_use*1e3, P*1e3)) # ms, mW
budget += t_use; remaining -= c * t_use
if remaining <= 0: break
E = sum(alpha*cap*V**2*f*1e6 * (t/1e3) for V, f, t, _ in plan) # J
return E*1e3, plan # mJ
v_f = [(0.8, 100), (1.0, 300), (1.2, 600)] # 候選電壓頻率點
workload = 2_000_000 # 2M cycles
E, plan = energy_of(workload, v_f, cap_nF=20)
print(f"總能耗 = {E:.3f} mJ,時限 10ms 內")
for V, f, t, P in plan:
print(f" {V:.1f}V/{f:3d}MHz:跑 {t:6.2f} ms,{P:7.2f} mW")
# 0.8V/100MHz 太慢(10ms 只能跑 1M cycles),會誤了時限
# → 先用 0.8V 跑 8ms(0.8M cycles),剩餘 1.2M cycles 用 1.2V/600MHz 跑 2ms 補完
# 若直接全速 1.2V/600MHz:P ≈ 0.5*20nF*1.44*600MHz = 8.64 W,跑 3.3ms
# 能耗 ≈ 8.64*3.3ms ≈ 28.8 mJ;最佳化後 ≈ 22.4 mJ,省約 22%
# 若時限放寬到 20ms,可全程 0.8V:能耗 = 12.8 mJ,省 2.25 倍
def clock_gating_saving(alpha_active, alpha_idle):
return 1 - alpha_active / (alpha_active + alpha_idle)
print(f"clock gating 省電比(act=0.3, idle=0.7)= {clock_gating_saving(0.3,0.7):.0%}")
# 省電比 = 70%(被關掉的活動率)
6. UPF 程式碼示範:Power Intent 檔案#
# UPF (IEEE 1801) 檔案:描述電源意圖,EDA 工具讀取後做 power-aware synthesis/verification
create_power_domain TOP -include_scope
create_power_domain CPU -elements {u_cpu}
create_power_domain GPU -elements {u_gpu}
create_power_domain ALWAYS_ON -elements {u_aon}
# 電源網路:主電源與開關後的虛擬電源
create_supply_port VDD -domain TOP
create_supply_net VDD -domain TOP
create_supply_net VDD_GPU_SW -domain GPU # power gating 後的 virtual rail
set_domain_supply_net TOP -supply {primary VDD}
# Power gating:GPU 域可斷電,開關由 ALWAYS_ON 域控制
create_power_switch gpu_sw -domain GPU \
-input_supply_port {vin VDD} \
-output_supply_port {vout VDD_GPU_SW} \
-control_port {sw_ctrl u_aon/gpu_on} \
-on_state {on vin {sw_ctrl}}
# Isolation cell:GPU 斷電時,輸出夾到 0,保護還活著的鄰居
set_isolation gpu_iso -domain GPU \
-isolation_power_net VDD \
-isolation_ground_net VSS \
-clamp_value 0 \
-applies_to outputs
# Retention register:斷電時用 always-on 電源保留 CPU 狀態
set_retention cpu_ret -domain CPU \
-retention_power_net VDD \
-retention_ground_net VSS \
-elements {u_cpu/reg_*}
add_power_state CPU -state {OFF -supply_expr {power == `{OFF, OFF}}} \
-state {ON -supply_expr {power == `{FULL_ON, FULL_ON}}}
# EDA 工具(Synopsys DC/Fusion Compiler、Cadence Genus、Siemens)讀 UPF:
# synthesis → 自動插入 switch/isolation/retention cell
# simulation → power-aware 仿真,檢查斷電時 X 傳播
# STA → multi-voltage 時序分析(跨壓域要 level shifter)
結案 -- 後果與影響#
- 行動/物聯網晶片必需:手機、穿戴、IoT 晶片若沒有 power intent 流程,電池壽命無法達標;power gating + DVFS 成為行動 SoC 標配。
- IEEE 1801 標準確立:UPF(2007 Accellera → 2009 IEEE 1801)勝出成為業界主流,CPF 逐漸退場;power intent 檔案與 RTL 一起進版控、一起 signoff。
- power-aware flow 成為 EDA 必備:合成(插入 switch/isolation/retention)、仿真(X 傳播檢查)、STA(multi-voltage)全流程支援 UPF——EDA 三強的工具線全部改寫。
- 7nm 後 power 是第一約束:Dennard scaling 終結後,先進製程的 PPA 三角中 Power 常排第一;架構級省電(near-threshold computing、DVFS scheduler)與電路級省電(multi- \(V_t\) 、finFET 漏電控制)持續演化。
- 理論延續:能耗最佳化的凸性分析、power domain 分割演算法、rush current 管理,源頭都在 2000s 這場電池保衛戰。
關鍵人物與文獻#
- Si2(2005):CPF(Common Power Format)首創 power intent 檔案格式。
- Accellera(2007)→ IEEE 1801(2009):UPF 標準化,power intent 成為國際標準。
- A. Chandrakasan、R. Brodersen:Low Power CMOS Design 與 \(P = CV^2 f\) 理論奠基(1995)。
- D. Markovic、B. Nikolic、R. Brodersen:Power and area minimization in near-threshold computing(2000s 後期 near-threshold 先驅)。
- IEEE 1801-2018: Standard for Design and Verification of Low Power Integrated Circuits(UPF 3.0)。
- Synopsys、Cadence、Siemens EDA 的 UPF 使用手冊與 low-power design flow 白皮書。