% Diplomova prace: pos_buf
% Michal Trs
% Testovani

%\begin{itemize}
% \item Způsob, průběh a výsledky testování.
% \item Srovnání s existujícími řešeními, pokud jsou známy.
%\end{itemize}

Zaměřil jsem se pouze na funkční testy celé jednotky \emph{pos\_buf}, jejich jednotlivých bloků a vybraných komponent těchto bloků. Veškeré simulace jsou prováděny na úrovni RTL (Register transfer level). V projektu Liberouter je k simulaci používán program ModelSim \cite{modelsim} od firmy Mentor Graphics a není důvod jej také nepoužít. Testování v hardwaru bude možné až po vyřešení problému s časováním RocketIO rozhraní a zvýšení hodinové frekvence odstraněním kritických cest. Nyní popíšu zvlášť simulaci celé jednotky a bloků, z kterých se skládá.




\section{Simulace celé jednotky}
Pro testování celé jednotky \emph{pos\_buf} bylo navrženo zapojení na obrázku \ref{img:top_level-test}, které simuluje jednoduchou síťovou aplikaci. Poskytuje snadné otestování vysílací / přijímací části, ale neodhalí případné nesrovnalosti vzhledem ke specifikaci. K úplnému ověření správnosti jednotky je zapotřebí nahradit jednu UUT (Unit Under Test) jednotkou třetí strany, která je již otestována. Otestovaná jednotka třetí strany však není k dispozici.

\begin{figure}[!htp]
\begin{center}
\scalebox{1.0}{\includegraphics{img/top_level-test.pdf}}
\end{center}
\caption{Zapojení top level testu}
\label{img:top_level-test}
\end{figure}

Ke generování protokolu FrameLink je použita komponenta \verb|FL_SIM| vytvořená na projektu \mbox{Liberouter}. Pomocí procedury \verb|fl_send32("paket.txt")| se odesílají data uložená v souboru \emph{paket.txt}. Soubor může obsahovat více paketů\footnote{Chápáno paketů síťový vrstvy, v terminologii FL protokolu označeno jako \uv{Frame}}, kde každý paket je ukončen znakem \#. Komponenta umožňuje logování přijatých a odeslaných paketů. Pokud chceme pomocí komponenty logovat příchozí data, nesmí je tato komponenta generovat.

Pomocí programu Wireshark \cite{wireshark} bylo odchytnuto několik druhů paketů (ARP, ICMP, TCP, ...) ze živé sítě, které jsou uloženy v adresáři \verb|sim/packets/|. Pro otestování plně duplexního provozu jsou tyto pakety odesílány z obou UUT ve stejném čase. Výsledné datové toky jsou generovány během simulace a jsou uloženy v adresáři \verb|sim/logs/|. Soubor \verb|flow1_tx.txt| odpovídá datům odeslaným jednotkou UUT1 do UUT2. Data přijatá jednotkou UUT2 jsou uložena v souboru \verb|flow1_rx.txt|. Analogická situace je pro opačný směr, (tj. z UUT2 do UUT1) a soubory \verb|flow2_*.txt|. Pro ověření bezchybného přenosu dat, postačuje po doběhnutí simulace (450$\mu$s simulačního času) porovnat soubory \verb/flow1_{tx|rx}.txt/ a \verb/flow2_{tx|rx}.txt/. Test tedy není zcela automatický, protože soubory musíme porovnat ručně (např. programem \emph{diff}). Průběh simulace se zakreslenými směry přenosu je na obrázku \ref{img:pos_bus-sim}.

\begin{figure}[!htp]
\begin{center}
\scalebox{0.3}{\includegraphics{img/pos_bus-sim.png}}
\end{center}
\caption{Průběh simulace jednotky pos\_buf (ModelSim)}
\label{img:pos_bus-sim}
\end{figure}




\section{Simulace jednotlivých bloků}
Bloky jednotky \emph{pos\_buf} jsem testoval tak, že jsem je vložil do testbenche a jednoduchými modely simuloval okolní komponenty. Testy nejsou automatické, spoléhají na manuální zkontrolování průběhů signálů vzhledem ke specifikaci.

Na následujícím obrázku \ref{img:sonet_framer-sim-detail} je patrná simulace komponenty SONET/SDH Framer. Komponenta začíná přenášet data (signál \verb|LOC| je nastaven na nulu) až po synchronizaci s protější stranou. K té dochází, pokud je třikrát (možné nastavit v souboru \verb|xapp652_oc48_aligner_16.vhd|) přijat SONET/SDH rámce s byty A1A2 přesně po 125us. V tomto testu dochází k přenosu dat přibližně po 385us. Bloky přenášených data jsou generována v cyklu a jsou od sebe odděleny \uv{flagem} 0x7E podobně jako HDLC rámec, který mají představovat. Blok dat je dlouhý 180 slov a za ním následuje 50 slov \uv{flagu} 0x7E7E. Tento cyklus se opakuje 50krát. Tím je ověřeno správné pozastavení dat v době vkládání SONET hlavičky. Začátek vysílaných a přijímaných dat je označen červenou barvou. Ze simulace (případně obrázku) je patrné, že přijatá data odpovídají vyslaným. Do okna \uv{wave} jsou vytaženy veškeré datové cesty po průchodu jednotlivými bloky. Je z nich dobře patrné ukládání ve vyrovnávacích FIFO pamětech, kódování a dekódování apod.

\begin{figure}[!htp]
\begin{center}
\scalebox{0.7}{\includegraphics{img/sonet_framer-sim-detail.png}}
\end{center}
\caption{Průběh simulace SONET/SDH Frameru (ModelSim)}
\label{img:sonet_framer-sim-detail}
\end{figure}

U HDLC kontroléru je k dispozici několik testů. Lze testovat zvlášť vysílací a přijímací část a obě části společně zapojené za sebe. Pomocí vstupních dat jsou testovány různé kombinace (pozice) bytů 7E a 7D. Průběh testu vypadá podobně jako v předcházejícím případě a proto zde neuvádím screenshot. Doporučuji však si prohlédnout živou simulaci. Nachází se v adresáři \verb|hdlc_ctrl/sim/| a spustíme ji příkazem \verb|vsim -do hdlc16_loopback_tb.do|.

Testování PPP kontroléru se zaměřuje na otestování otevření spojení na linkové vrstvě (zpracování a generování LCP paketů) a přenos samotných paketů síťové vrstvy. Je testována enkapsulace a dekapsulace paketů síťové vrstvy do/z PPP rámce.

Testování komponent, ze kterých se výše popsané bloky skládají, nebudu popisovat, protože se jedná o poměrně jednoduché testbenche, které mají dobrou vypovídající schopnost.




\section{Spouštění simulací}
Simulace je možné spouštět přímo z prostředí ISE. Je nutné vybrat položku \uv{Sources for: Behavioral Simulation}, která je nad seznamem souborů projektu. Nyní je možné v tomto okně zvolit simulaci požadované jednotky. Poté v okně \uv{Processes} spustit \uv{Simulate Behavioral Model}.

Druhou možností, jak simulace spouštět je příkazová řádka. U každé komponenty je adresář \verb|sim/|, ve kterém jsou testbenche a skripty spouštějící simulaci. Samotné spuštění provedeme příkazem \verb|vsim -do soubor.do|. Skript zajistí kompilaci potřebných souborů do knihovny \emph{work}, přidání signálů do okna \uv{wave} a běh samotné simulace.
