Podręcznik
6. Testowanie i testowalność układów scalonych
6.6. Metody testowania i generacji testów
Wyobraźmy sobie, że kupujemy w sklepie kalkulator i chcemy sprawdzić, czy działa prawidłowo. W tym celu wykonujemy w sposób mniej lub bardziej przypadkowy kilka obliczeń, których prawidłowy wynik jest nam znany. Wyniki wyświetlone przez kalkulator są poprawne. Czy po takim teście możemy być pewni, że kalkulator działa całkowicie prawidłowo? Nie! Taką pewność uzyskalibyśmy dopiero wtedy, gdybyśmy wykonali wszystkie możliwe działania dla wszystkich możliwych argumentów. Taki test nosi nazwę wyczerpującego testu funkcjonalnego. Jest oczywiste, że nie da się go wykonać kupując w sklepie kalkulator.
A gdyby test był wykonywany przez szybki tester, taki, jaki stosowany jest do testowania układów scalonych?
Przypuśćmy, że testujemy układ kombinacyjny mający wejście n-bitowe. Jedno słowo n-bitowe podane na wejście dla celów testowania będziemy nazywali wektorem testowym. Wyczerpujący test funkcjonalny wymaga podania na wejście wszystkich możliwych kombinacji zer i jedynek, czyli 2n wektorów testowych, i zbadania poprawności odpowiedzi układu. Jeżeli testujemy układ sekwencyjny mający wejście n-bitowe i m stanów wewnętrznych, wyczerpujący test funkcjonalny wymaga podania na wejście 2(n+m) wektorów testowych. Czy to dużo? Wyobraźmy sobie prosty układ, dla którego n=25, m=50. Potrzebne jest więc 275 wektorów testowych. Jest to liczba równa około 3,8x1022. Jeżeli dysponujemy testerem, który potrzebuje 1 µs na jeden wektor testowy, testowanie naszego prostego układu będzie trwało około 109 lat!
Ten prosty przykład (zaczerpnięty z literatury) pokazuje, że wyczerpujący test funkcjonalny jest niemożliwy do wykonania nawet dla zupełnie prostych układów. Potrzebne są więc inne sposoby testowania. Omówimy je nieco dalej.
A ponieważ wyczerpujący test funkcjonalny nie jest możliwy, musimy mieć miarę jakości testów pozwalającą nam oszacować, jaki jest stopień wiarygodności wyników testowania. Innymi słowy, musimy znać odpowiedź na pytanie, jaki procent wszystkich możliwych uszkodzeń w układzie wykryje zestaw wektorów testowych, który nie jest wyczerpującym testem funkcjonalnym. Ten procent będziemy nazywali poziomem wykrywalności uszkodzeń dla danego zestawu wektorów testowych. Im niższy ten poziom, tym większe prawdopodobieństwo, że w wyniku testowania zakwalifikowany zostanie jako sprawny układ, który w rzeczywistości jest uszkodzony.
Poziom wykrywalności uszkodzeń jest miarą teoretyczną określaną przy zastosowaniu modelu uszkodzeń „SA0/SA1” i przy dalszych upraszczających założeniach. Jedno z nich to założenie, że uszkodzenie typu „SA0/SA1” może z jednakowym prawdopodobieństwem wystąpić w każdym węźle układu. Tak w rzeczywistości nie jest. W związku z tym poziom wykrywalności uszkodzeń nie wiąże się bezpośrednio i jednoznacznie z faktyczną liczbą układów wadliwych. Poniżej (tabela 6-1) przykładowe wyniki badań statystycznych pokazujących typowy związek poziomu wykrywalności uszkodzeń z faktycznym procentem układów wadliwych wśród układów zakwalifikowanych jako sprawne. Dane te nie są uniwersalne, zostały uzyskane dla określonych rodzajów układów i określonych sposobów ich testowania, ale dają pewne pojęcie o istniejącej tu zależności.
Tabela 6 1. Poziom wykrywalności uszkodzeń a liczba faktycznie wadliwych układów - przykład
Poziom wykrywalności uszkodzeń |
Procent układów wadliwych wśród układów zakwalifikowanych jako sprawne |
50% |
7% |
90% |
3% |
95% |
1% |
99% |
0,1% |
99,9% |
0,01% |
Wprowadzimy jeszcze dwa inne nowe pojęcia: kontrolowalności węzłów i obserwowalności węzłów w układzie. Metody testowania, o których będzie dalej mowa, wykorzystują model uszkodzenia „SA0/SA1” zakładający, że uszkodzenie polega na ustalonym stanie „0” lub „1” w jakimś węźle układu. Zatem dla sprawdzenia, czy wystąpiło uszkodzenie, trzeba będzie ustawiać określone stany w węzłach układu i sprawdzać te stany.
Węzeł jest tym łatwiej kontrolowalny, im krótsza jest ta sekwencja.
Węzeł jest tym łatwiej obserwowalny, im krótsza jest ta sekwencja.
Dla prawidłowo zaprojektowanych pod względem logicznym układów kombinacyjnych kontrolowalność i obserwowalność węzłów nie stanowi większego problemu. Natomiast w przypadku układów sekwencyjnych zmiana stanu w niektórych wewnętrznych węzłach układu może wymagać niezwykle długich sekwencji wektorów testowych. Jak zobaczymy, istnieją sposoby projektowania układów zasadniczo poprawiające kontrolowalność i obserwowalność węzłów w układach sekwencyjnych.
Posługując się zdefiniowanymi wyżej pojęciami można zadanie określenia sposobu testowania układu oraz wygenerowania odpowiedniego zestawu wektorów testowych sformułować następująco: celem jest uzyskanie jak najkrótszej sekwencji wektorów testowych zapewniającej wymagany poziom wykrywalności uszkodzeń.
Trzeba się przy tym pogodzić z faktem, że dla dużych i złożonych układów poziom wykrywalności uszkodzeń będzie z reguły niższy niż 100%. Nacisk na to, że sekwencja wektorów testowych powinna być jak najkrótsza, bierze się stąd, że testowanie dużych układów jest kosztowne. Wynika to z bardzo wysokiego kosztu nowoczesnych testerów. Nierzadkie są przypadki, gdy koszt testowania układu jest porównywalny z kosztem jego wyprodukowania. Wprowadziliśmy już pojęcie wyczerpującego testu funkcjonalnego i wiemy, że nie da się go wykonać w rozsądnym czasie. Dlatego powszechnie stosowana jest metoda zwana testowaniem strukturalnym. W tej metodzie nie badamy, czy układ prawidłowo wykonuje swą funkcję. Możemy nawet w ogóle nie interesować się, jaka ona jest. Zadaniem testowania strukturalnego jest sprawdzenie, czy w procesie produkcyjnym nie wystąpił defekt naruszający prawidłową strukturę układu. Przy założeniu, że modelem uszkodzenia jest model „SA0/SA1”, testowanie strukturalne polega na badaniu, czy w żadnym węźle układu nie występuje uszkodzenie tego typu. Zakłada się przy tym, że układ jest poprawnie zaprojektowany, tzn. brak defektów naruszających prawidłową strukturę układu jest równoznaczny z prawidłowym działaniem układu.
Proces testowania strukturalnego wygląda następująco. Wybiera się konkretny węzeł układu i podaje się na wejścia wektor testowy (lub sekwencję wektorów testowych) ustawiający w tym węźle konkretny stan (na przykład „0”). Następnie obserwując odpowiedź układu na wyjściu określa się, czy ten stan udało się ustawić, czy też nie. Tę samą procedurę powtarza się dla wszystkich węzłów, dla każdego z nich próbując ustawić stan zarówno „0”, jak i „1”. Jak widać, przy takiej procedurze testowania nie jest potrzebna znajomość funkcji wykonywanej przez układ. Trzeba natomiast znać jego schemat logiczny, od niego bowiem zależy, jakie wektory testowe należy podać na wejścia i jakie powinny być prawidłowe odpowiedzi układu na wyjściach.
Zilustrujmy to bardzo prostym przykładem. Niech testowanym układem będzie połączenie dwóch bramek pokazane na rysunku 6-2.
Rysunek 6 2. Testowany układ kombinacyjny
Przypuśćmy, że chcemy zbadać, czy w węźle D, który jest wewnętrznym węzłem układu, nie występuje uszkodzenie typu „stałe zero”. W tym celu staramy się w węźle D ustawić „1” - musimy podać wektor testowy, w którym A=„0” i B=„0”, a stan C jest nieistotny. Aby móc zaobserwować stan węzła D na wyjściu E, trzeba na wejście C podać „1”. Innymi słowy, wektor „00x” (x – stan nieistotny) zapewnia kontrolowalność węzła D dla ustawienia w nim „1”, zaś wektor „xx1” zapewnia obserwowalność stanu węzła D. Stąd test węzła D ze względu na uszkodzenie „stałe zero” wymaga podania wektora testowego „001”. Jeśli w węźle D występuje uszkodzenie „stałe zero”, na wyjściu pojawi się „1”, zaś w przypadku braku uszkodzenia na wyjściu pojawi się „0”. Podobnie, dla testu węzła D ze względu na „stałą jedynkę” trzeba podać jeden z wektorów: „011” lub „101” lub „111”.
Testowanie strukturalne ogromnie zmniejsza liczbę wektorów w porównaniu z wyczerpującym testem funkcjonalnym. Dla przetestowania strukturalnego omawianego układu wystarczają dwa wektory. W przypadku wyczerpującego testu funkcjonalnego potrzebne byłoby 23=8 wektorów. W przypadku rzeczywistych układów oszczędność jest daleko większa, bo często jeden wektor testowy testuje skutecznie więcej niż jeden węzeł. Na omówionej tu zasadzie działają generatory wektorów testowych – programy komputerowe określające optymalne sekwencje wektorów testowych dla układów o danym schemacie logicznym.
Testowanie strukturalne można stosować do układów cyfrowych realizowanych w różny sposób, nawet niekoniecznie w postaci układów scalonych. Istnieje jeszcze jeden sposób testowania układów cyfrowych, nadający się jednak tylko do testowania układów CMOS. Jest to testowanie prądowe (znane w literaturze anglojęzycznej jako „IDDQ testing”). Wykorzystuje się tu fakt, że prawidłowo skonstruowane i wykonane bramki CMOS pobierają prąd tylko w czasie przełączania. Gdy na wejściach panuje stan ustalony, bramki CMOS nie pobierają prądu (jeśli pominąć bardzo mały prąd podprogowy tranzystorów i prądy wsteczne złącz źródeł i drenów). Zdecydowana większość defektów, jakie mogą się pojawić w bramkach CMOS, prowadzi do tego, że istnieją takie kombinacje stanów na wejściach bramek, przy których bramki w stanie ustalonym pobierają prąd. Zatem, zamiast obserwować odpowiedzi układu na wyjściach, można badać pobór prądu. Po podaniu każdego wektora testowego należy odczekać, aż ustalą się stany na wyjściu i dokonać pomiaru prądu pobieranego ze źródła zasilania. Jeśli prąd ten jest o kilka rzędów wielkości większy od prądu w układzie działającym prawidłowo, to możemy mieć pewność, że w układzie występuje co najmniej jeden defekt.
Testowanie prądowe ma wiele zalet. Pozwala ono szybko i łatwo wykryć wiele uszkodzeń, które przy testowaniu strukturalnym wymagałyby podania bardzo długich sekwencji wektorów testowych. Pomiar prądu może być wykonywany wewnątrz układu, przez wprowadzenie do układu monitorów prądu – dość prostych układów, które śledzą pobór prądu w czasie pracy układu i sygnalizują przekroczenie jego progowej wartości oznaczającej wystąpienie uszkodzenia. Można więc testować układ w czasie jego normalnej pracy, co nie jest możliwe w przypadku testowania strukturalnego. Możliwe jest nawet budowanie układów samonaprawiających się. W takim układzie bloki funkcjonalne są zdublowane. W razie wykrycia przez monitor prądu, że w którymś bloku wystąpiło uszkodzenie, możliwa jest automatyczna rekonfiguracja układu przez odłączenie bloku uszkodzonego i podłączenie na jego miejsce bloku zapasowego. Możliwość ta jest jednak w praktyce bardzo rzadko wykorzystywana, bowiem układy scalone i bez tego cechują się bardzo wysoką niezawodnością, a zdublowanie wszystkich bloków oznacza podwojenie kosztu układu.
Testowanie prądowe i testowanie strukturalne nie zastępują się wzajemnie, lecz uzupełniają. Są bowiem takie uszkodzenia, których nie wykrywa testowanie prądowe, i takie, których wykrycie w testach strukturalnych wymaga bardzo długich sekwencji wektorów testowych. Ale nawet równoczesne zastosowanie obu sposobów testowania nie rozwiązuje do końca problemów testowania układów bardzo dużych i złożonych. W ich przypadku dla uzyskania dostatecznie wysokiego poziomu wykrywalności uszkodzeń potrzebne byłyby sekwencje wektorów testowych o długościach niemożliwych do zaakceptowania. Dlatego rozwinęły się metody projektowania układów łatwo testowalnych i samotestujących się. Jest o nich mowa w następnym punkcie.