跳轉到

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 兩者都要),必須把「電源意圖」從口頭約定變成機器可讀的檔案:
\[ \text{省電收益} = \underbrace{\text{clock gating}}_{\alpha \to 0} + \underbrace{\text{power gating}}_{I_{leak} \to 0} + \underbrace{\text{DVFS}}_{V^2 f \downarrow} \]
  • 標準化競賽:Si2 於 2005 年推出 CPF(Common Power Format),Accellera 於 2007 年推出 UPF(Unified Power Format);2009 年 UPF 被收編為 IEEE 1801 標準,power intent 從此成為流程標配。

線索與推理 -- 數學式、程式、理論#

1. 案件現場:CMOS 功耗的兩個兇手#

\[ P_{\text{total}} = \underbrace{\alpha\, C\, V_{dd}^2\, f}_{\text{動態(開關)}} + \underbrace{V_{dd}\, I_{\text{leak}}}_{\text{靜態(漏電)}} \]
  • 動態功耗:對負載電容 \(C\) 充放電, \(\alpha\) 是開關活動率。clock gating 直接把 \(\alpha\) 歸零。
  • 漏電功耗: \(I_{\text{leak}}\) 主要是次臨界漏電:
\[ I_{\text{sub}} \propto \frac{W}{L}\, V_{th}^2\, e^{-V_{th}/(n kT/q)} \]

\(V_{th}\) (臨界電壓)每降 100mV,漏電約升 10 倍——這是 multi- \(V_t\) cell 的物理根源:高速路徑用 low- \(V_t\) (快但漏),其他用 high- \(V_t\) (慢但省)。

2. Clock Gating:省動態#

閒置模組關時脈,時脈樹上的 flop 不再翻轉, \(\alpha \to 0\) :

\[ \frac{P_{\text{gated}}}{P_{\text{orig}}} = \frac{\alpha_{\text{active}}}{\alpha_{\text{active}} + \alpha_{\text{idle}}} \]
  • 細粒度:RTL 層的手動 gating(if (enable) 包住 flop)→ 綜合工具自動插入 ICG(integrated clock gating cell)。
  • 局限:只省動態;漏電照燒,且時脈樹本身有開銷。

3. Power Gating:省漏電與 Power Domain#

把整個模組的電源切掉,漏電歸零。但斷電前後有陷阱,需要三件輔助硬體:

  1. Switch(電源開關):高側(PMOS)或低側(NMOS)開關,串在 virtual \(V_{dd}\) 與真實 \(V_{dd}\) 之間;開啟時湧浪電流(rush current)要限流。
  2. Isolation cell(隔離單元):斷電域的輸出在斷電時是 X(未知),會污染還活著的鄰居——隔離 cell 在斷電時把輸出夾到 0 或 1。
  3. 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})\) :

\[ \frac{P_{\text{new}}}{P_{\text{old}}} = \left(\frac{V_{\text{new}}}{V_{\text{old}}}\right)^2 \cdot \frac{f_{\text{new}}}{f_{\text{old}}} \]

DVFS 能耗最佳化:給定 workload 需求(多少 cycle 的工作)與時限 \(T\) ,從候選 \((V, f)\) 點中選配,最小化總能耗:

\[ E = \sum_i P_i \cdot t_i = \sum_i \alpha C V_i^2 f_i \cdot t_i, \quad \text{s.t.} \quad \sum_i f_i t_i \ge \text{workload},\ \sum_i t_i \le T \]

由於 \(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 白皮書。