VLSI芯片測試
1. 芯片測試
在講解具體的芯片測試的分治策略算法之前,先來了解芯片測試的意思。
1.1 一次測試的過程
如上圖,A、B為芯片。測試方法為:將2片芯片(A和B)置於測試台上,互相進行測試,測試報告是“好”或者“壞”,只取其一。
- 假設:好芯片的報告一定是正確的,壞芯片的報告是不確定的(可能會出錯)
那么上述測試的結果有四種可能,如下圖:
上面的結果應該不難理解
那么現在問題來了:
- 輸入:n片芯片,其中好芯片,至少比壞芯片多一片(要不然測試不了)附:若多於n/2的芯片是壞的,在這種成對測試方法下,使用任何策略都不能確定哪個芯片是好的。
- 問題:設計一種測試方法,通過測試從n片中挑出1片好芯片
- 要求:使用最少的測試次數
1.2 如何測試一塊芯片的好壞
針對上述問題,現在先來研究一下,如何在上述n片芯片中,測試出A是好芯片還是壞芯片?
- 問題:給定芯片A,判定A的好壞
- 方法:用其他n-1片芯片對A進行測試。
假設:n=7:好芯片數>=4
- A好,6個芯片中至少3個報“好”
- A壞,6個芯片中至少4個報壞
所以對於n是奇數情況下:好芯片數>=(n+1)/2
A好,至少有(n-1)/2個報“好”
A壞,至少有(n+1)/2個報“壞”
結論:
- 至少一半報好,A是好芯片
- 超過一半報壞,A是壞芯片
假設: n=8:好芯片數>=5
- A好,7個芯片中至少4個報“好”
- A壞,7個芯片中至少5個報“壞”
所以對於n是偶數:好芯片數 >= n/2+1.
A 好, 至少有 n/2個報告“好”
A 壞, 至少有 n/2+1個報告“壞”
結論:n-1份報告中
- 至少一半報好,A是好芯片
- 至少一半報壞,A是壞芯片
上面的分析,已經很清晰,我們已經知道如何測試一塊芯片的好壞。那么人們最拿手的方法就是:暴力算法(蠻力算法)。
1.3 蠻力算法
測試算法:任取 1片測試,如果是好芯片,測試結束;如果是壞芯片,拋棄,再從剩下芯片中任取 1片測試,直到得到 1片好芯片
時間估計:
第一片是壞芯片,最多測試n-2次
第二片是壞芯片,最多測試n-3次
…
總計:Θ ( n 2 )
可見時間復雜度之高,數據量一多,肯定會超時。
1.4 分治算法設計思想
在分析分治算法的正確性之前,我們先給出這個算法的描述:
假設n為偶數,將n片芯片兩兩一組做測試淘汰,剩下芯片構成子問題,進入下一輪分組淘汰。
淘汰規則為:
- “好,好” ==> 任留1片,進入下輪
- 其他情況 ==> 全部拋棄
遞歸截止條件:n<=3
3片芯片,一次測試可得到好芯片
1或者2片芯片,不需要再測試,他們都為好芯片。
上述算法過程就是我們給出的分治策略的設計。那么為什么上述的策略是正確的呢?
注意:要保證分治策略的正確性的基本條件是:子問題與原問題性質相同。下面我們就來證明,上述分治策略的子問題與原問題性質相同。
1.41 分治算法的正確性證明
原問題:n片芯片,其中好芯片,至少比壞芯片多一片
那么子問題,命題1:當 n 是偶數時,在上述淘汰規則下,經過一輪淘汰,剩下的好芯片比壞芯片至少多1片
我們需要證明上述子問題的命題1是正確的。
證明:假設原問題中A,B都好的芯片有i組,A與B一好一壞的有j組,A與B都壞的有k組。那么經過一輪淘汰后,好芯片還剩i片,壞芯片還剩k片。
因為
- 初始芯片總數 2i+2j+2k = n
- 初始好芯片多於壞芯片:2i+j > 2k+j
得出:i>k
所以,剩余的芯片好芯片比壞芯片,至少多1片。命題1 是正確的。即證明了上述分治算法的正確性。
當n為奇數時,特殊處理。當n是奇數時,可能會出現問題,如圖:
可見淘汰后的子問題並不滿足於原問題性質相同,此時無法繼續測試。
- 處理辦法是:當n為奇數時,增加一輪對輪空芯片的單獨測試,如果該輪空芯片為好芯片則算法結束,如果是壞芯片,則淘汰該芯片。
下面給出上述分治算法的偽碼描述:
1.42 時間復雜度分析
設輸入規模為n,,每輪淘汰后,芯片數至少減半,測試次數(含輪空處理):O(n)
時間復雜度:
W(n) = W(n/2) + O(n)
W(3)=1,W(2)=W(1)=0
主定理求解上述方程的得:W(n) = O(n)
結果很振奮人心,你已經將一個O(n^2)級別的算法優化為了O(n)級別!!!
2. 總結
最大的需要注意的地方就是:如何保證子問題與原問題性質相同:
可以:
1.增加額外處理(比如上述n為奇數時對輪空數據的處理)
2.額外處理的工作量,不改變函數的階。
參考:北京大學屈婉玲老師公開課