晶片內偏差(on-chip variation, OCV)
想像兩名一模一樣的跑者,在同一家健身房訓練、吃同樣的飲食、穿同樣的鞋子。按理說他們跑一圈應該用完全相同的時間。可實際上總有一個會快上那麼一丁點,因為沒有兩副身體能精確到每一根纖維都完全相同。同一顆晶粒上並排而坐、號稱完全相同的兩條時序路徑,也是這麼回事。哪怕你已經定好了一個製程角(process corner)——比如慢慢矽、低電壓、高溫這樣一個全域條件——在這一顆晶片上,細微的差別仍會從一處到另一處地變化:這裡某個電晶體的閘極長了零點幾奈米,那裡摻雜原子落得不太均勻,某條導線蝕刻得稍窄了些,繁忙模組中央的供電軌塌陷了幾毫伏,晶粒的某一角比另一角更熱。晶片內偏差(OCV)就是給這種只存在於一顆晶粒「之內」的散佈起的名字——於是同一種類型的兩個單元給不出完全一樣的延遲,兩條匹配的路徑也跑不出完全一樣的速度。
這為什麼對簽核要緊?因為一次建立(setup)檢查,是讓一條發射資料的發射路徑,和負責接住它的捕獲時鐘,在共享同一個時鐘的前提下相互較勁,而保持(hold)檢查更是脆弱。如果資料路徑恰好落在偏慢的矽上,而捕獲時鐘恰好落在偏快的矽上,餘量就被吃掉了,一條在製程角下看著安全的路徑,實際上可能失敗。光憑製程角看不出這一點——它給整顆晶粒只分配一個速度。所以簽核會在製程角之上再對時序做降額(de-rate):對一次建立檢查,它故意把資料路徑、連同攜帶資料的發射時鐘一起放慢,而把設定截止期限的捕獲時鐘加快(保持檢查則方向相反),各自乘上一個小小的降額係數,買下足夠的餘量去吸收兩者之間最壞的、合理可能出現的失配。粗糙的「平直 OCV」只是把每個延遲統統乘上一個固定百分比,這很悲觀,因為它假定一條長路徑上的每一個單元都同時朝壞的方向偏。現代簽核更聰明:先進 OCV(AOCV)會隨著路徑變長(隨機誤差部分抵消)、以及隨著路徑在物理上變短,把降額收窄;參數化/統計 OCV(POCV/SOCV,常透過 Liberty 的 LVF 資料)則給每個單元各自的 sigma,再以統計方式合併——這樣你只為真正需要的那點餘量買單。
真正的功夫在於把不該承受的悲觀去掉。當發射時鐘和捕獲時鐘在分岔之前走過同一段共享的導線,那一段共同路徑不可能在同一瞬間對一邊偏快、對另一邊偏慢,於是工具會把它「退還」回來——這就是共同路徑悲觀度消除(CPPR,也叫 CRPR)。歸根結底,OCV 就是你在製程角「之上」再加的那一層安全餘量,用來尊重一個樸素的事實:一顆晶粒並不均勻,而那種只因為假定檢查的兩半完全相同才勉強收斂的時序,到了矽片上會反過來背叛你。
對一次建立檢查,平直 OCV 把資料路徑連同它的發射時鐘一起放慢、把捕獲時鐘加快一個小小的係數,讓檢查能在最壞的、合理可能出現的晶粒內失配下依然過關;AOCV/POCV 則用按路徑、按單元客製的餘量來取代這個生硬的數字。
OCV 餘量說的是一顆晶粒「之內」的散佈,和製程角不是一回事(製程角是片與片之間、板與板之間那種全域的 PVT 條件);你是在正在簽核的那個製程角「之上」再疊加 OCV 降額,而過度降額會悄悄丟掉時脈速度,所以團隊會從平直 OCV 轉向 AOCV/POCV,把這部分效能摳回來。