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

故障模型與 ATPG:產生測試圖樣

一顆現代晶片有數十億顆電晶體,一粒微塵或一條蝕刻歪掉的金屬線,都可能悄悄毒害其中任何一顆。你不可能為每一顆電晶體手寫一個測試——那麼,工程師究竟怎麼證明一塊剛出爐的晶粒是好的?答案是一項優雅的工程:先假裝每條導線都可能以某幾種特定方式損壞,再讓工具自動發明出能揭露每一種損壞的精確輸入圖樣。這份指南會帶你認識故障模型、主力的固著故障,以及那台把「可能壞了」變成具體、可評分測試的 ATPG 引擎。

從「它壞了嗎?」到一個能評分的數字

想像你剛收到工廠直送的一箱一百萬把黃銅小掛鎖,你的工作是只出貨良品。你沒辦法把每把鎖拆開,唯一能做的就是在鑰匙孔裡轉鑰匙,看鎖梁會不會彈開。於是你得先面對一個更深的問題:*一把掛鎖到底會有哪些缺陷?* 卡住的彈子?斷掉的彈簧?滑牙的螺絲?一旦你把鎖可能損壞的所有方式列出來,就能設計一小組轉鑰匙的動作,讓它們合起來能揭露其中每一種損壞。這份想像中的損壞清單,對一顆晶片而言正是故障模型所做的事。

這是所有製造測試的核心訣竅。實體缺陷千變萬化——這裡落了一粒微粒、那裡氧化層長得太薄、另一處金屬線縮細了。想把每一種微觀災難都列舉出來,根本毫無希望。所以我們乾脆不這麼做。我們改用一份小小的、*可數的*、理想化的邏輯故障清單,來取代那一團混亂的物理:一條條明確、有名字、能模擬、能瞄準、能逐一打勾的網表異常行為。故障模型,就是從「某個實體環節可能出錯」通往「這裡有一份有限的、有名字的清單,是我要去獵捕的目標」的橋樑。

主力選手:固著故障

在所有曾被提出的故障模型中,有一個統治業界已五十年,因為它優雅地簡單,卻能抓出驚人比例的真實缺陷。那就是單一[[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。每個節點兩個故障,每顆晶片數百萬個。

控制與觀測:偵測的兩個半邊

要抓住任何一個故障,一個測試圖樣必須做兩件工作,少了任何一件它就毫無用處。首先它必須激發(或*活化*)這個故障:把可疑節點逼到與它固著值*相反*的狀態,使得良品晶片與故障晶片此刻會在那個節點上意見分歧。要測一個節點是否固著於 0,你必須把它驅動到 1;要測固著於 1,你必須把它驅動到 0。其次,這個圖樣必須把那份分歧沿著一連串的閘傳播出去,直到它抵達一個你真正能觀察的輸出——一支接腳,或是一個掃描鏈上的正反器。一份永遠到不了可觀察點的差異,就是一份沒人看得見的差異。

這兩件工作有你到處都會看到的名字:可控制性是你從輸入端把某個內部節點*設定*到指定值的能力,而*可觀測性*是你在輸出端*看見*那個節點值的能力。一個難以控制或難以觀測的節點,就是一個難以測試的節點——而掃描(上一階)被發明出來的全部理由,正是為了把這兩者都大幅拉高:它把每一個正反器都變成一個能直接設定、能直接讀取的測試點。

ATPG:發明圖樣的引擎

現在主角登場。ATPG——自動測試圖樣產生——是一種 EDA 工具,它吃下閘級網表、故障清單與掃描結構,然後*自動計算*出能偵測每一個故障的實際輸入值。你不必手寫測試;你按一個按鈕,工具就自己推理出它們。對單一個目標故障,它必須解一道約束謎題:選出主輸入與掃描正反器的值,使得 (a) 故障點被驅動到激發值,且 (b) 一條被敏化的路徑能把效應送到輸出。然後它對下一個故障、再下一個故障,這樣做上數百萬次。

經典的 ATPG 演算法有著動聽的名字——D 演算法(Roth,1966)引入了 *D* 符號,意思是「在良品電路中為 1、在故障電路中為 0」(以及反過來的 D̄),於是單一個字元就能在效應穿過一個個閘時,追蹤良品與故障之間的分歧。PODEMFAN 則靠著聰明地決定先嘗試哪些選擇,讓搜尋快上許多。現代工業級 ATPG 常把難纏的案例交給SAT 求解器,把「這個故障可偵測嗎?」編碼成一道布林可滿足性問題。手法各有千秋,目標卻始終如一——找出能激發並傳播的輸入,或證明根本不存在這樣的輸入。

  1. 從清單中挑出一個目標故障(比如說,節點 g3 固著於 1)。
  2. 激發它:把*相反*的值正當化(把 g3 驅動到 0),靠選定的輸入/掃描值把它逼到那裡。
  3. 敏化一條路徑:挑一條從 g3 通往輸出的閘路徑,讓那份分歧(一個 D)能沿途暢通無阻地行進。
  4. 把這些約束合起來求解;若它們相互衝突,就回溯並嘗試其他選擇(搜尋的昂貴之處正在這裡)。
  5. 成功時,把得到的輸入值記錄成一個測試圖樣——並對它做故障模擬,看看它順帶免費抓到了哪些*其他*故障。
  6. 把每一個新偵測到的故障從清單中剔除,重複進行,直到清單清空,或剩下的故障被證明無法偵測為止。

一個微型實例:一個圖樣,一個故障

我們用一個你能整個裝進腦袋的電路把它具體化。兩個 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.
一個圖樣 a b c d = 1 1 0 X,既激發了 g1 的 SA0,又把它傳播到輸出 y。

注意這個微型例子教了你三件事。d 上的那個「X」意思是*不在乎*——只要能省,ATPG 就會讓某些位元不受約束,這給了故障模擬器自由,也幫助一個圖樣覆蓋更多故障。設 g2 = 0 好讓 g1 的變化能透出來,這是 OR 閘的非控制值——每一種閘都有一個,而知道它們正是路徑敏化的核心。而藉由故障模擬的魔法,同一個圖樣幾乎肯定會在途中順帶偵測到好幾個*其他*故障(例如 a 或 b 上的固著於 0)。一個乾淨的圖樣,退役掉許多故障。

覆蓋率、不可測項,與固著之外的故障

當 ATPG 完成時,它會回報那座獎盃:故障覆蓋率——所產生的圖樣偵測到的、佔被建模故障的百分比。量產晶片通常要求固著覆蓋率達到 99% 或更高,而對汽車或醫療這類攸關安全的零件,門檻更會攀向 99.9% 以上。為什麼這麼嚴苛?因為 99% 與 99.9% 之間的差距,就是「每一百顆出一顆瑕疵品」與「每一千顆出一顆」之間的差距——以數十億顆的規模來算,每一個十分之一的百分點,都是一場現場故障、召回、甚至更糟後果的洪水。覆蓋率,是那唯一一個決定一份測試夠不夠好、能不能拿產品去賭的數字。

最後,固著主力雖然有名,卻不孤單,因為現代矽晶失效的方式,是一個被凍結的節點所無法捕捉的。轉態(延遲)故障模擬一個*確實*會切換、但切換得太*慢*的節點——它最終會抵達正確的值,卻錯過了時脈邊緣,於是晶片在低速下能用、在額定頻率下卻失效。要抓住這些,需要*全速*測試:兩個快速的向量,先發動一次轉態,再在一個快時脈之後捕捉結果。橋接故障模擬兩條相鄰導線被短接在一起,使它們彼此拉扯或形成有線 AND/OR。而細胞感知(cell-aware)或電晶體級的模型,則會鑽進標準單元內部,去瞄準閘級網表根本看不見的缺陷。每一個模型都是另一面鏡片;量產測試計畫會疊用好幾種,把真實的缺陷漏失率壓到個位數的百萬分之幾。