\chapter{Verifikace}


%V této části jsou popsané verifikační případy, na kterých je generovaný BIST kontrolér otestován. Tyto testy jsou určené pro běh nad celým testovaným čipem pro kontrolu reálného použití BIST kontroléru.

%Testy jsou psané v SystemVerilogu.

\section{Test bench}

%Testy jsou navržený pro možnost implementace do existujícího verifikačního prostředí. Blokové schéma je na obrázku \ref{fig:test-bench-block}. 
Implementace testovacího prostředí odpovídá obrázku \ref{fig:test-bench-block}. Test bench je modul
obsahující jak testovaný obvod (dále označovaný jako DUT), tak moduly sloužící k jeho stimulaci.
Samotné testy využívají pouze tasky (případně funkce) jednotlivých BFM\footnote{angl. Bus Function Model}
pro stimulaci DUT.
Toto rozložení otestuje i integraci BIST kontroléru do DUTu. Provede se tedy ověření toho
že lze nastavit DUT do takového stavu, aby uživatel mohl přistupovat k BIST kontroléru.

\image{fig:test-bench-block}
{ \input{obrazky/testbench.tex} }
{Blokové schéma verifikačního prostředí}

Stimulace BIST kontroléru se provádí pomocí BFM v souboru \texttt{mbist.sv}. Tento BFM v sobě
zahrnuje veškerou komunikaci mezi BIST kontrolérem a testcase. Přesný popis funkcí a jejich chování
bude obsažen v následující kapitole.

\section{Interface testů}
Pro stimulaci testovaného obvodu používají testy rozhraní definované v souboru \texttt{mbist.sv}.
Toto rozhraní slouží k přizpůsobení přístupu k BIST kontroléru v závislosti na požadavcích DUTu.
Jde o SystemVerilogový model obsahující interface:

\newcommand\function[2]{
  \paragraph{#1}\mbox{}

  #2
}
\newcommand\apiParameters{
  \begin{description}
}
\newcommand\apiParameter[2]{
  \item[#1] #2
}
\newcommand\apiEndParameters{
  \end{description}
%  \newline
}

\subsubsection{Nastavení testů}

\function{function time f\_get\_test\_to()}{
  Vrátí maximální akceptovatelnou dobu trvání testu paměti.
}

\function{function logic[] f\_get\_address(
%input integer memoryId, 
input logic[] logicAddress)}{
  \apiParameters
%  \apiParameter{memoryId}{Identifikace paměti}
  \apiParameter{logicAddress}{Logická adresa v rámci paměti}
  \apiEndParameters
  
  Vrátí fyzickou adresu paměťové buňky pro zadanou logickou adresu v rámci paměti.
  Při výpočtu adresy dbá na rozsahy a pozice řádkových a sloupcových adresních čítačů.
}

\subsubsection{Rozhraní BIST kontroléru}

\function{task tsk\_enable(input logic \_biste, input logic \_sen)}{
  \apiParameters
  \apiParameter{\_biste}{Hodnota pro vystavení na \texttt{BISTE} pinu}
  \apiParameter{\_sen}{Hodnota pro vystavení na \texttt{SEN} pinu}
  \apiEndParameters

  Tato funkce má za úkol nastavení správného test módu integrovaného obvodu, ve kterém se nachází testovaný BIST kontrolér. Následně provede zápis hodnot na pin odpovídající pinům \texttt{BISTE}, \texttt{SEN} na BIST kontroléru.
}

\function{task tsk\_read\_done(input logic exp\_done)}{
  \apiParameters
  \apiParameter{exp\_done}{Očekávaná hodnota \texttt{DONE} signálu}
  \apiEndParameters

  Tato funkce přečte a porovná hodnotu \texttt{DONE} signálu s očekávanou hodnotu. V případě neshody
  musí zajistit nahlášení chyby a eventuální zastavení testu.
}

\function{task tsk\_wait\_done(input t\_EDGE edg, input time timeout)}{
  \apiParameters
  \apiParameter{edg}{Na kterou hranu na signálu \texttt{DONE} má task čekat. Možnosti: \texttt{\{e\_POSEDGE, e\_NEGEDGE, e\_ANYEDGE\}}}
  \apiParameter{timeout}{Maximální doba čekání na hranu}
  \apiEndParameters
  
  Task počká na \textbf{edg} hranu na signálu \texttt{DONE}. Pokud ke hraně nedojde do \textbf{timeout}
  času ohlásí task chybu a případně dojde k zastavení testu. 
}

\function{task tsk\_read\_fail(input logic exp\_fail)}{
  \apiParameters
  \apiParameter{exp\_fail}{Očekávaná hodnota \texttt{FAIL} signálu}
  \apiEndParameters

  Tato funkce přečte a porovná hodnotu \texttt{FAIL} signálu s očekávanou hodnotu. V případě neshody
  musí zajistit nahlášení chyby a eventuální zastavení testu.
}

\function{task tsk\_wait\_fail(input t\_EDGE edg, input time timeout)}{
  \apiParameters
  \apiParameter{edg}{Na kterou hranu na signálu \texttt{FAIL} má task čekat. Možnosti: \texttt{\{e\_POSEDGE, e\_NEGEDGE, e\_ANYEDGE\}}}
  \apiParameter{timeout}{Maximální doba čekání na hranu}
  \apiEndParameters
  
  Task počká na \textbf{edg} hranu na signálu \texttt{FAIL}. Pokud ke hraně nedojde do \textbf{timeout}
  času ohlásí, task chybu a případně dojde k zastavení testu. 
}

\subsubsection{Sériová diagnostika}

\function{task tsk\_shift(input logic[] address, input logic[] data, input logic[1:0] operation, input logic rnd\_clock)}{
  \apiParameters
  \apiParameter{address}{Fyzická adresa, na kterou se má přistoupit}
  \apiParameter{data}{Data pro paměť}
  \apiParameter{operation}{Operace pro paměť. Možnosti: \texttt{\{e\_OP\_RD, e\_OP\_WR, e\_NOP\}}}
  \apiParameter{rnd\_clock}{Povolení přidání jitteru do hodinového signálu}
  \apiEndParameters

  Provede sériový přístup k paměti na adresu \textbf{address} a dle vybrané operace buď zapíše data
  do paměti, nebo porovná data přečtená z paměti s očekávanou hodnotou.

  Při generování sériového průběhu ponechá signál \texttt{SDI} v žádané hodnotě pouze setup/hold time
  okolo náběžné hrany \texttt{SCLK}. Data ze sériového rozhraní čte při sestupné hraně \texttt{SCLK}.
}

\subsubsection{Simulace defektu}

\function{task tsk\_corrupt\_memory(
%input integer memoryId,
input logic[] address, input logic corrupt)}{
  \apiParameters
%  \apiParameter{memoryId}{Identifikace paměti, která má být poškozena}
  \apiParameter{address}{Na které adrese se má simulovat chyba}
  \apiParameter{corrupt}{Povolení/zakázání simulace chyby na dané adrese}
  \apiEndParameters
 
  Pokud $\textbf{corrupt} = 1$, task provede nastavení paměťového modelu tak, aby po přečtení dat
  z adresy \textbf{address} paměť vracela vždy negovanou hodnotu. 

  Pokud $\textbf{corrupt} = 0$, task nastaví paměťový model tak, aby se na adrese \textbf{address}
  choval jako bezchybná paměť.
}

\section{Testy}

Výstupy BIST kontroléru jsou permanentně testovány na nežádoucí krátké zákmity (tzv. glitche).
Glitch se nesmí objevit na žádném výstupním portu s výjimkou paměťové sběrnice.
Jako další je implementován test na nerozhodnou úroveň \texttt{X}.
V případě jejich výskytu dojde k zastavení testu a nahlášení neúspěchu.

Konstanta \texttt{CLKPER} udává hodinovou periodu.

\subsubsection{Testy BIST kontroléru}
\begin{enumerate}
  \item Nastavit \texttt{BISTE = '1}, počkat \texttt{CLKPER} a otestovat, že \texttt{FAIL = '0}.
  \item Počkat na nástupnou hranu na signálu \texttt{DONE}. Za celou dobu se nesmí objevit nástupná hrana na signálu \texttt{FAIL}. 
  \item Nastavit \texttt{BISTE = '0}, počkat \texttt{CLKPER} a otestovat, že \texttt{FAIL = '1, DONE = '0}.
  \item Zopakovat body 1--3. (Otestuje, zda jde test paměti opět spustit.)
  \item Zopakovat body 1--3. Během testu simulovat chybu v paměti. V bodě 2 se musí objevit nástupná hrana na signálu \texttt{FAIL}.
%  \item Zopakovat bod 5. pro každou paměť připojenou na testovací kontrolér. (Otestuje detekci chyby.)
  \item Zopakovat body 1--3. Během bodu 2 nastavit \texttt{BISTE = '0} a okamžitě přejít na bod 3. (Otestuje přerušení testu v půlce.)
  \item Zopakovat body 1--3. Změřit délku celého testu a porovnat s trváním prvního a druhého proběhnutí  testu. Délka testu musí být podobná (\texttt{$\pm$CLKPER})\footnote{Lze prodloužit v případě, že délku ovlivňují operace, které nemusejí mít opakovatelnou délku.}.
\end{enumerate}

\subsubsection{Test sériového přístupu}
\begin{enumerate}
  \item Nastavit \texttt{BISTE = '0, SEN = '1}.
  \item Provede se zapsání adresy a dat do BIST kontroléru pomocí sériové sběrnice. Vstupní data se ponechají validní pouze v setup/hold time okolo nástupné hrany hodin. Na sériové sběrnici se vystaví operace zápisu.
  \item Provede se zapsání negace adresy a dat do BIST kontroléru. Zkontroluje se, že na výstupu obdržíme původní adresu a data. Na sériové sběrnici se nevystaví žádná operace.
  \item Simulujeme negaci dat v paměti na testované adrese.
  \item Provedeme zapsání adresy a dat do BIST kontroléru pomocí sériové sběrnice. Provedeme operaci čtení.
  \item Přečteme data z kontroléru a porovnáme, že přečtená data jsou negací očekávaných. Zrušíme negaci dat v paměti na testované adrese.
  \item Opakujeme 2--6 pro walking one / walking zero v adrese a datech.
\end{enumerate}
