Zobrazují se příspěvky se štítkemtestování. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemtestování. Zobrazit všechny příspěvky

pátek, prosince 07, 2007

Not so Test Driven...

Tuhle jsem tu psal o tom, jak mě BVer uvrtal do unit testování, a věcí okolo. Dokonce jsem na sobě zkoušel praktikovat i Test Driven Development, a nějak bych rád shrnul, co jsem zjistil.

Především chci říct, že když jsem báječný svět unit-testů objevil, říkal jsem si, jak jsem asi tak tisíc let za opicemi, a že tohle přeci musí používat každý člověk s trochou sebeúcty. Myšlenka testovat kód po malých částech ještě před tím, než zapomenete co má přesně dělat, nebo dokonce zjistit co a jak má dělat tím, že napíšete testy je tak skvělá a samozřejmá, že jsem byl zklamán, že mě nenapadla samotného.

Jaké bylo moje rozčarování, když jsem zjistil, že testování na úrovní nějakých malých komponent není vůbec samozřejmé, a že dokonce velká část lidí, kteří se živí programováním se k němu staví negativně, nebo dokonce odmítavě, a celkově v něm nevidí žádný užitek. Zkoušel jsem několika lidem několikrát opatrně vysvětlit, že čím dřív na chybu přijdou, tím dřív a rychleji ji odstraní, a i když unit testování není samospasitelné, že je to skvělá věc, a že by se jí měli věnovat.

Dokonce jsem i byl skoro úspěšný, když jsem jednoho (teď už bývalého kolegu) přesvědčil, aby si pár testů napsal. Čekal jsem, jak za mnou přiběhne s velkou krabicí belgických bonbónů, bude mi děkovně třást rukama a radostně poskakovat a povykovat, o kolik rychleji teď programuje a jak se kvalita jeho práce zvýšila a tak dále a tak podobně. Místo toho asi po třiceti minutách přišel s velmi správnou otázkou: "No a co mám jako dělat s tou databází?" I neváhal jsem, a začal ho zasvěcovat do tajů mock objektů, které okopírují rozhraní takové databáze, ale nebudou ve skutečnosti dělat nic jiného, než že na předem připravené otázky dají předem připravené odpovědi, načež zkontrolují, zda se jeho kód chová správně, a jeho kód zjistí jestli umí správně reagovat na divné stavy, do kterých se taková databáze může dostat. Čím déle jsem hovořil, tím víc zíval, až nakonec odešel, a o testování jsem od té doby spolu nemluvili.

Nerozuměl jsem tomu, protože napsat si mock-objekt na sériový port (ten z .NET) pro mě bylo opravdu zábavné, i když mi to, pravda, nějakou tu hodinku trvalo, a fakt, že jsem pak mohl pěkně ozkoušet co udělá celé komunikační rozhraní, které jsem tehdy psal, když místo očekávané zprávy přijde nějaká úplně jiná, mi pomohlo zkrátit ladění na pár desítek minut. Ještě méně jsem rozuměl odporu některých lidí, kteří se zabývají vývojem embedded aplikací, zvlášť když neměli k dispozici pořádný debugger.

Samozřejmě, že testování není zadarmo. Psát testy je někdy vážně nuda (třeba set/get metody s trochou logiky), někdy je to vyloženě masochismus (jednou jsem zkoušel, kolik úsilí by mě stálo dosáhnout 100% pokrytí kódu testy a vážně to nestálo za to, protože některé obzvláště vypečené chybové stavy je těžké vyvolat bez toho, abyste neomockovali půl operačního systému), nicméně celkově se rozumná míra testování vyplatí.

Projekt na kterém teď pracuji je poměrně agresivně naplánován, a popravdě, když jsem padesát minut psal mock na třídu zapisující do registrů, říkal jsem si, jestli to stojí za to. Nakonec se ukázalo že ano, protože jsem pak asi za deset minut odladil kód, který ten zapisovač používal, přičemž jsem odhalil asi pět velmi vypečených chyb, které by mě jinak stály spoustu ladění (určitě nejméně padesát minut, protože než bych na ně přišel, dávno bych zapomněl co jsem vlastně původně chtěl, aby kód dělal).

Rovněž jsem nabyl nezvratného přesvědčení, že i když TDD není pro mě (prostě nedokážu psát testy nasucho dopředu -- potřebuji alespoň nějaký kód, který pak třeba celý přepíšu, ale který mi dá vizuální představu jak bude celá věc fungovat a interagovat s okolím), jeho alespoň podvědomé používání vede k psaní lepších programů, které jsou lépe rozparcelovány, méně navzájem provázány, snáze udržovatelné, jednodušeji rozšiřitelné a tak dále. Myslím tím takové ty věci jako předávání objektů konstruktory, vyhazovaní výjimek, rozumné použití dědičnosti, využívání interfaců (interface nebo čistě abstraktní třída je grunt -- bez interfaců nikdy nemůžete vyměnit jeden objekt za druhý, resp. skutečný za mock) a podobné věci.

Chtěl jsem říct asi toto: jsem daleko od nejlepšího žáka Martina Fowlera, ale i když mám někdy pocit, že bych se měl na testování vykašlat, a raději smolit produkční kód, za který si zákazníci platí, vždycky se nakonec ukáže, že kdo testuje, ten vyhraje. A proto (spolu s klasikem) volám: Lidé, testujte!

neděle, září 10, 2006

Trimování

Uvědomil jsem si, že jsem v příspěvku o testování IO zanedbal jednu podstatnou část, kterou je trimování. Trimování se týká především analogových obvodů, a jde při něm o tohle: Mějme proces, který je po měsících a letech používání nějak nastaven. Jako u všeho, jde i u takového procesu o kompromis mezi různými tlaky jako jsou třeba rychlost odezvy a přesnost.

Otázka zní: Jak to zařídit, abychom při stejném nastavení procesu dosáhli lepší hodnoty některého parametru? Řekněme, že se zabýváme lineárním regulátorem napětí (taková ta věc, která zajistí, že z baterie ve vašem mobilním telefonu dostanete po většinu doby konstantní napětí), a chceme dosáhnout odchylky výstupu přes všechny čipy na všech křemíkových deskách třeba +/-1%. Doladit proces na takovou úrověň je jistě možné, ale je otázka, jestli je žádoucí vyměňovat kvůli tomu polovinu vybavení zaběhnuté linky a zvyšovat nároky na přesnost fotolitografie, iontové implantace a takových podobných těžko pochopitelných věcí.

Není snazší být chytrý, a místo ladění procesu součástku nenápadně doladit při testování? Chci říct: pokud změříme, že místo 1.1 voltu ze stabilizátoru leze 1.15, je jistě lepší rafinovaně doladit nějaké součásti obvodu, než se mučit laděním procesu. A právě takovému ladění parametrů se říká trimování.

Existuje několik možností jak zvýšení přesnosti dosáhnout, nicméně všechny předpokládají, že obvod obsahuje nějaké ty komponenty navíc, jako třeba extra napěťový dělič, jehož jednotlivé stupně lze při testování "zapínat".

"Zapínaní" něčeho v integrovaném obvodu znamená jednu ze tří možností: spoje, které jsou vodivé se stanou nevodivými, nebo spoje které jsou nevodivé se stanou vodivými, nebo se vodivost spojů změní lineárně. Dosáhnout toho lze takto: nechť na čipu existuje napěťový delič (znáte to ze základní školy -- dva rezistory v sérii, na jejich sériovou kombinaci se přivede napětí, z jednoho z nich se napětí odebírá). Nechť jeden rezistor je ve skutečnosti složen z několika rezistorů (pokud možno takových, aby se při připojování a odpojování jednotlivých rezistorů měnilo výstupní napětí ve zlomcích mocniny dvou). Nechť aktivní je na čerstvě vyrobeném čipu jen jeden z těchto rezistorů, zatímco další jsou zkratovány kovovou spojkou (třeba napařeným hliníkem). Oba konce těchto spojek nechť jsou vyvedeny na pady, ke kterým lze připojit hroty testovacího přípravku.

Než se ztratíme ve všech těch nechť, řekněme rovnou, že cílem je propálit takovou spojkou proudovým impulsem.

Postup je pak následující: změříme hodnotu napětí na výstupu čipu. Podle známého vztahu (definovaného pro daný obvod) odvodíme, které rezistory odporového děliče je potřeba aktivovat (tedy propálit spojku zkratující takový rezistor). Na spojku určenou k propálení připojíme přes FET nabitý kondenzátor, který do ní vybije svůj náboj, což se neobejde bez velkého proudu, který tu titěrnou spojku zahřeje tak, že kov, kterým je tvořena se odpaří. Et voilá, odporový dělič změnil svůj převodní poměr a výstupní napětí stabilizátoru/regulátoru se deterministicky změnilo v závislosti na tom, kterou spojku jsme právě propálili.

Tak jednoduché to je!

Samozřejmě, že použití kovové spojky je velmi stará technologie, kterou lze nahradit různými jinými udělátky, jako jsou například zenerovy diody (které se průrazem znevodiví) nebo EEPROM připojená ke spínacím tranzistorům, která se naprogramuje sériovým rozhraním (opravdovou lahůdkou pak je laserové trimovaní, které laserovým paprskem odpaluje kusy rezistivní plošky na čipu, čímž mění její rezistivitu jaksi přímo, ale přiznejme si to -- kdo by chtěl dneska zaměřovat nějaký laser, a plýtvat místem na čipu, když můžete přidat pár buněk FLASH nebo EEPROM paměti a pohodlně si hodnotu naprogramovat).

Takto tedy vypečení výrobci integrovaných obvodů dosáhnou toho, že bez ohledu na výchylky procesu jsou všechny čipy (skoro) jeden jako druhý, nebo že procesory mají aktivovány jen některé části cache (nebo celá výkonná jádra), podle toho, jak prošly testováním. Tedy: pokud je jeden blok cache vadný, je odpojen, a procesor se za méně peněz prodá skromnějším zákazníkům, nebo se určí, že bude použit v PLAYSTATION 3, protože má jedno jádro nefunkční a při výtěžnosti 20% by byl hřích ho vyhodit...

PS: Pěkný souhrnný text o trimování lze najít třeba u Analog Devices.

pondělí, července 31, 2006

Testování

V jakési diskusi jsem teď nedávno četl bezelstný dotaz, jak lze testovat integrované obvody na křemíkové desce (waferu). I napadlo mě, že by nemuselo být špatné zúročit ty čtyři roky zkušeností v polovodivém průmyslu a informovat širokou veřejnost o tom, jak vlastně funguje finální fáze výroby polovodivých součástek, zejména jejich testování.

Nuže: Mějme hotový wafer, na kterém jsou po desítkách hodin, které (od chvíle, kdy jej uřízli z monokrystalického ingotu diamantovou pilou) strávil ve výrobním procesu, hotové polovodivé součástky toho či onoho typu. Takový wafer by měl obsahovat a) testovací struktury, b) čipy.

Testovací struktury jsou zajímavé pro všelijaké mechanismy statistického řízení procesu, a obsahují takové ty základní součástky, jako je tranzistor, tranzistor vydávající se za rezistor, tranzistor vydávající se za kapacitor, rezistor, kapacitor, nějaká ta dioda a tak podobně. Smyslem testovacích struktur je, umožnit sledování stability výrobního procesu (existuje nepřeberné množství výrobních procesů, které polovodivé firmy žárlivě střeží a které umožňují výrobu různých druhů struktur s různými parametry, nicméně v zásadě je takový proces receptem, nebo sadou nastavení strojů, které se podílejí na výrobě čipů), což má za důsledek schopnost vyrábět podle pravidel 6-sigma (což znamená, že směrodatná odchylka procesu se musí do tolerančního pole vejít šestkrát, což by mělo znamenat, že zmetek vyrobíte jednou za milión kusů; ve skutečnosti se spíše používá pravidel lean 6-sigma, která jsou ještě tvrdší), a tudíž být na trhu vůbec konkurenceschopným (vysoká zmetkovost znamená nárust ceny čipu, protože náklady na výrobu waferu jsou konstantní).

Testovací struktura nemá smysl bez testování, čili prvním testováním je testování testovacích struktur. Každý prvek takové struktury je připojen k padům (česky asi nejlépe připojovací ploška, tedy čtvereček nebo obdélnícěk z nějakého vodivého kovu). Na tyto pady se lze připojovat pomocí speciálních pružných hrotů (jehel), které jsou různým způsobem (připájeny k PCB, osazeny do speciálního epoxidového kroužku, zasazeny jako stlačitelné piny do nějaké matrice atp.) připojeny k testovacímu zařízení, kterému se říká tester. V této fázi jde nejčastěji o zařízení vybavené co nejvíce čtyřkvadrantovými zdroji, které umožňují změřit co nejrychleji co nejvíce testovacích struktur a zjistit tak, zda se jejich vlastnosti od polední várky (neb výroba integrovaných obvodů je várková výroba, při které se nezpracovávají jednotlivé desky, ale celé sady -- loty -- desek) nezměnily, eventuálně zda nenastal problém někde při výrobě této konkrétní várky. (Podotknu ještě, že desky bývají označené kódy, podle kterých lze většinou přesně dohledat kdy se která sada/deska nacházela v jaké fázi výrobního procesu.)

Nuže, zeptá se zvídavý čtenář, jak se vlastně ty hroty dostanou na správné místo, aby dosedly přesně do plošek velkých sotva několik mikrometrů? Odpověď je snadná: nijak. Při hrotovém testování neputuje měřící zařízení, ale wafer. Ano, ano. Wafer se usadí a podtlakem zajistí na pohyblivý stolek, který se pak pohybuje pod meřícími hroty a pozicuje desku tak, aby bylo dosaženo ideálního propojení. Samozřejmě to vyžaduje sofistikovaný systém pro orientaci waferu na stolku (stolek se otáčí podle potřeby doprava a doleva), který pomocí rozpoznávání obrazu hledá nějaké význačné struktury na desce/čipech, a snaží se dosáhnout správné orientace vůči souřadnicovému systému testovacích hrotů, a také alespoň základní řízení přítlaku desky na hroty. Celý ten krásny stroj, který pohybuje deskou se jmenuje prober (neboli krokovač). Existují různé systémy pohybu stolku od lineárních krokových motorů pohybujících stolkem plovoucím na vzduchovém polštáři nad drážkovanou deskou, až po různé soustavy ozubených řemenů, ke kterým je stolek připojen.

Vyzbrojeni proberem tedy operátoři založí kazetu s čipy do stoje, který si pak sám podává a orientuje křemíkové desky, přečte si jejich výrobní čísla, připojí příslušné struktury k testovacím hrotům, dá signál testeru, který provede odměr, je-li jich více, projede další testovací struktury na waferu a nakonec wafer vloží do výstupní kazety.

Tím se elegantně dostáváme k testování čipů. Ty se hrotově testují úplně stejně jako testovací struktury, jen na mnohem vyšší logické úrovni, nejčastěji s jinými testery a zcela určitě s jinými testovacími přípravky. Požadavky na testování (obecně) jsou: 1) co nejkratší čas (a tudíž nejmenší cena), 2) co nejlepší pokrytí funkcí součástky testy, 3) co nejlepší opakovatelnost a reprodukovatelnost testů. Jako v každém jiném testování, jdou i v testování polovodičů tyto požadavky proti sobě. Čas testování lze zkracovat snižováním přesnosti a pokrytí, pokrytí lze zvětšovat přidámím testů, které stojí čas, stejně jako zvyšování přesnosti pomocí průměrování (AD převodníky v testeru trpí různými druhy šumů, které lze průměrováním potlačit) nebo lepších testovacích metod.

Jistou pomoc nabízí tzv. multisite testování, které, jak správně tušíte, spočívá v tom, že na testovacím přípravku zopakujete testovací hroty (a související elektroniku pomáhající testeru) vícekrát, typicky v mocninách dvou, takže se najednou testuje ne jeden ale dva, čtyři, nebo i šestnáct nebo více čipů. To samozřejmě klade větši nároky na vybavení testerů, přesnost a schopnosti proberu, kvalitu hrotů a asi tisíc dalších věcí. V neposlední řadě také na design testovacích přípravků. Ty musí být navrženy tak, aby se dokázaly vypořádat s přeslechy mezi jednotlivými sity (ó ano, jsou situace, kdy proudy dokáží proudit i přes potenciálové bariéry mezi jednotlivými čipy), se situacemi, kdy jeden nebo více čipů v testované skupině bude vadných, nebo budou na okraji desky (kde jsou neúplné čipy), a tak podobně.

Výsledkem testování čipu je seznam změřených parametrů (u analogových obvodů), nebo odpovědi na vstupy (u digitálních obvodů) a zpráva, zda čip testem prošel nebo neprošel. Z měření vznikají jednak mapy desek, které označují ve kterém místě na desce jsou čipy dobré a kde jsou špatné, jednak datalogy, které skupina pověřených jedinců zevrubně analyzuje a zkoumá kde se vrbí nějaký problém, nebo kde lze díky dobré distribuci předehnat konkurenci a nasadit na parametr tvrdší limit. V některých případech se čipy rozdělují do skupin, podle toho do jakého tolerančního pásma padle některý parametr (lze tak vytestovat čipy se zaručeně lepšími parametry, které stojí víc, protože metodika testování je složitější a tudíž dražší, nebo proto, že na konkrétní parametr je problematická výtěžnost).

Tím se dostáváme k nejdůležitějšímu parametru při výrobě integrovaných obvodů: výtěžnosti. Výtěžnost je číslo, které udává, kolik procent čipů na desce bylo plně funkčních. Jak jsem už řekl, je cena výroby waferu konstatní, proto je důležité mít výtěžnost co nejlepší (a také neustále zvětšovat wafery a zmenšovat čipy). Je nutné si uvědomit, že ve výtěžnosti se projevují dvě věci: zaprvé proces a jeho odchylky/poruchy, zadruhé samotné testování. Můžete mít jak chcete dobrý proces, ale se špatnými testy (tedy testy, které nejsou schopny tisickrát, nebo i milionkrát po sobě měřit to samé -- nebo skoro to samé a to i na různých testerech, které podléhají vlastní kalibraci a ujíždění parametrů) z něj udělá naprostou katastrofu.

Navíc hrotové testování není poslední: po něm následuje ještě finální testování, které se provádí na zapouzdřených čipech. Tedy: křemíkové desky se diamantovou pilou nařežou na jednotlivé čipy. Pak se podle mapy dobrých čipů jednotlivé čipy přiletují k rámečku s vývody, kouzelný stroj, kterému se říká bondovačka propojí jednotlivé vývody s pady na čipu (ano, ano, i čipy mají pady), celé se to zalisuje do umělé hmoty, lisem rozstříhá, laserem označkuje.

Na final testu pak handler připojuje součástky k dalšímu testovacímu přípravku, který ověří, zda výsledný produkt odpovídá tomu, co prezentuje zákazníkům datasheet.

Prostě práce tesťáka je krásná a plná dobrodružství. Můžete třeba neopatrnou manipulací ohnout právě vybalené hroty za 700€ (což se mně podařilo), nebo špatným sekvencováním smahnout nějaký zdroj v testeru, jehož oprava stojí 2500USD a trvá tři neděle (to se povedlo někomu jinému), nebo se tetelit nad tím, když váš testovací balík správně otestuje kdoví kolik čipů za minutu s výtěžností 99.9%.