晶片模擬:為什麼 SPICE 跑一個電路要三天
SPICE 的分析模式很多,常見的有:
DC Sweep:掃描某個電壓或電流源,看輸出如何變化。
AC Analysis:小訊號頻率響應,把電路線性化後在頻域求解。
其中,瞬態分析是绝大多数「跑三天」案例的元兇。原因很簡單:它必須把時間切成無數個小步,每一步都要解一次非線性方程組,而且每一步的解都依賴前一步。這是一種本質上串列的計算流程,沒辦法像渲染影片那樣輕鬆平行化。
二、時間不是花在「計算」,而是花在「等待收斂」
很多人以為 SPICE 慢,是因為「運算量太大」。這句話只對了一半。實際上,模擬工程師最常看到的畫面不是 CPU 滿載,而是模擬器卡在某一個時間點,反覆印出「convergence failed」,然後自動縮小時間步長再試一次。
2.1 牛頓-拉弗森迭代與收斂問題
電晶體是非線性元件,所以 SPICE 不能一次解完,必須用迭代法。最經典的是牛頓-拉弗森法(Newton-Raphson):先猜一組初始電壓,計算每個電晶體在該電壓下的等效電流與電導,把非線性電路線性化成一個線性系統,解出新的電壓,再拿新電壓重新計算,直到兩次結果的差異小於容許誤差。
這個過程聽起來很合理,但問題在於:牛頓法不保證收斂。如果初始猜測太遠、電路太陡峭、或是有正回饋路徑,迭代可能發散、震盪,或是在兩個解之間來回跳。
SPICE 為了求生,會啟動一連串補救措施:
這些方法有效,但每一個都是「額外的計算」。一個原本應該 10 次迭代收斂的節點,可能因為收斂困難,變成 200 次迭代,時間直接暴增 20 倍。
2.2 時間步進:每一步都是一次完整的求解
瞬態分析的時間步進不是固定的。SPICE 會根據電路的動態變化自動調整步長:變化劇烈時縮小步長,變化平緩時放寬步長。這個機制叫做 Local Truncation Error(LTE)控制。
問題來了。一個混合訊號電路裡,可能同時存在:
切換頻率 2.4 GHz 的時脈訊號
切換頻率只有 1 kHz 的電源管理訊號
需要模擬 10 毫秒才能看到的啟動行為
為了準確捕捉 2.4 GHz 的波形,時間步長必須小到皮秒(10⁻¹² 秒)等級。但要模擬 10 毫秒,就代表你需要跑 10⁹ 個時間點。每個時間點平均要解 20 次牛頓迭代,每次迭代要解一個上萬階的稀疏矩陣。這樣乘下來,三天真的不算多。
這就是模擬工程師最常講的一句話:「不是模擬器慢,是你要求的時間太長、頻率太高、精度太嚴。」
三、為什麼電路一大就慢到天荒地老?
如果只有幾十個電晶體,SPICE 幾乎是瞬間完成。但真實的晶片設計不會這麼客氣。以下幾個因素,會讓模擬時間從「秒」變成「天」。
3.1 稀疏矩陣求解的規模效應
稀疏矩陣求解的複雜度,大致與節點數的 1.5 次方到 2 次方成正比(取決於矩陣結構與排序演算法)。也就是說,節點數變成 10 倍,求解時間可能變成 30 到 100 倍。
一個簡單的兩級運算放大器,節點數可能只有 20 個。但當你把它放進一個完整的鎖相迴路(PLL)、加上電荷泵、迴路濾波器、壓控振盪器、除頻器,節點數很容易破千。如果再加上佈局後的寄生電容與寄生電阻(後佈局模擬,post-layout simulation),節點數破萬是家常便飯。
更別提現在流行的「系統級模擬」:把整個收發器、電源管理單元、數位控制邏輯全部放在同一個 SPICE 網表裡。節點數十萬、百萬,都是真實存在的案例。
3.2 寄生電容與後佈局模擬的爆炸
電路圖模擬(schematic simulation)只考慮元件本身的特性,速度快、結果樂觀。但晶片實際做出來之後,每一條金屬線都有電阻、每一對相鄰金屬線之間都有電容。這些寄生效應在奈米製程下極其致命,尤其是 7 奈米、5 奈米以下,一條訊號線的延遲可能有一半來自寄生 RC。
所以設計流程中有一個階段叫「寄生提取」(parasitic extraction,PEX),會從佈局圖中萃取出成千上萬個寄生電阻與電容,然後把它們全部加進網表裡。原本 500 個節點的電路,瞬間變成 50,000 個節點。
更糟的是,這些寄生 RC 會形成巨大的 RC 網路,讓矩陣變得非常「病態」(ill-conditioned),數值求解的收斂變得極其困難。很多時候模擬跑三天,不是因為節點多,而是因為那條該死的電源線上有個 0.001 歐姆的電阻和 10 法拉等級的等效電容,讓牛頓法崩潰。
四、真實案例:三天是怎麼算出來的?
讓我們用一個具體一點的例子,把「三天」拆解成可理解的數字。
4.1 一個後佈局 5G 收發器的模擬經驗
假設你設計了一個 5G 毫米波收發器前端,包含低雜訊放大器、混頻器、本地振盪器、功率放大器。電路圖層級的節點數約 2,000 個,後佈局提取後變成 80,000 個節點。
你要模擬的是:送進一個 64-QAM 的調變訊號,中心頻率 28 GHz,頻寬 400 MHz,模擬時間長度 1 微秒(用來觀察 EVM 與頻譜再生)。
計算一下:
28 GHz 的載波,為了準確取樣,時間步長至少需要 1 ps(10⁻¹² 秒)以下。
模擬 1 微秒,代表至少 10⁶ 個時間點。
每個時間點平均 15 次牛頓迭代。
每次迭代解一個 80,000 × 80,000 的稀疏矩陣。
如果每次矩陣求解需要 0.1 秒(這已經是很樂觀的估計),那麼總時間是:
10⁶ × 15 × 0.1 秒 = 1.5 × 10⁶ 秒 ≈ 17 天
當然,實務上不會這麼慘,因為稀疏矩陣求解遠比 0.1 秒快,而且很多時間點會收斂得很快。但即便打個一折,也還是 1.7 天。這就是「三天」的由來。它不是誇飾,而是數量級估算下的真實結果。
4.2 從三天壓到三小時的實務手段
模擬工程師不會乖乖等三天。以下是業界常用的加速手段,以及它們的取捨:
把這些手段全部用上,原本三天的模擬,確實有機會壓到三小時以內。但代價是:你必須非常清楚哪些細節可以犧牲,哪些不能。這正是類比設計工程師的專業所在。
五、結語:等待也是一種設計
SPICE 跑一個電路要三天,表面上看起來是工具不夠快,但本質上是因為我們要求它做的事情極其困難:在沒有實際晶片的情況下,用數學模型預測一個包含數萬個非線性元件、數十萬個寄生元件、在數十 GHz 頻率下運作的系統行為。
這三天,模擬器其實在做一件很了不起的事:它在用牛頓迭代、稀疏矩陣、時間步進控制這些數學工具,一寸一寸地逼近真實世界的物理行為。每一次收斂失敗、每一次步長縮小,都是它在告訴你:「這個電路在某個角落有問題,我需要更小心地看。」
所以,下次當你看到模擬進度條卡在 37.2% 時,不妨換個角度想:那不是當機,那是你的電路正在被數學仔細檢驗。而你能做的,就是在按下 Run 之前,把設定調好、把模型選對、把電路切乾淨,讓它少走一點冤枉路。