從「它壞了嗎?」到一個能評分的數字
想像你剛收到工廠直送的一箱一百萬把黃銅小掛鎖,你的工作是只出貨良品。你沒辦法把每把鎖拆開,唯一能做的就是在鑰匙孔裡轉鑰匙,看鎖梁會不會彈開。於是你得先面對一個更深的問題:*一把掛鎖到底會有哪些缺陷?* 卡住的彈子?斷掉的彈簧?滑牙的螺絲?一旦你把鎖可能損壞的所有方式列出來,就能設計一小組轉鑰匙的動作,讓它們合起來能揭露其中每一種損壞。這份想像中的損壞清單,對一顆晶片而言正是故障模型所做的事。
這是所有製造測試的核心訣竅。實體缺陷千變萬化——這裡落了一粒微粒、那裡氧化層長得太薄、另一處金屬線縮細了。想把每一種微觀災難都列舉出來,根本毫無希望。所以我們乾脆不這麼做。我們改用一份小小的、*可數的*、理想化的邏輯故障清單,來取代那一團混亂的物理:一條條明確、有名字、能模擬、能瞄準、能逐一打勾的網表異常行為。故障模型,就是從「某個實體環節可能出錯」通往「這裡有一份有限的、有名字的清單,是我要去獵捕的目標」的橋樑。
主力選手:固著故障
在所有曾被提出的故障模型中,有一個統治業界已五十年,因為它優雅地簡單,卻能抓出驚人比例的真實缺陷。那就是單一[[ic-stuck-at-fault|固著故障]]。它的想法是:在網表中挑出任何一個節點——某個閘的輸入腳、某個閘的輸出、一條導線——然後假裝它被永久凍結。固著於 0(SA0)意味那個節點不管怎樣永遠讀作邏輯 0;固著於 1(SA1)則表示它被卡死在邏輯 1。整個模型就這樣。每一個節點都給你兩個故障(SA0 與 SA1),因此一個有 N 個節點的設計,大約有 2N 個固著故障要去追捕。
為什麼這麼粗糙的東西卻這麼好用?因為從邏輯的角度看,一大群實體缺陷*看起來就像*一個固著的節點。短路到接地軌會把一條線釘在 0;短路到電源軌會把它釘在 1;斷裂(開路)的閘輸入往往會浮動到一個表現得像固著故障的值。固著模型就像一個萬用替身:認真地追捕它,作為副作用你就一網打盡了大部分的製造現實。數十年的矽晶實證,證明了這筆交易划算。
A SINGLE STUCK-AT FAULT lives on a node and freezes it:
good circuit faulty circuit (node n SA0)
a ──┐ a ──┐
│ AND ── n ── ... │ AND ── n <stuck-at-0> ── ...
b ──┘ b ──┘ (n reads 0 forever,
no matter what a,b are)
SA0 = node permanently = 0 (e.g. shorted to GND)
SA1 = node permanently = 1 (e.g. shorted to VDD)
N nodes -> ~2N stuck-at faults in the whole fault list.
A 10-million-gate block can host tens of millions of faults.控制與觀測:偵測的兩個半邊
要抓住任何一個故障,一個測試圖樣必須做兩件工作,少了任何一件它就毫無用處。首先它必須激發(或*活化*)這個故障:把可疑節點逼到與它固著值*相反*的狀態,使得良品晶片與故障晶片此刻會在那個節點上意見分歧。要測一個節點是否固著於 0,你必須把它驅動到 1;要測固著於 1,你必須把它驅動到 0。其次,這個圖樣必須把那份分歧沿著一連串的閘傳播出去,直到它抵達一個你真正能觀察的輸出——一支接腳,或是一個掃描鏈上的正反器。一份永遠到不了可觀察點的差異,就是一份沒人看得見的差異。
這兩件工作有你到處都會看到的名字:可控制性是你從輸入端把某個內部節點*設定*到指定值的能力,而*可觀測性*是你在輸出端*看見*那個節點值的能力。一個難以控制或難以觀測的節點,就是一個難以測試的節點——而掃描(上一階)被發明出來的全部理由,正是為了把這兩者都大幅拉高:它把每一個正反器都變成一個能直接設定、能直接讀取的測試點。
ATPG:發明圖樣的引擎
現在主角登場。ATPG——自動測試圖樣產生——是一種 EDA 工具,它吃下閘級網表、故障清單與掃描結構,然後*自動計算*出能偵測每一個故障的實際輸入值。你不必手寫測試;你按一個按鈕,工具就自己推理出它們。對單一個目標故障,它必須解一道約束謎題:選出主輸入與掃描正反器的值,使得 (a) 故障點被驅動到激發值,且 (b) 一條被敏化的路徑能把效應送到輸出。然後它對下一個故障、再下一個故障,這樣做上數百萬次。
經典的 ATPG 演算法有著動聽的名字——D 演算法(Roth,1966)引入了 *D* 符號,意思是「在良品電路中為 1、在故障電路中為 0」(以及反過來的 D̄),於是單一個字元就能在效應穿過一個個閘時,追蹤良品與故障之間的分歧。PODEM 與 FAN 則靠著聰明地決定先嘗試哪些選擇,讓搜尋快上許多。現代工業級 ATPG 常把難纏的案例交給SAT 求解器,把「這個故障可偵測嗎?」編碼成一道布林可滿足性問題。手法各有千秋,目標卻始終如一——找出能激發並傳播的輸入,或證明根本不存在這樣的輸入。
- 從清單中挑出一個目標故障(比如說,節點 g3 固著於 1)。
- 激發它:把*相反*的值正當化(把 g3 驅動到 0),靠選定的輸入/掃描值把它逼到那裡。
- 敏化一條路徑:挑一條從 g3 通往輸出的閘路徑,讓那份分歧(一個 D)能沿途暢通無阻地行進。
- 把這些約束合起來求解;若它們相互衝突,就回溯並嘗試其他選擇(搜尋的昂貴之處正在這裡)。
- 成功時,把得到的輸入值記錄成一個測試圖樣——並對它做故障模擬,看看它順帶免費抓到了哪些*其他*故障。
- 把每一個新偵測到的故障從清單中剔除,重複進行,直到清單清空,或剩下的故障被證明無法偵測為止。
一個微型實例:一個圖樣,一個故障
我們用一個你能整個裝進腦袋的電路把它具體化。兩個 AND 閘餵進一個 OR 閘:g1 = a AND b、g2 = c AND d,而輸出 y = g1 OR g2。假設我們想測節點 g1 的固著於 0——第一個 AND 閘輸出的那條線被焊死在 0。我們親手走一遍偵測的兩個半邊。
激發:要揭露固著於 0,我們必須讓 g1 *想*成為 1。既然 g1 = a AND b,唯一的辦法就是 a = 1 且 b = 1。在良品晶片中 g1 = 1;在故障晶片中 g1 = 0。我們製造出了分歧——這就是我們的 D(1/0)。傳播:這份分歧落在 g1 上,而 g1 是 OR 閘 y = g1 OR g2 的一個輸入。OR 閘只有在它的*另一個*輸入為 0 時,才會把某一輸入上的變化往前傳(因為 OR 接上 1 永遠是 1,那會把差異遮蔽掉)。所以我們必須設 g2 = 0,做法是讓 c = 0(或 d = 0)。如此一來 y = g1 OR 0 = g1,於是 y 在良品晶片中是 1、在故障晶片中是 0。故障現在在輸出端現形了。
Circuit: g1 = a AND b
g2 = c AND d
y = g1 OR g2
Target fault: g1 stuck-at-0
Step 1 EXCITE (drive g1 to the opposite, 1): a = 1, b = 1
Step 2 PROPAGATE through OR (need other input = 0): c = 0 (d = X)
Resulting TEST PATTERN: a b c d = 1 1 0 X
| good chip | faulty chip (g1 SA0)
g1 | 1 | 0
g2 | 0 | 0
y (out) | 1 | 0 <-- they DISAGREE
^^^^^^^^^^^^^^^^^^^^^^
observe y: good=1, faulty=0 => fault DETECTED
Apply 1,1,0,X and read y. y=1 -> this fault is absent.
y=0 -> the part is bad, scrap it.注意這個微型例子教了你三件事。d 上的那個「X」意思是*不在乎*——只要能省,ATPG 就會讓某些位元不受約束,這給了故障模擬器自由,也幫助一個圖樣覆蓋更多故障。設 g2 = 0 好讓 g1 的變化能透出來,這是 OR 閘的非控制值——每一種閘都有一個,而知道它們正是路徑敏化的核心。而藉由故障模擬的魔法,同一個圖樣幾乎肯定會在途中順帶偵測到好幾個*其他*故障(例如 a 或 b 上的固著於 0)。一個乾淨的圖樣,退役掉許多故障。
覆蓋率、不可測項,與固著之外的故障
當 ATPG 完成時,它會回報那座獎盃:故障覆蓋率——所產生的圖樣偵測到的、佔被建模故障的百分比。量產晶片通常要求固著覆蓋率達到 99% 或更高,而對汽車或醫療這類攸關安全的零件,門檻更會攀向 99.9% 以上。為什麼這麼嚴苛?因為 99% 與 99.9% 之間的差距,就是「每一百顆出一顆瑕疵品」與「每一千顆出一顆」之間的差距——以數十億顆的規模來算,每一個十分之一的百分點,都是一場現場故障、召回、甚至更糟後果的洪水。覆蓋率,是那唯一一個決定一份測試夠不夠好、能不能拿產品去賭的數字。
最後,固著主力雖然有名,卻不孤單,因為現代矽晶失效的方式,是一個被凍結的節點所無法捕捉的。轉態(延遲)故障模擬一個*確實*會切換、但切換得太*慢*的節點——它最終會抵達正確的值,卻錯過了時脈邊緣,於是晶片在低速下能用、在額定頻率下卻失效。要抓住這些,需要*全速*測試:兩個快速的向量,先發動一次轉態,再在一個快時脈之後捕捉結果。橋接故障模擬兩條相鄰導線被短接在一起,使它們彼此拉扯或形成有線 AND/OR。而細胞感知(cell-aware)或電晶體級的模型,則會鑽進標準單元內部,去瞄準閘級網表根本看不見的缺陷。每一個模型都是另一面鏡片;量產測試計畫會疊用好幾種,把真實的缺陷漏失率壓到個位數的百萬分之幾。