瓦特究竟跑到哪裡去了
在第 1 階,我們把晶片的功耗帳單拆成兩堆:動態功耗,只有訊號在動時才燃燒;以及漏電,即使晶片完全靜止也照樣燃燒。動態功耗是個性鮮明的那一個——重度運算時它怒吼而起,工作停止時它便安靜下來。要理解它,把單一個 CMOS 反相器想像成一個小小的翹翹板水桶:當輸出由 0 升到 V,PMOS 網路從電源軌舀起一包電荷,倒進閘極所驅動的任何東西。當輸出落回 0,同一包電荷便傾入接地。這個水桶就是負載電容;裝滿它、再倒空它的動作,正是能量流失之處。
這裡有個優雅、卻又有點惱人的地方:你把閘極翻得多快或多慢都無所謂,轉態是什麼形狀也無所謂。從理想電源把電容 C 充到電壓 V,永遠正好從電源軌花掉 C·V² 焦耳——其中正好一半,½·C·V²,被儲存在電容上,另一半則在 PMOS 通道電阻中化為熱燃燒掉。回程往下時,那儲存的一半又透過 NMOS 傾洩掉。所以一次完整的來回——低→高→低——乾淨俐落地耗散掉 C·V²。這一個事實,就是整個動態功耗公式生長的種子。
Vdd Vdd
| |
[PMOS] <- pulls UP [PMOS] off
| scoops C·V from |
in ----+---- out --> C_load rail (½ stored, out stays
| ____ ½ heat in P) high
[NMOS] | |
| __| |__
GND 0 V (output rising)
Energy from supply per RISE : C·V² (½ to cap, ½ to heat)
Energy dumped on the FALL : ½·C·V² (the stored half -> GND)
Energy per FULL round trip : C·V²組裝 P = α·C·V²·f
每次來回的能量是 C·V²。功率是每秒的能量,所以我們只需數出整顆晶片每秒發生幾次來回。兩個數字就辦得到。時脈定下節奏:它每秒滴答 f 次,而這滴答正是每個正反器與管線級隨之起舞的節拍器。但問題來了——不是每個節點在每次滴答都會翻轉。一條一再傳送數字 5 的資料匯流排根本不切換;一個傳送隨機雜訊的節點則幾乎每個週期都切換。一個平均節點在多大比例的時脈週期中完成一次完整轉態,就是它的活動因子 α——一個介於 0 與 1 之間的無因次數字。
把它們全部相乘,你就得到每個低功耗工程師睡夢中都能背出的方程式——動態功耗的定義:
P_dyn = α · C · V² · f
─ ─ ── ─
│ │ │ └─ clock frequency (Hz) — the metronome
│ │ └────── supply voltage (V) — squared! the big lever
│ └─────────── switched capacitance (F) — wires + gate loads
└─────────────── activity factor (0..1) — how often nodes flip
Units check: [1] · [F] · [V²] · [1/s]
= (C/V) · V² · (1/s) (since 1 F = 1 C/V)
= C·V/s = J/s = W ✓四個旋鈕,四種脾氣
這個公式是相乘的,而這正是它最重要的地方:每個旋鈕都是功耗上*直接、線性*的槓桿——除了一個,它是平方的。讓我們按「轉動的難度」與「回報的多寡」依序走一遍。
- 活動率 α——擠掉浪費的翻轉。 這是設計師的遊樂場,因為它幾乎免費。把沒在讀的暫存器檔做時脈閘控,它的 α 就掉到趨近零。採用某種匯流排編碼(例如位址計數器用格雷碼),讓相鄰值翻轉更少位元。別重算沒變的東西。運算元隔離可阻止一個閒置乘法器的輸入亂晃、為沒人要的輸出白白燒電。整顆晶片的 α 典型落在 0.1–0.2 左右——意思是多數節點在多數週期都安靜,而訣竅就在於讓它們維持安靜。
- 電容 C——縮短導線、縮小負載。 C 是你所驅動的閘極輸入電容,加上承載訊號的金屬互連電容之總和。橫越晶片的又長又寬的導線,其電容可遠遠蓋過它們所連接的閘極負載。所以平面規劃很要緊:把話多的區塊擺在一起,讓高活動的網線保持短,別把粗大的時脈或資料線拉得比必要還遠。緩衝器尺寸是門平衡藝術——較大的緩衝器驅動負載更快,但它本身對前一級而言又是更大的 C。
- 電壓 V——那個平方項、那個成王者。 因為功耗隨 V² 變化,小小一刀電壓砍下去,就換來大大一筆功耗勝利。這是整個領域為之著迷的槓桿,它值得下面專屬一節。問題在於:降低 V 也會拖慢每個閘極,所以你不能毫無代價地說轉就轉。
- 頻率 f——線性,且很少免費。 把時脈砍半,動態功耗也砍半——但它同時把吞吐量砍半,所以單獨來看它只是把效能與功耗一比一對換,對「每件工作的能量」毫無改變。它真正的威力,只在你把它和電壓*一起*轉動時才顯現,而這正是 DVFS 背後的整個構想。
為何 V² 是人人都伸手去抓的槓桿
線性旋鈕,你投入多少就還你多少:把 C 砍半,功耗就砍半。但那個平方項慷慨得幾乎不公平。把供應電壓降為原本的二分之一,動態功耗不是減半——而是掉到四分之一。讓我們對一個具體區塊算一遍,讓這份魔法變成尋常的工程。
A digital block: C = 5 nF (total switched), α = 0.15, f = 1 GHz
At V = 1.0 V :
P = α·C·V²·f
= 0.15 × 5e-9 × (1.0)² × 1e9
= 0.75 W
At V = 0.5 V (same C, same α, same f):
P = 0.15 × 5e-9 × (0.5)² × 1e9
= 0.15 × 5e-9 × 0.25 × 1e9
= 0.1875 W <-- exactly 1/4 of 0.75 W
Voltage ÷2 -> Power ÷4
Voltage ÷3 -> Power ÷9
Voltage ×0.8 -> Power ×0.64 (a modest 20% V cut -> 36% power saved)那我們為何不讓每顆晶片都跑在細若游絲的電壓?因為電壓與速度是連體的。較低的 V 意味著每個電晶體更虛弱地為負載充電,於是閘極切換更慢,最高安全時脈頻率隨之下降。把 V 推得太靠近電晶體的閾值,電路就變得遲鈍且易受雜訊干擾;低於閾值,邏輯便完全停擺。所以電壓調降從不免費——它總是拿速度換功耗,而工程師的工作,就是電壓只花到所需效能剛好要求的那麼多,一毫伏都不多給。
短路功耗:那個次要的手足
α·C·V²·f 這一項捕捉的是負載的充放電——但動態家族裡還藏著第二位、較小的成員,就躲在轉態本身之中。在真實的 CMOS 閘極裡,輸入並非瞬間從 0 跳到 V;它是斜坡上升的。在那斜坡中段一閃即逝的縫隙裡,PMOS 上拉與 NMOS 下拉*兩者*同時都部分導通,打開一條從電源直通接地的瞬時導電路徑。電流竄過——不為充任何有用的東西,只是一記快速的短路——這就是短路功耗。
input edge: ___________
/
Vdd ------/----------------
____/ both devices
V_th(n) ---/----+ partly ON here
/ | <-- short-circuit
V_th(p)--/---+ | current spike
/ | | (supply -> GND)
0 __/_____|__|________________
|<-->| t_sc
Short-circuit energy ~ rises with INPUT slew (slow edges = wider t_sc)
Keep edges crisp -> shrink t_sc -> shrink P_short-circuit在設計良好的晶片裡,短路功耗通常很小——約莫是切換功耗的 5–10%,有時更少——所以工程師往往悄悄把它折進 α·C·V²·f 的預算裡,而不另行追蹤。讓它變大的元凶是緩慢的輸入邊緣:輸入斜坡爬得越遲緩,兩個元件重疊越久,短路窗口就越寬。這是把緩衝器尺寸調好、讓轉態保持俐落的一個低調額外理由——馬虎的轉態率不只傷時序,還會滲漏功耗。要注意,短路功耗和切換功耗一樣,在訊號停止移動的瞬間便消失;兩者都是動態的。*不會*消失的——那道即使流過閒置、完全靜止閘極也涓涓不止的電流——是漏電,一頭截然不同的野獸,本軌道稍後才會收拾它。
所有槓桿中最便宜的那一個
退一步,把整條方程式看作一個整體——P = α·C·V²·f——然後問一個調皮的問題:對動態功耗而言,*單一最有效*的事是什麼?不是去削某個旋鈕。是乘以零。除了 C 以外的每一項,你都能在晶片上某個此刻沒在做有用工作的區域,把它逼到零。停掉一個區塊的時脈(f → 0),它的切換功耗便瞬間消失,沒有電荷被浪費,沒有運算被丟失——因為那區塊本來就沒東西要算。
這正是時脈閘控背後的洞見,也是任何現代動態功耗預算上最便宜、部署最廣的省電技巧。光是時脈網路就可占晶片動態功耗的 20–40%——它是那條*每一個週期、每一處*都翻轉的網線——所以讓閒置邏輯的時脈噤聲、並把餵養它的那些正反器本身閘控掉,便是幾近零成本下的巨大槓桿。免費地把一整個區域的 α 設為零,勝過你在同一區塊還在滴答時所能做的每一毫伏精打細算的電壓調降。