**自動測試圖樣生成**（**ATPG**, **A**utomatic **T**est **P**attern **G**eneration）係指電子元件測試方法中嘅一個環節，即針對啲元件嘅邏輯電路結構生成輸入圖樣、等最終好檢得到啲元件嘅內部錯誤。

模型同簡化原理
-------

### 電路模型

內文：組合邏輯電路同序向邏輯電路
一塊芯片嘅邏輯電路可以好複雜，不過佢都可以睇做係由啲基本模型鬭埋而成嘅，譬如話組合邏輯電路同埋序向邏輯電路。前者係一種邏輯電路、之佢穩態輸出衹跟佢嗰陣時得到嘅輸入相關。後者就係輸出唔單止跟嗰陣嘅輸入、仲跟上一陣嘅輸入有關。照慣例，輸入通常表示為x，輸出通常表示為y，內部信號通常表示為z，貯存器通常表示為s。

### 故障類型

內文：故障模型
對於系統、特別係電路系統佢啲結構或者操作產生嘅故障，大體上可以分成以下幾種：

* 硞kak1定故障（Stuck-at fault）：啲信號硞定喺邏輯「0」、邏輯「1」或者高阻態嘅故障。種故障都係ATPG常用嘅模擬故障類型、之攞嚟模擬實際生產中嘅芯片故障噶。具體個信號硞定喺乜嘢二進制可以用「信號/0」或者「信號/1」表示。以輸入x0為例，佢硞定喺0、1就分別表示成x0/0、x0/1。
* 晶體管故障：類似硞定故障，晶體管都可能硞定喺通態（短路）或者喺斷態（唔傳電）。
* 橋接故障：兩條信號路之間短路就喊做橋接故障。一般嚟講，橋接故障都用開**與/或邏輯**嚟表示。對於一條路嘅驅動主導另一條嘅情況，就用到**主導與/或邏輯**，即係主導信號路維持自己啲信號、而捱主導嘅信號路嘅輸出就係主導路同自己兩家輸出嘅與/或邏輯結果。特殊情況下，假如條路橋接到VDD抑或係VSS嗰陣時，佢就相當於硞定故障（見**故障㘝疊**）。
* 開路故障
* 延遲故障：隻信號係啱邏輯嘅，但係就係慢過或者快過正常信號。

### 簡化

對於一隻有n個輸入、m個輸出嘅組合邏輯電路嚟講，要逐個逐個測啲接腳有冇出錯需要2n次測試；而對於仲帶埋s個貯存器嘅序向邏輯電路嚟講，s相當於下一次嘅輸入，總共就要到2n+s次測試。所以精簡啲測試數目落嚟就好有必要。簡化之前，需要定義幾樣嘢：

* 測試xν：一項測試即係一條代表輸入x0到xmax取乜具體值嘅矢量。例如對於二進制三輸入x0、x1、x2系統，佢其中一項測試x2就可以寫成x2=[x2，x1，x0]T=[0，1，0]T
* 故障組Fν：由一項測試xν測得出嘅所有故障佮成嘅一組，一般作為行
* 測試組Tμ：由測得出某個故障fμ嘅所有測試佮成嘅一組，一般作為迾
* 測試集Tc：測得澌啲故障嘅測試組。使最少測試嘅測試集就係最細測試集Tcmin
* 故障覆蓋：有幾多比例嘅故障可以喺一摣故障組當中揾到（百分百陣時即所有故障都揾得到，即冇一迾測試組係空寥嘅，即冇故障捱略過）
* 等價故障：有啲故障fμ、fκ，佢哋無論喺乜嘢測試條件xν下啲輸出yi都一樣，即{\displaystyle y\_{\mu }(x\_{\nu })\oplus y\_{\kappa }(x\_{\nu })=0}，其中yμ、yκ分別代表有故障fμ、fκ陣時嘅輸出
* 主導故障：對於故障fμ、fκ，所有測得到fμ嘅測試都測得到fκ，即使佢哋唔係等價故障都好
* 主導故障組FiD：對於所有測試xν，滿足{\displaystyle F\_{i}\supseteq F\_{\nu }}；即Fi冇辦法**俾**任意其他故障組Fν包含到，即Fi係啲唔可以由佢哋代表到嘅各條**最大組**
* 主導測試xνD：某個故障fμ衹能由佢測到
* 主導測試組TjD：對於所有故障fμ，滿足{\displaystyle T\_{\mu }\supseteq T\_{j}}；即Tj冇辦法**將**任意其他測試組Tμ包含到，即Tj係啲唔可以由佢哋代表到嘅各條**最細組**

#### 㘝疊

為唨達到使最少嘅測試可以覆蓋澌啲故障邇個目標，跟尾就要進行**㘝jaap3疊（collapsing），**其中分為**故障㘝疊**同埋**測試㘝疊**。故障㘝疊即係保留啲等價故障之一、保留啲主導測試同埋主導測試組對應嘅故障，剔除其他故障，嚟減少要測嘅故障數；測試㘝疊即係保留啲主導故障組對應嘅測試，剔除其他測試，嚟儘量使到最少測試數。

Boolean導數法
----------

作為生成測試圖樣嘅基本方法，Boolean導數法係早時應用喺非自動化計算輸入矢量嘅，但係佢並唔適用喺電腦自動化上邊。

Boolean導數嘅定義係噉：

{\displaystyle y\_{z}={dy \over dz}=y(z=0)\oplus y(z=1)}

代表z取唔同值陣時y對應嘅輸出是否有差。

以z/1，即z硞定喺1做例，成個方法嘅主要過程係：

* 計出中間變量z同埋輸入x對應輸出y嘅函數式：{\displaystyle y(z,x\_{1},x\_{2},\ldots x\_{n})}
* 通過導數嘅公式計出個Boolean導數：{\displaystyle y\_{z}=y(z=0)\oplus y(z=1)}
* 計出{\displaystyle y\_{z}(x\_{\nu })\cdot {\overline {z(x\_{\nu })}}=1}（輸出有差同埋z反而取0）對應嘅輸入x0，x1……方程
* 寫出各種可能嘅輸入矢量{\displaystyle x\_{\nu }=[x\_{n},\ldots x\_{2},x\_{1},x\_{0}]^{T}}嘅具體值，其中x0，x1……可以係0，1抑或X（是但）

D演算法
----

**D演算法**係第一種實質上可以應用喺電腦自動化嘅測試圖樣生成演算法。佢係通過引入一個**D標記**，嚟同時標明某個輸入x嘅正常情況/故障情況，再按照D標記同01嘅運算規則嚟引導至輸出y。對於x嚟講，{\displaystyle D}對應嘅係「正常情況下1/故障情況下0」，而{\displaystyle {\overline {D}}}就反之。

D標記滿足以下公式：

{\displaystyle D\cdot 1=D}，{\displaystyle D+0=D}  
噉就可以在序向邏輯電路入便將輸入嘅{\displaystyle D}遞到輸出作為{\displaystyle D}一係{\displaystyle {\overline {D}}}輸出（睇在中間有幾多非門）。

具體過程有：

**故障厏定**（**F**ehlerbelegung）：揀取要檢測嘅信號同埋佢上高厏定嘅故障類型（{\displaystyle D}定係{\displaystyle {\overline {D}}}），噉樣做下游就體現為{\displaystyle D}/{\displaystyle {\overline {D}}}信號、上游就體現為對應嘅正常信號；

**致敏**（**S**ensibilisierung）：每當{\displaystyle D}/{\displaystyle {\overline {D}}}信號遇上與或邏輯門嗰陣時，通過{\displaystyle D\cdot 1=D}，{\displaystyle D+0=D}公式嚟決定另一條路上嘅信號、嚟保證佢傳得到下游；

**藴涵**（**I**mplikation）：根據邏輯門真值表計算上下游信號真值；

**可選分配**（**O**ptionale Zuweisung）：計算{\displaystyle a+b=1}、{\displaystyle a\cdot b=0}藴涵情況嗰陣時，{\displaystyle a}、{\displaystyle b}取值會有多種組合，要列澌啲組合出嚟，並根據佢哋列出輸入向量表。若果組合嘅信號仲會藴涵到其他信號，就要從中揀取啲真值組合出嚟、啲唔會同啲經已藴涵過、致敏過嘅信號真值有衝突嘅，再根據佢哋列出輸入向量表。

睇埋
--

* 故障模型
* 錯誤覆蓋率

考
-