\chapter{Defekty pamětí}
Pro dělení defektů pamětí vyjdeme ze struktury na obrázku \ref{fig:memory-basic}. Adresní dekodéry budou v textu chápány jako jediný blok. 

Defekty pamětí můžeme rozdělit na globální a lokální. Za globální defekt považujeme chybu, která postihne celou křemíkovou desku. Může jít například o vynechaný výrobní krok, případně odchylku parametrů mimo výrobní toleranci. Za lokální chyby považujeme chyby, které postihnou pouze malou oblast křemíkové desky. Může jít například o prachovou částici nebo jinou nečistotu, která se během výroby dostala na křemíkovou desku. V následujícím textu se zabýváme lokálními defekty.

\section{Defekty adresního dekodéru}
Defekty v adresním dekodéru (a to v řádkovém i sloupcovém) myslíme takové chyby,~kdy je pro operaci nad pamětí vybrána jiná paměťová buňka, než udává použitá adresa, případně není vybrána žádná. Rozlišujeme následující chyby:

\begin{enumerate}
  \item Zvolená adresa nepřistupuje na žádnou paměťovou buňku.
  \item Na paměťovou buňku nelze přistoupit žádnou adresou.
  \item Jedna adresa vybere dvě paměťové buňky.
  \item Dvě adresy přistupují na jednu paměťovou buňku.
\end{enumerate}

Tyto chyby se z pohledu detekce vyskytují vždy v párech, a to (1,2), (2,3), (1,4) a (3,4). Pro detekci těchto chyb postačuje přečíst všechny paměťové buňky ve stavech 1 a 0. 


Dále můžeme v CMOS technologii sledovat defekt označený jako ADOF\footnote{angl. Address Decoder Open Fault}\cite{IEEE-7803-5092-8/98}. Pro definici ADOF uvažujeme adresní dekodér dle schématu \ref{fig:memory-cmos-ad}. Pokud dojde k defektu naznačenému na obrázku \ref{fig:memory-cmos-ad} křížkem, adresní dekodér selže při klesající hraně na A1, kdy se výstup W0 nezmění a paměť přistoupí na starou adresu. Pro stimulaci chyby v tomto případě je třeba provést následující:
\begin{itemize}
  \item Zapsat $x$ na adresu 00.
  \item Zapsat $\overline{x}$ na adresu 10.
  \item Přečíst hodnotu na adrese 00. Hodnota $\overline{x}$ znamená chybu.
\end{itemize}

\image{fig:memory-cmos-ad}{
  \input{obrazky/adof.tex}
}{Defekt adresního dekodéru ADOF}

Pro stimulaci ADOF defektů postačuje test pro běžné chyby adresního dekodéru, ale adresní posloupnost musí obsahovat všechny možné přechody, při kterých dojde ke změně pouze jediného bitu adresy.

\section{Defekty paměťových buněk}

Popis defektu paměti se skládá ze dvou výrazů. První popisuje operaci, která chybu nad pamětí zcitliví. Druhá operace popisuje efekt, který má chyba na paměťovou buňku. Popis chyby zapíšeme jako $\left<S,F\right>$, kde S popisuje krok (nebo kroky) ke zcitlivění chyby a F její projev.
Použitý zápis je přebrán z článku \cite{IEEE-march-tests}.

\tabulka{tab:defect-gram}{
\begin{tabular}{ll}
  \hline
  \multicolumn{2}{c}{Stimulace - S} \\\hline
   L & logická hodnota uložená v paměti \\
   R & čtení paměti \\
   0 & zápis log. 0\\
   1 & zápis log. 1\\
   $\uparrow$ & zápis log. 1 do buňky obsahující log. 0 \\
   $\downarrow$ & zápis log. 0 do buňky obsahující log. 1\\
   $\updownarrow$ & zápis opačné hodnoty, než je nyní v buňce \\
   $\forall$ & libovolná operace \\
   $L_T$ & chyba, která se projeví po uplynutí doby na buňce v úrovni L\\
  \hline
  \multicolumn{2}{c}{Chybná hodnota - F}\\\hline
   0 & log. 0 \\
   1 & log. 1 \\
   L & původní hodnota buňky \\
  \hline
\end{tabular}}{Gramatika pro popis defektů na paměti}

Dále defekty paměťových buněk dělíme dle počtu zúčastněných buněk na defekty jediné buňky, vázané defekty a defekty citlivé na stav okolních buněk.

\subsection{Stack at fault}
Stack at fault (zkráceně SaF nebo SA0, SA1), jsou chyby, kdy defektní paměťová buňka vždy vrátí stejnou hodnotu bez závislosti na stimulaci. Principiálně jde o chyby $\left<\forall,0\right>$ a $\left<\forall, 1\right>$. Jde o nejčastější chyby \cite{IEEE-march-tests}.

Pro detekci postačuje zapsat a přečíst všechny paměťové buňky v obou stavech.

\subsection{Stuck open fault}
Stuck open fault (zkráceně SoF), je chyba, kdy paměťovou buňku nelze adresovat. Projev této chyby záleží na implementaci čtecích zesilovačů. Pokud neobsahují latch, projeví se jako SaF. Pokud čtecí zesilovač obsahuje latch, může dojít k opětovnému vrácení poslední čtené hodnoty. Chyba se pak projeví jako $\left<\forall, L\right>$.

Pro detekci musí testovací algoritmus během přístupu k jedné adrese přečíst hodnotu $x$ a $\overline{x}$. Tento krok je potřeba provést pro $x={0,1}$.

\subsection{Transition fault}
Transition fault (zkráceně TF) je chyba, kdy paměťová buňka nezvládne přechod ze stavu 0 do 1 nebo naopak. Jde o chybu $\left<\uparrow,0\right>\left<\downarrow,1\right>$. 

Chyba je popisem i detekcí velmi podobná SaF, jde ale o odlišné chyby. Testovací algoritmus, který pokryje TF, pokryl automaticky i všechny SaF.
Pro detekci je třeba provést přechod do obou stavů na každé buňce (0->1 a 1->0). Po obou přechodech je třeba provést čtení paměťových buněk.

\subsection{Destructive read}
Destructive read (zkráceně DR) je chyba, kdy dojde ke změně dat v paměti při čtecí operaci. U této chyby rozlišujeme dvě verze.

První verze je DR, kdy dojde k poruše dat a paměť vrátí chybnou hodnotu. Systematicky ji popíšeme jako $\left<R,\overline{L}\right>$. Test se provede stejně jako u SaF a TF.

Druhou verzí je dDR\footnote{angl. deceptive destructive read}. Při této chybě dojde k vrácení očekávaného výsledku při současném poškození dat uložených v paměti. Jde o chybu $\left<RR,\overline{L}\right>$. Pro test této chyby musí dojít k dvojnásobnému čtení paměti\footnote{angl. back-to-back read}.

\subsection{Data retention fault}
Data retention fault (zkráceně DRF) je chyba, kdy dojde po uplynutí určité doby ke změně hodnoty uložené v paměti. Jde o chyby $\left<1_T,0\right>$ a $\left<0_T,1\right>$. Jedna paměťová buňka může vykazovat obě chyby zároveň.

Pro detekci DRF je třeba testovací algoritmy rozšířit o zpoždění, které je potřeba použít pro obě úrovně testované buňky.

\subsection{Write disturb fault}
Write disturb fault (zkráceně WDF) je chyba, kdy dojde zápisem stejné hodnoty do paměťové buňky k inverzi dat. Jde o chyby $\left<00,1\right>$ a $\left<11,0\right>$. 

Pro detekci chyb je třeba provést vícenásobný zápis dat do paměti pro oba stavy paměťové buňky.

\subsection{Coupling fault}
Coupling fault (zkráceně CF) je chyba, kdy operace nad jednou buňkou (tzv. agresor), kterou označíme jako $i$, poškodí data v jiné buňce (tzv. oběť\footnote{angl. victim}), kterou označíme jako $j$. Rozlišujeme tři typy:

\begin{itemize}
  \item Inversion coupling (CFin). Jde o chyby, kdy zápis dat do paměťové buňky $i$ vyústí ve změnu dat v paměťové buňce $j$. Jde o chyby $\left<\uparrow_i,\downarrow_j\right>$ a $\left<\downarrow_i,\uparrow_j\right>$. Obě chyby můžou existovat zároveň nad jedním párem $i$, $j$ buněk.
  \item Idempotent coupling (CFid). Jde o chyby, kdy po zápisu dat do paměťové buňky $i$ dojde ke změně paměťové buňky $j$ do hodnoty $0$ nebo $1$. Jde o chyby $\left<\uparrow_i,0_j\right>$, $\left<\downarrow_i,0_j\right>$, $\left<\uparrow_i,1_j\right>$ a $\left<\downarrow_i,1_j\right>$. 
  \item State coupling (CFst). Jde o chybu, kdy buňka $i$ ve stavu $0$ nebo $1$ vynutí konstantní hodnotu v buňce $j$. Jde o chyby $\left<0_i,0_j\right>$, $\left<0_i,1_j\right>$, $\left<1_i,0_j\right>$ a $\left<1_i,1_j\right>$.
\end{itemize}

%Plný test všech možných CF je jistě časově náročný a nepraktický.\footnote{Protože je nutnmo přečíst a zapsat všechny paměťové buňky ve všech kombinacích ostatních buněk. Složitost $O(n\cdot{}2^n)$.} Pokud nedochází k maskování chyb, stačí v testu zapsat a přečíst všechny paměťové buňky v obou stavech. Tento test je třeba následně ještě zopakovat pro opačnou adresní posloupnost. 
Pro analýzu pokrytí CF chyb je rozdělíme na dvě části podle poloh buněk $i$, $j$, tj. kdy agresor je na nižší adrese a kdy je agresor na vyšší adrese. Následně sledujeme, v jakých stavech se nachází buňky $i$, $j$ při čtecích operacích. 

\subsection{Pattern sensitive faults}

Pattern sensitive faults je chyba paměťové buňky, která se projeví pouze při vhodných hodnotách ostatních buněk změnou stavu testované paměťové buňky. Množinu ostatních paměťových buněk často omezíme pouze na sousední paměťové buňky. Proto je třeba pro testování znát fyzické rozdělení paměti na čipu. 

Pro test každé buňky by bylo potřeba projít všech $2^8$ kombinací okolních buněk, což představuje vysokou časovou zátěž. Pro zjednodušení jsou zavedena omezená okolí buňky - čtyřokolí a dvouokolí. Typicky je pro test použito dvouokolí, označované jako šachovnice\footnote{angl. checkerboard pattern}. To umožní pokrýt omezenou množinu NPSF\footnote{zkratka z angl. Neighbourhood pattern sensitive fault}

\subsection{Linked faults}
Za linked faults (vázané chyby) označíme takovou n-tici chyb (typu CF nebo NPSF), která ovlivňuje stejnou cílovou buňku. V takovém případě dojde k maskování chyb paměťové buňky a paměť se může zdát bezchybná i přesto, že obsahuje chyby. Většina testovacích algoritmů detekuje pouze některé vázané chyby. 

\section{Defekty čtecí a zápisové logiky}

Statické defekty čtecí a zápisové logiky paměti považujeme za pokryté pomocí testů paměťových buněk, kde každou paměťovou buňku čteme v hodnotě 0 i 1. 

Na čtecí logice můžeme pozorovat problém doby zotavení (angl. recovery time), kdy po velkém počtu čtení stejné hodnoty dojde při prvním čtení buňky obsahující opačnou hodnotu k přečtení nesprávné hodnoty. 
