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

跨角點簽核:PVT、晶片內變異與多角點多模式

到目前為止,你只替一顆理想晶片做過時序分析:標稱電壓、標稱溫度、完全照規格打造的電晶體。但真實的矽片不肯這麼配合。同一份網表,只下線一次,卻會出貨成數百萬顆略有差異的晶片,它們必須從凍寒的資料中心清晨,一路撐到你口袋裡發燙的手機,而電池還會隨著耗電而電壓下垂。本篇將說明[[static-timing-analysis|靜態時序分析]]如何在這片混亂中存活——靠的是橫跨製程、電壓、溫度角點與各種操作模式的網格來簽核,並針對單一晶粒內部存在的變異,對延遲做出帶悲觀餘裕的降額處理。

一份網表,百萬顆不同的晶片

想像一家麵包店完美地遵循同一份食譜,每條麵包卻都長得有點不一樣——烤箱後段比較燙、麵粉的含水量隨天氣飄移、廚房一到下午就熱起來。食譜是固定的;條件卻不是。現代晶圓廠正是這樣一家麵包店,只不過麵包是數十億顆電晶體,而公差是以原子為單位來衡量的。微影永遠印不出兩個一模一樣的閘極;摻雜原子是按機率法則落下的;閘極氧化層只有幾個原子層厚,且隨晶圓而變。你在單一標稱操作點上模擬出的那顆晶片,其實是一則虛構。真正出貨的,是一團機率雲。

決定一顆成品電晶體切換多快的,主要是三個旋鈕,工程師把它們綁成一個縮寫:PVT——Process(製程)、Voltage(電壓)、Temperature(溫度)。*製程*指矽片出廠的樣子:電晶體被蝕刻得偏快還是偏慢?*電壓*是晶片實際看到的供電軌——在先進製程節點上標稱 0.8 V,但它會在負載下垂落,也會隨電池耗盡而下沉。*溫度*指接面溫度,從車用冷啟動的 −40 °C,到熱降頻 SoC 的 125 °C 都有可能。每一條軸都會挪動延遲,而且它們並非各自獨立——同一顆晶片可能在某個模式下偏慢,在另一個模式下偏快。

製程角點:把矽片樂透圈起來

你沒辦法把每一顆可能的晶片都特性化——數量太多了。取而代之,晶圓代工廠交給你一小撮事先建好的製程角點:NMOS 與 PMOS 電晶體實際長成樣子的極端但物理上合理的組合。經典的五個角點,是依各型電晶體的速度來命名的。TT(典型-典型)是標稱配方。FF(快-快)是那片走運的晶圓,N 和 P 都偏快——驅動強、延遲低。SS(慢-慢)是倒霉的晶圓——驅動弱、延遲長。SFFS 則是偏斜角點,一型偏快、另一型偏慢,這對任何仰賴 N/P 平衡的東西都至關重要,例如比例式邏輯或工作週期。

PMOS
  fast |  FS  · · · · · · · ·  FF
       |   \                  /
       |    \      TT        /        <- TT = nominal recipe
       |     \   (center)   /            FF = both fast  (fastest cells)
  slow |  SS  · · · · · · · ·  SF        SS = both slow  (slowest cells)
       +------------------------         SF/FS = N and P pull opposite ways
         slow      NMOS      fast

        Each '·' is a corner the library is characterized at.
        STA must close timing at EVERY relevant one.
N 對 P 的製程平面。真實晶圓散落在這個框內;角點圈住了代工廠保證你不會超出的極端值。

這裡是整篇指南中最有用的一個直覺。建立(setup)時序——資料有沒有在時脈邊緣擷取它之前就抵達?——在邏輯*偏慢*時最難滿足,所以它的最差情況通常落在 SS、高溫、低電壓角點,那裡的閘極慢如龜爬。保持(hold)時序——資料在邊緣*之後*那一瞬間有沒有保持穩定,而不是一路衝過去污染同一顆暫存器?——在邏輯*偏快*時最難滿足,所以它的最差情況通常落在 FF、低電壓角點,那裡一條短路徑在時脈安定之前就衝刺穿過。同一顆晶片,兩個相反的敵人,而你必須同時擊敗它們。

MCMM 矩陣:每個角點乘上每個模式

角點回答的是*哪一種矽片*。但真實晶片還會在許多*模式*下運作——而時序約束會隨模式改變。一顆手機 SoC 可能有 0.9 V、3 GHz 的高效能模式,0.6 V、800 MHz 的低功耗模式,一個睡眠/保持模式,一個讓長鏈中每顆正反器都翻動的掃描移位測試模式,以及一個只有真正邏輯時脈在跑的功能模式。每個模式都有自己作用中的時脈、自己的時脈週期、自己被啟用的路徑與偽路徑例外。某條在測試模式下是關鍵的路徑,在功能模式下甚至根本不存在。

把角點清單與模式清單交叉相乘,你就得到多角點多模式(MCMM)矩陣——一張*情境*的網格,每一格都是晶片必須滿足的特定(角點, 模式)配對。簽核的意思,是要在每一個物理上可達的情境裡,同時讓建立與保持時序收斂。一個 4 模式、8 角點的設計,輕易就能產生十幾個作用中的情境,而大型 SoC 會跑上數十個。這正是為什麼時序收斂是一場戰役,而非單一次執行。

                  CORNER (process, voltage, temperature)
             SS/0.72V/-40C   SS/0.72V/125C   TT/0.80V/25C   FF/0.88V/-40C
           +--------------+---------------+--------------+---------------+
 FUNC HI    |   setup      |   setup ***   |    (ref)     |   hold ***    |
  (3GHz)    |              |               |              |               |
           +--------------+---------------+--------------+---------------+
 FUNC LO    |   setup      |   setup       |              |   hold        |
 (0.8GHz)   |              |               |              |               |
           +--------------+---------------+--------------+---------------+
 SCAN SHIFT |              |               |              |   hold ***    |
 (test)     |              |               |              |               |
           +--------------+---------------+--------------+---------------+

   Each non-empty cell = one SIGN-OFF SCENARIO that must pass.
   ***  = where the worst setup / worst hold violations typically appear.
   Setup hunts the SLOW corners; hold hunts the FAST corner.
一張精簡的 MCMM 矩陣。工具會把每個情境各建一次並在其中傳播時序;你必須把每一格打星的都清乾淨。

晶片內變異:單一晶粒內部的悲觀餘裕

角點捕捉的是晶片*之間*的變異——你的晶粒對上我的晶粒。但在*同一*顆晶粒上、相隔幾毫米的兩顆電晶體也會有差異:隨機摻雜起伏、局部微影晃動、橫越供電網格的 IR 壓降梯度,甚至某個忙碌區塊底下的熱點。這種局部失配,就是晶片內變異(OCV)。殘酷的轉折在於:對單一條時序檢查而言,OCV 可以把*發射(launch)*路徑與*擷取(capture)*路徑往相反方向推——讓資料路徑變慢,同時讓通往擷取正反器的時脈跑快,這對建立時序而言是兩頭俱輸。

STA 用時序降額來建模 OCV:它把單元與連線的延遲乘上一個降額係數,刻意把發射與擷取路徑拉開。對一條建立檢查,工具會用大於 1.0 的晚到降額(late-derate)*放慢*發射(資料)路徑,並用小於 1.0 的早到降額(early-derate)*加快*擷取(時脈)路徑;對保持檢查則反過來做。這些數字來自函式庫的變異資料與設計所在的層級——例如 1.05 的晚到降額與 0.95 的早到降額是典型的起點,在激進的製程節點上會更大。

SETUP check with OCV derating (the pessimistic split):

   launch path  --[ data: DERATE LATE x1.05  -> made SLOWER ]-->  D
                                                                  |
   common clock -+                                                FF
   from PLL      |                                                 ^
                 +--[ capture clk: DERATE EARLY x0.95 -> FASTER ]-+

   data arrives later  +  clock arrives sooner  =  worst-case squeeze

BUT: the shaded part of the clock tree is SHARED by launch & capture.
Derating it both ways at once is DOUBLE-COUNTING. The fix:

   --> Common Path Pessimism Removal (CPPR / CRPR):
       credit back the over-pessimism on the common segment.
OCV 把發射與擷取拉開以求最差情況,再由 CPPR 退還共用時脈路徑上那份不可能成立的悲觀餘裕。

全部串起來:一次簽核演練

讓我們追蹤這一切在實務上如何落地。一旦你把兩個敵人內化,流程就變得機械化:在慢角點追擊建立時序,在快角點追擊保持時序,再讓降額與 CPPR 把悲觀餘裕維持得誠實。你為單一條理想檢查所學的那套機制,如今每個情境各跑一次,而橫跨整張 MCMM 網格的最負裕量(slack),就是那個把關下線與否的數字。

  1. 建立情境清單。 列舉出可能成為最差情況的(角點, 模式)配對;其餘的以一份有記錄的理由砍掉。為每個角點載入對應的 .lib,為每個模式載入對應的 SDC 約束。
  2. 在慢角點跑建立時序。 對資料路徑用晚到降額,對擷取時脈用早到降額。一條失敗的建立檢查就是一筆建立違規——靠放大單元、重整邏輯,或略微放寬時脈週期來修。
  3. 在快角點跑保持時序。 此時降額的正負號翻轉。一條失敗的保持檢查就是一筆保持違規——通常靠在短路徑上插入緩衝器/延遲單元來修,讓資料無法與時脈賽跑。
  4. 套用 CPPR。 讓工具退還共用時脈段上被重複計入的悲觀餘裕,這樣你才不會去過度修補那些其實從未真正失敗的路徑。
  5. 取所有情境中的最差裕量。 下線與否,由整張網格中任何一處最負的裕量來把關——建立與保持都算。只要還有一個情境是紅的,另一個是綠的也毫無意義。

留意哪些變了、哪些沒變。一條時序檢查的*方程式*——抵達時間、要求時間、裕量——正是前幾個層級裡的那些。倍增的是*你跑它們的次數*:每個情境各一次,各帶自己的延遲、自己的降額、自己作用中的約束。掌握這套記帳,正是「在實驗桌上能動的晶片」與「在每位客戶手中都能動的晶片」之間的差別。下一個層級會直接建立在這之上:手握 PVT、MCMM 與 OCV,你便已準備好面對完整的變異感知簽核,以及那些把關鍵判斷——該信任哪些角點、該移除哪份悲觀——這些正是區分一個正在收斂的設計與一個卡死設計的分水嶺。