JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

電源完整性與低功耗

一顆晶片可能通過了每一項時序檢查,卻在你給它上電的那一刻就掛掉——因為沒人確認過是否真有足夠乾淨的電流能抵達電晶體,也沒人確認承載電流的金屬線能不能撐過它本該運作的那些年。電源是一項獨立的簽核(signoff),有自己的通過/不通過關卡。本指南走一遍這項簽核的四件事——送進足夠的電流、別讓電壓塌陷、別讓金屬線磨損報廢、別燒掉超過你所需的功耗——最後再介紹那些把瓦數省回來的低功耗手法(時脈閘控、電源閘控、multi-Vt、DVFS、UPF)。

電源是一等公民級的簽核

到目前為止,你已經看著一個設計走過了 佈局繞線、在每一個 製程角 上收斂了 時序,並通過了 DRCLVS。你很容易以為最難的部分已經過去了。但一顆邏輯上完美、時序上乾淨的晶片,仍然可能一上電就報廢——因為沒人檢查過是否真有足夠乾淨的電流能抵達所有那些電晶體,也沒人檢查承載電流的金屬能不能撐過它本該運作的那些年。

標誌一名後端工程師的思維轉變正在於此:電源不是你到最後順手收拾的副產物——它本身就是一項簽核,有自己的通過/不通過關卡,與時序和實體驗證並行進行。把你的晶片想成一座城市。時序簽核問的是交通能不能準時到達每個地方;而電源簽核問的是供電公司的那些問題:發電廠夠不夠大?變電站在負載下會不會塌陷?電纜會不會過熱失效?整個電網是不是在浪費根本不必要的電?

電源傳輸網路

晶片上的每個電晶體都需要被餵兩樣東西:一個穩定的供電電壓(叫它 VDD)和一條回到地的路徑(VSS)。把電流從封裝接腳送進來、向下穿過各層 金屬層、再送進每一個 標準單元 的那套「管路」,就是 電源傳輸網路,即 PDN。說白了,它就是你這顆晶片的供電電網。

把它想像成一套層層分級的供水主管網,跟城市裡的一模一樣。最粗的管道——鋪在最頂層、最厚的金屬層上的寬金屬條(strap)——把電流從封裝引進來。它們供給一張用導孔(via)縫合起來的、規則縱橫交錯的電源網格(power grid,或稱 power mesh)。這張網格逐層向下貫穿整個金屬疊層,直到在最底層,細細的電源軌(power rail)就沿著一排排標準單元鋪過去,逐一接到每個單元的 VDD 和 VSS 接腳。頂上是粗幹管,底下是細微血管——和動脈一路分叉成微血管是同一個形狀。

這正是為什麼 PDN 要最先搭建,在任何一根訊號線被繞線之前就織進 樓層規劃(floorplan) 裡。電網會提前在高層金屬上圈下自己的地盤;訊號 繞線 之後再從剩下的空間裡穿行。電網建得太薄,邏輯就會「吃不飽」;建得太厚,你就白白燒掉了繞線軌道、平白加重了 壅塞。給 PDN 定尺寸,是你要做的第一個真正的功耗權衡。

IR drop:電壓塌陷

PDN 的金屬線是極好的導體,但並不完美——每一根金屬條、每一個導孔、每一根電源軌都帶有那麼一點點電阻。而這裡有一條躲不掉的鐵律:電流 I 一旦流過電阻 R,這段電阻兩端的電壓就會下降 I 乘以 R。所以等 VDD 從封裝接腳出發、穿過電網、一路降到埋在晶片正中央的某個單元時,它抵達時已經比出發時了一點。這個塌陷就叫 IR drop

V_drop = I * R          // voltage lost across PDN resistance
V_cell = VDD_pin - V_drop   // what the cell actually sees
// Example: 0.10 A through 50 milliohm of PDN = 5 mV sag
//          on a 0.75 V supply, that's a 0.7% droop
歐姆定律,電源完整性裡最重要的一條方程式。電阻由你畫下的金屬決定、是固定的;電流則隨活動而起伏——所以最嚴重的塌陷發生在一個大模組同時翻轉的那一刻。

區區幾毫伏為什麼要緊?因為電晶體在電壓更低時翻轉得更慢——給一個閘更少的 VDD,它翻轉就要花更長時間。於是 IR drop 悄悄地把塌陷區域裡每一個閘的延遲都拉長了,而你在標稱電壓下精心收斂好的時序,等真實的、已經塌陷的電壓一出現,就可能突然失敗。這正是回扣上一篇指南的深層聯繫:IR drop 和 時序 是同一個問題戴著兩頂帽子。現代簽核是電壓感知(voltage-aware)的——時序引擎會被告知每個單元處實際塌陷後的電壓,這樣兩項檢查的結論才一致。

它有兩種形態。靜態 IR drop 是平均電流造成的穩態塌陷——靠更粗壯的電網或更多封裝接腳來解決。動態 IR drop 才是難纏的那種:當一大片邏輯在同一個時脈緣上一起翻轉、從電網裡猛地抽走一個電流尖峰時出現的瞬態下陷。經典的解法是去耦電容(decoupling capacitance,decap)——在「嘴饞」的邏輯附近撒下的一些小蓄水池電容,在尖峰來臨的那一瞬間就地把電荷倒出來,就像水塔在主管網趕上來之前先把早尖峰的用水削平。

電遷移:金屬線會磨損報廢

這是一種和邏輯毫無關係、卻和時間累積出來的物理效應息息相關的失效模式。往一根細金屬線裡灌進足夠多的電流,流動的電子就真的會開始把金屬原子一顆顆往下游撞,就像河流慢慢把礫石沿著河床往下拖一樣。日積月累、年復一年,原子在某些地方堆積、在另一些地方變稀,直到金屬線長出一個空洞而斷路(open)——或者長出一根金屬鬚搭到鄰線上而短路(short)。這種緩慢的侵蝕就是 電遷移,即 EM,它正是為什麼一顆晶片第一天能通過所有測試,卻在現場用了兩年後失效。

關鍵的直覺是:EM 由電流密度驅動——也就是塞進一個極小截面裡的安培數——而不是電流的絕對大小。同樣大小的電流,穿過一根髮絲般細的線,要比穿過一根寬金屬條危險得多,因為電子被擠得更密。這正是為什麼 EM 咬得最狠的地方恰恰是電流最集中之處:PDN 的金屬條、電源導孔,以及時脈網路——它們都承載著沉重而無休止的電流。

EM 簽核會給每一根金屬線設一個電流密度上限——這是製造廠給出的規則,規定某個金屬寬度在工作溫度下、在晶片額定壽命內能安全承載多大的電流(晶片跑得越熱,EM 加速得越快)。工具會標出任何超限的線,而你透過加寬這根線、把電流分攤到並聯的多條路徑上、或者多打幾個導孔(這樣就沒有哪一個導孔被過載)來修掉這個違例。這是規模龐大到驚人的「記帳」活——但只要你跳過它,你交付的就是一顆帶著保存期限的晶片。

功耗都花在了哪裡(動態 vs 漏電)

把電送進去只是故事的一半。另一半是別浪費它——晶片燒掉的每一瓦,都會變成你必須排掉的熱、必須耗掉的電池。要把功耗花得明智,你得先知道它都去了哪裡,而在一顆 CMOS 晶片裡,它分成兩個非常不同的大類。

第一類是動態功耗(dynamic power)——這是真正*做事*的代價,每當一個訊號翻轉、對一根線上那點小小的電容充電或放電時就被燒掉。它遵循晶片設計裡最常被引用的公式之一:

P_dynamic = alpha * C * V^2 * f
// alpha = activity factor (fraction of nodes switching per cycle)
// C     = capacitance being switched
// V     = supply voltage
// f     = clock frequency
把它讀成四個旋鈕。注意 V 是**平方**的——把電壓減半,動態功耗就降到四分之一,這就是為什麼電壓是你手上最有力的那根槓桿。alpha 是時脈閘控所攻擊的目標;而 f 和 V 是 DVFS 往下調的兩個量。

第二大類是漏電(靜態)功耗(leakage / static power)——即便什麼都沒在翻轉,電流仍會涓涓地從電晶體裡滲漏出去。現代電晶體是個並不完美的開關;「關斷」狀態下它還是會漏掉一點點,而在數十億個電晶體上累加起來,這點涓流就匯成一筆實實在在、始終在線的稅,只要電路通著電,無論它閒不閒,你都得繳。和動態功耗不同,漏電根本不在乎你的時脈——只要這個模組還帶著電壓,它就 7×24 小時不停地流。

時脈閘控與電源閘控

先從最便宜、最通用的那筆收益開始:時脈閘控時脈本身是晶片上最忙、最耗電的那根網線——它每一個週期、在每一個地方都翻轉,而每一次翻轉都在給電容充電、燒掉動態功耗。但其中很大一部分翻轉是毫無意義的:一個暫存器明明這個週期裡值不會變,卻照樣被時脈驅動、翻轉了自己的內部節點、白白燒掉功耗卻沒幹一件有用的事。

時脈閘控的想法極其簡單:如果一個模組這個週期沒活幹,就別給它送時脈緣。一個小小的閘擋在暫存器的時脈前面,把它關掉——就像把空房間的燈關掉,而不是整晚點亮整棟樓。沒有時脈緣就沒有翻轉,沒有翻轉就沒有動態功耗,而又因為它打的是最忙的那根網線,省下來的量很大、又幾乎不花成本。合成工具會自動插入它,但寫出*能讓*閘控生效的 RTL(給你的暫存器配上乾淨的致能訊號)則是你要慢慢練就的本事。

電源閘控是更重的那把錘子,它瞄準的是*另一個*大類——漏電。它不只是暫停時脈,而是把供電電壓從一個要閒置一段時間的整塊邏輯上切掉,做法是在它的 VDD 上串聯一個大大的休眠電晶體(sleep transistor,又稱電源開關 power switch)。沒有電壓就沒有漏電——你是把城市的那一片直接拔掉了電源插頭,而不只是把燈調暗。

Multi-Vt、DVFS 與 UPF(先瞥一眼)

還有三根槓桿把這套低功耗工具箱補齊。第一根就藏在標準單元自己內部:multi-Vt(多閾值電壓)。同一個邏輯閘會提供好幾種閾值電壓不同的「口味」——低 Vt(low-Vt)單元快,但漏電很多;高 Vt(high-Vt)單元慢,但幾乎不怎麼漏電。工具把這一點用得漂亮:只在真正需要速度的 關鍵路徑 上用那些又快又漏的單元,其餘有 時序裕量(slack) 富餘的地方,統統換上摳門的高 Vt 單元。功能一模一樣,漏電卻只剩零頭——只不過是逐個閘挑對了口味而已。

第二根是 DVFS——動態電壓頻率調節(dynamic voltage and frequency scaling)。還記得動態功耗公式裡那個 V 的平方嗎?DVFS 把它用到了極致:當一個模組不需要全速時,就把它的時脈頻率*和*電壓一起往下調。把電壓減半,動態功耗大約降到四分之一——這是一筆巨大的收益——這也正是為什麼你在看東西時,手機會讓它的核心又慢又涼地跑,只有當你啟動一個遊戲時,才把電壓和時脈一起拉上去。

# UPF (Unified Power Format) — power intent, kept SEPARATE from the RTL
create_power_domain PD_CPU  -elements {cpu_core}
create_supply_net   VDD_CPU -domain PD_CPU
# a switchable supply: this domain can be powered down
create_power_switch  sw_cpu -domain PD_CPU \
    -input_supply_port  {vin VDD}  -output_supply_port {vout VDD_CPU} \
    -control_port {sleep cpu_sleep}
UPF 描述的是電源**意圖(intent)**——電源域、可切換供電、隔離、保持——它寫在一個與 RTL 並列的檔案裡,而不是埋進 RTL 之中。同一份 Verilog 只要換一份 UPF,就能面向不同的電源架構。

剛才那段程式碼已經透露了第三塊拼圖:一旦有了多個電壓域、可切換供電、隔離和保持,電源架構就複雜到沒法靠手工去追蹤了。於是這份意圖被放進一個單獨的檔案裡——UPF(Unified Power Format,統一電源格式),一項 IEEE 標準。UPF 給各個電源域命名、說明哪些可以被關斷、以及隔離和保持單元該放在哪裡。流程裡的每一個工具——合成、佈局繞線、驗證、簽核——讀的都是*同一份* UPF,於是電源意圖從 RTL 一路到 流片(tapeout) 都保持一致。它就是電源的唯一可信來源(single source of truth),正如網表之於邏輯。