\chapter{Implementace}

\section{Bloková struktura}

Testovací march kontrolér můžeme systematicky rozdělit na dvě části, přičemž jedna se stará o interpretaci mikrokódu a řízení kontroléru a druhá zajišťuje přístup k~paměťovému poli. Toto rozdělení umožňuje přepoužít část logiky testovacího kontroléru a tím snížit nároky na implementaci a v~konečném důsledku uspořit plochu křemíkového čipu. Bloková struktura je na obrázku \ref{fig:test-ctrl-block}.

\image{fig:test-ctrl-block}{
  \input{obrazky/test-ctrl-block.tex}
}{Blokové rozdělení testovacího kontroléru}

\subsection{Vnější rozhraní kontroléru}
%Pro řízení BIST kontroléru je využito rozhraní sestávající  z následujících signálů:
Rozhraní pro ovládání BIST kontroléru sestává z následujících signálů:
\begin{itemize}
  \item BISTE -- vstup -- povolení testovacího kontroléru a spuštění testu.
  \item DLY\_CLK -- vstup -- hodinový signál udávající dobu čekání pro delay operaci.
\end{itemize}
Pro zjištění výsledku testu se použijí následujíci dva signály:
\begin{itemize}
  \item FAIL -- výstup -- v případě, že \texttt{FAIL = 1}, kontrolér našel v testované paměti chybu.
  \item DONE -- výstup -- kontrolér prošel celý mikroprogram a zastavil se.
\end{itemize}
Časování těchto signálů je vidět na obrázku \ref{fig:bist-timing}.

\image{fig:bist-timing}{
\begin{timing}{1.8cm}
  \tin{1}{BISTE}
  \tin{2}{DLY\_CLK}
  \tin{3}{FAIL}
  \tin{4}{DONE}

  \til{1}{LLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLL}
  \til{2}{HHLLHHLLHHLLHHLLHHLLHHLLHHLLHHLLHHLLHH}
  \til{3}{HHHHLLLLLLLLLLLLLLLLLLLLLLLLLVVVVVHHHH}
  \til{4}{LLLLLLLLLLLLLLLLLLLLLLLLLLLLLHHHHHLLLL}

  \tnote{3}{29}{Result}
\end{timing}
}{Časování signálů BIST kontroléru}

V případě neúspěchu testu je také nezbytné mít k dispozici diagnostické rozhraní, pomocí kterého můžeme detailněji analyzovat chybu. Jde o velmi jednoduché sériové rozhraní přirovnatelné k SPI. Signály jsou následující:
\begin{itemize}
  \item SEN -- vstup -- povolení sériového přístupu
  \item SCLK -- vstup -- hodiny sériového rozhraní
  \item SDI -- vstup -- sériový vstup dat
  \item SDO -- výstup -- sériový výstup dat
  \item SME -- vstup -- provedení vybrané operace nad pamětí
\end{itemize}
SDI je vzorkované na nástupné hraně signálu SCLK. Data na SDO jsou stabilní při sestupné hraně hodin. Časování je na obrázku \ref{fig:bist-serial-timing}. Malými písmeny jsou označeny hodnoty vyčítané z BIST kontroléru. Příklad je uveden pro čtyřbitovou adresní i datovou sběrnici. Přejít do sériového řízení bude možno ihned po skončení testu.

\image{fig:bist-serial-timing}{
\begin{timing}{1.8cm}
  \tin{1}{SEN}
  \tin{2}{SCLK}
  \tin{3}{SDI}
  \tin{4}{SDO}
  \tin{5}{SME}

  \til{1}{LLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH}
  \til{2}{LLHHLLHHLLHHLLHHLLHHLLHHLLHHLLHHLLHHLLLLLLHH}
  \til{3}{VVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVVXVV}
  \til{4}{VVVVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVXVVVXV}
  \til{5}{VVVVLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLHHLLLL}

  \tnote{3}{5}{RA0}
  \tnote{3}{9}{RA1}
  \tnote{3}{13}{CA0}
  \tnote{3}{17}{CA1}
  \tnote{3}{21}{D0}
  \tnote{3}{25}{D1}
  \tnote{3}{29}{D2}
  \tnote{3}{33}{D3}
  \tnote{3}{37}{$R/\overline{W}$}
  \tnote{3}{42}{RA0}

  \tnote{4}{ 7}{ra0}
  \tnote{4}{11}{ra1}
  \tnote{4}{15}{ca0}
  \tnote{4}{19}{ca1}
  \tnote{4}{23}{d0}
  \tnote{4}{27}{d1}
  \tnote{4}{31}{d2}
  \tnote{4}{35}{d3}
%  \tnote{2}{37}{$R/\overline{W}$}
  \tnote{4}{39}{ra0}
\end{timing}
}{Časování signálů pro sériový přístup k paměti pomocí BIST kontroléru.}

\subsection{Řízení BIST kontroléru}

Blok je implementovaný v souboru \texttt{mbist\_ts\_core}. Jde o část BIST, která sdružuje bloky, které jsou znovupoužitelné pro více pamětí.

\subsection{Řádkový a sloupcový čítač}
Jde o čítače paměťové adresy (řádkové a sloupcové) pro march mikroprogram. Tyto dva tvoří dohromady adresní čítač. Jsou takto rozděleny,  aby mohl algoritmus přistupovat k paměti po sloupcích nebo po řádcích.
Pro tyto čítače platí volnost march algoritmu. Jejich implementací se podrobněji zabývá kapitola \ref{sec:counters}.

Čítač je implementovaný v modulu \texttt{mbist\_adr\_cnt}.

\subsection{Čítač šířky datového slova}
Jde o čítač pro smarch režim. Tento čítač odpočítává počet operací čtení/zápisu v jedné mikroinstrukci. Jedná se o obyčejný binární čítač se zkráceným cyklem.

Čítač je implementovaný v modulu \texttt{mbist\_ncnt}.

\subsection{Mikrokód}

Paměť s mikrokódem je implementována jako nejmenší \splithyphens{}look-up\standardhyphens tabulka o délce $2^n$. Popisu mikrokódu se věnuje kapitola \ref{sec:microcode}.

\subsection{Řízení}
Jde o logiku implementovanou v modulu řízení BIST kontroléru. Jedná se o:
\begin{itemize}
  \item Detekci náběžné hrany na signálu SCLK
  \item Generování výstupních signálů FAIL a DONE
  \item Generování šachovnicového vzoru
\end{itemize}

Pro komunikaci s jednotlivými interface pamětí využívá blok řízení rozhraní \texttt{TS2MAI} a \texttt{MAI2MAI}.

\texttt{TS2MAI} je použito k signalizování žádaných operací a adres, na kterých má být provedena. Skládá se z následujících signálů:

\begin{itemize}
  \item \texttt{col\_addr} -- aktuální řádková adresa
  \item \texttt{row\_addr} -- aktuální sloupcová adresa
  \item \texttt{op} -- aktuální operace prováděná nad pamětí 
  \item \texttt{op\_dly} -- operace prováděná v minulém kroku
  \item \texttt{data} -- datový vektor k použití 
  \item \texttt{sdi} -- signál \texttt{SDI}
  \item \texttt{sclk\_edge} -- hrana na SCLK signálu pro sériový přístup
  \item \texttt{sme} -- signál \texttt{SME}
  \item \texttt{sen} --  signál \texttt{SEN}
  \item \texttt{biste} -- signál \texttt{BISTE} 
\end{itemize}

\texttt{MAI2MAI} se využívá pro zapojení jednotlivých interface pamětí do jednoho řetízku. Tohoto uspořádání se využívá pro sériový přístup k paměti a testy pracující v smarch režimu. Skládá se z následujících signálů:

\begin{itemize}
  \item \texttt{sd} -- sériová data mezi interface pamětí
  \item \texttt{fail\_c} -- byla detekována chyba na paměti
  \item \texttt{stall\_c} -- požadavek na pozdržení testovací sekvence
\end{itemize}

\subsection{Interface paměti}

Interface paměti zajišťuje generování testovacích dat a jejich verifikaci v normálním módu. Pokud BIST kontrolér pracuje v módu smarch nebo sériového přístupu k paměti, chovají se moduly pouze jako posuvný registr.

Interface paměti také musí řešit přístup na neexistující adresu paměti. Tento problém vzniká při použití jediného bloku řízení BIST kontroléru pro více pamětí.

Každý interface paměti má vstup a výstup sběrnice \texttt{MAI2MAI}. Tato sběrnice musí být zapojena podle obrázku \ref{fig:mai2mai-internal}.

\image{fig:mai2mai-internal}{
  \input{obrazky/mai2mai}
}{Zapojení MAI2MAI interface uvnitř modulu interafce paměti}{}

\section{Mikrokód}
\label{sec:microcode}
Nejjednodušší implementace mikrokódu vychází přímo z march zápisu převedeného do bitové podoby \ref{tab:simplest-march-mc}. Konec programu je v tomto případě detekován jako přetečení adresy mikrokódu. Kratší mikroprogramy musí být tedy doplněny výplňovými instrukcemi do délky $2^n$. 

\tabulka{tab:simplest-march-mc}{
\begin{tabular}{ll}
  \hline
  Číslo bitu & Význam \\\hline
  0 & Adresace vzestupně/sestupně \\
  1 & Operace čtení/zápis \\
  2 & Slovo 0/1 \\
  3 & Konec smyčky (konec march elementu) \\ 
  \hline
\end{tabular}
}{Nejjednodušší mikrokód}

\FloatBarrier
Tento mikrokód však není vhodný pro implementaci a je omezující pro march testy. Omezení plyne z možnosti využít pouze jediný pár slov pro test paměti a nemožnosti využití šachovnice pro test NPSF. Dále se dá ušetřit na logice řadiče, pokud se rozhodneme na návrat ve smyčce uvést přímo adresu a nevyužít registr s návratovou adresou. Příklad takového mikrokódu je v tabulce \ref{tab:simple-march-mc-return-address}. V této tabulce ve sloupci číslo bitu n označuje počet bitů pro identifikaci datového slova a m udává počet bitů pro šířku adresy mikrokódu.

\tabulka{tab:simple-march-mc-return-address}{
\begin{tabular}{ll}
  \hline
  Číslo bitu & Význam  \\\hline
  0 & Adresace vzestupně/sestupně \\
  1 & Operace čtení/zápis \\
  2 & Generování šachovnice \\
  3\dots{}n+3 & Identifikace použitého slova  \\
  n+4 & Konec smyčky (konec march elementu) \\
  n+5\dots{}n+5+m & Návratová adresa \\
  \hline 
\end{tabular}
}{Mikrokód rozšířený pro více různých datových slov a návratovou adresu}

Při rozdělení adresních čítačů je vhodné mít možnost je využít nezávisle na sobě pro adresaci \uv{po řádcích} nebo \uv{po sloupcích}. Také je třeba implementovat podporu pro smarch algoritmy. Návrh mikrokódu je v tabulce \ref{tab:microcode}. Tento mikrokód neomezí implementaci march a smarch testovacích algoritmů. Široké mikroinstrukce umožní použití jednoduché řídicí logiky v MBIST kontroléru. Samotnou implementaci mikrokódu look-up tabulkou zjednoduší syntéza na minimální rozměr.\footnote{Očekáváme povolenou optimalizaci přes hranice buněk.}

\tabulka{tab:microcode}{
\begin{tabular}{lp{95mm}}
  \hline
  Číslo bitu & Význam  \\\hline
  0 & Povolení čítání řádkové adresy \\
  1 & Nulování řádkové adresy \\
  2 & Čítání řádkové adresy nahoru/dolu \\
  3 & Povolení čítání sloupcové adresy \\
  4 & Nulování sloupcové adresy \\
  5 & Čítání sloupcové adresy nahoru/dolu \\
  6 & Generování šachovnice \\
  7 & Operace zápis/čtení (v případě \texttt{SMARCH = 1} data k zápisu) \\
  8\dots{}n+8 & Testovací datový vektor (v případě \texttt{SMARCH = 1} očekávaná data) \\
  n+9 & Operaci provést v smarch režimu \\
  n+10\dots{}n+10+m & Návratová adresa \\
  n+11+m\dots{}n+11+m & Podmínka ukončení smyčky \\\hline
\end{tabular}
}{Mikrokód rozšířený o adresaci \uv{po sloupcích} a \uv{po řádcích} a o podporu smarch algoritmů}

Pro implementaci mikrokódu byl nakonec zvolen mikrosequencer. Mikrokód tak byl rozšířen o adresu, kam se má skočit, pokud podmínka neplatí. Implementovanou verzi mikrokódu popisuje tabulka \ref{tab:microcode-final}.
Identifikace použitých dat pro operaci march algoritmu musí být alespoň 3-bitová, protože se stejný vektor používá i pro data pro smarch operaci.
V takovém případě nultý bit udává data zapisovaná do paměti a první bit udává očekávaná čtená data. Druhý bit umožňuje ignorovat výsledek čtecí operace.

\tabulka{tab:microcode-final}{
\begin{tabular}{llp{70mm}}
  \hline
  Číslo bitu & Typ & Význam  \\\hline
  0 &std\_logic  & Směr čítání sloupcové adresy \\
  1 &std\_logic  & Nulování sloupcové adresy \\
  2 &std\_logic  & Povolení čítání sloupcové adresy \\
  3 &std\_logic  & Směr čítání řádkové adresy \\
  4 &std\_logic  & Nulování řádkové adresy \\
  5 &std\_logic  & Povolení čítání řádkové adresy \\
  6 &std\_logic  & Generování šachovnice podle sloupce \\
  7 &std\_logic  & Generování šachovnice podle řádku \\
  8,9 &t\_OPERATION& Operace nad pamětí \\
  10,11,12  &t\_DATA\_IDX& Data použitá při operaci \\
  13,14  &t\_CONDITION& Podmínka pro skok \\
  15,15+n  &t\_MC\_ADDR & Odkaz na další adresu v případě, že podmínka neplatí \\
  15+n+1, 15+2n  &t\_MC\_ADDR & Odkaz na další adresu v případě, že podmínka platí \\
\end{tabular}
}{Použitá verze mikrokódu; n udává šířku adresy mikroinstrukce.}

\subsection{Zápis mikrokódu}
Pro zjednodušení zápisu mikrokódu bude využit jazyk umožňující popsat march a smarch algoritmy. Při jeho tvorbě vyjdeme z gramatiky march testu, těžko zapsatelné symboly nahradíme jednoduššími a rozšíříme o další možnosti:
\begin{itemize}
  \item Generování šachovnice pro pokrytí skupiny NPSF. Generování bude probíhat podle exkluzivního součtu nejméně významných bitů řádkové a sloupcové adresy. Dle jeho výsledku bude proveden zápis vybraného testovacího slova nebo jeho inverze.
  \item Možnost adresovat paměť po řádcích nebo po sloupcích. K tomuto využijeme fakt, že adresní dekodér je rozdělen na dvě části, které dokáží čítat nezávisle na sobě.
%  \item Možnost měnit adresu během jedné skupiny operací.
\end{itemize}

Význam symbolů pro zápis algoritmu je uveden v tabulce \ref{tab:march-text}.

\tabulka{tab:march-text}{
  \begin{tabular}{lp{90mm}}
    \hline
    Textový popis & Význam \\\hline
    \texttt{.(\dots)}  & Provedení operace pouze pro jednu adresu \\
    \texttt{V(\dots)}  & $\Downarrow\left(\dots\right)$ \\
    \texttt{\^{}(\dots)}  & $\Uparrow\left(\dots\right)$ \\
    \texttt{\^{}\_(\dots)}  & $\Uparrow\left(\dots\right)$ po řádcích \\
    \texttt{\^{}|(\dots)}  & $\Uparrow\left(\dots\right)$ po sloupcích \\
%    \texttt{\{\^{},V\}\{\_,|\}} & Změna adresy během jedné skupiny march operací \\
    \texttt{rx}  & $rx$ \\
    \texttt{wx}  & $wx$ \\
    \texttt{rcx} & $rx$ šachovnice \\
    \texttt{wcx} & $wx$ šachovnice \\
    \texttt{(wxry)\^{}n} & Provedení n operací v režimu smarch \\
    \texttt{(wcxrcy)\^{}n} & Provedení n operací v režimu smarch při současném generování šachovnice v~paměti\\
    \texttt{DELAY} & Zpoždění vložené do testovacího algoritmu \\
    \hline
  \end{tabular}
}{Textový zápis march algoritmů}

\section{Čítače}
\label{sec:counters}

\subsection{Binární}

Běžně se při implementaci march testů využívá obousměrný binární čítač. Takový čítač se skládá z úplných sčítaček (XOR3 a majoritní hradlo) a logiky, která volí vstupní datový vektor pro přičítání $+1$ nebo $-1$. Nulování musí být prováděno do stavu samých nul nebo jedniček podle nastavení směru čítání.

Požadavky na implementaci obousměrného čítače jsou shrnuty v tabulce \ref{tab:bin-updown}. Velikosti hradel jsou uvedeny poměrově proti hradu NAND2; hradla jsou z technologie amis350uboscd.
\tabulka{tab:bin-updown}{
\begin{tabular}{lll}
  \hline
  Hradlo & Velikost & Počet   \\\hline
  DFF    & 5        & $n$     \\% dffpx1_d
  MUX4   & 6.333    & $n$     \\% mux4x1_d
  ADFULL & 5        & $n - 1$ \\% adfullx1_d
  HALFADD& 3        & $1$     \\% adhalfx1_d
  \hline
  \multicolumn{2}{l}{$\Sigma$} & $16.333\cdot{}n - 2$ \\ 
\end{tabular}}{Odhad velikosti obousměrného binárního čítače}

%
%\subsection{Grayův kód}
%
%Vzdy jen jeden bit $\Uparrow$ nebo $\Downarrow$

\input{text/504-lfsr}
\input{text/505-cfsr}

\subsection{Porovnání}

Jako hlavní požadavek na čítač adresy byla zvolena velikost jeho implementace na čipu. Pro porovnání využijeme odhady velikosti z předchozích kapitol. Toto porovnání je vidět v tabulce \ref{tab:comparsion}. Z tohoto porovnání vychází, že se vyplatí použít CFSR čítač pro šířky větší než 2 bity.  Pro ověření této domněnky byly syntetizovány dekadické a CFSR čítače šířky 2-16 bitů. Výsledek porovnání je vidět na obrázku \ref{fig:sizes-dec-cfsr}.

\tabulka{tab:comparsion}{
  \begin{tabular}{p{4cm}lp{5cm}}
    \hline
    Typ čítače & Odhad velikosti & $n$ pro které vychází plocha menší než binární obousměrný čítač \\
    \hline
    Binární obousměrný                & $16.333\cdot{}n - 2 $ & - \\ 
    CFSR obousměrný -~nejlepší případ & $11.133\cdot{}n + 4 $ & $2$ \\
    CFSR obousměrný -~nejhorší případ & $15.433\cdot{}n - 0.333$ & $1$  \\
    \hline
  \end{tabular}    
}{Porovnání odhadu velikostí čítačů}

\image{fig:sizes-dec-cfsr}{
  \input{obrazky/sizes}
}{Porovnání velikostí čítačů}

Požadavky na sekvenční část implementace (počet DFF registrů) byl shodný mezi typy, protože čítače mají stejnou šířku. Kombinační část obvodu CFSR byla oproti binárnímu čítači poloviční.

