kleinere Korrekturen

This commit is contained in:
Matthias Biermann
2025-02-17 21:17:17 +01:00
parent cafa294371
commit f1daff77b2
2 changed files with 20 additions and 20 deletions
Binary file not shown.
+20 -20
View File
@@ -179,7 +179,7 @@ Dabei werden die gelesenen Datenpakete zunächst an einen FIFO-Speicher über di
Über die \emph{M\_AXIS} Schnittstelle werden die Datenpakete mit angehängter Prüfsumme wieder angenommen und zurück in den Speicher geschrieben. Über die \emph{M\_AXIS} Schnittstelle werden die Datenpakete mit angehängter Prüfsumme wieder angenommen und zurück in den Speicher geschrieben.
Die Komponente arbeitet bei den Speicherzugriffen über die \emph{M\_AXI} Schnittstelle immer mit möglichst großen Burstlängen, um möglichst effiziente Speicherzugriffe zu gewährleisten. Die Komponente arbeitet bei den Speicherzugriffen über die \emph{M\_AXI} Schnittstelle immer mit möglichst großen Burstlängen, um möglichst effiziente Speicherzugriffe zu gewährleisten.
Um sicherzustellen, dass das System dabei genug Daten aufnehmen kann bzw. zur Verfügung stellen kann, werden zwei FIFO-Speicher verwendet. Um sicherzustellen, dass das System dabei genug Daten aufnehmen bzw. zur Verfügung stellen kann, werden zwei FIFO-Speicher verwendet.
Die maximale Burstlänge in diesem System beträgt 16 Worte. Die maximale Burstlänge in diesem System beträgt 16 Worte.
Die FIFO-Speicher haben eine Tiefe von 256 Worten, um ausreichend Daten puffern zu können, damit bei Verzögerungen der \emph{M\_AXI} Lesezugriffe die CRC-Berechnungskomponente trotzdem ununterbrochen Daten verarbeiten kann. Die FIFO-Speicher haben eine Tiefe von 256 Worten, um ausreichend Daten puffern zu können, damit bei Verzögerungen der \emph{M\_AXI} Lesezugriffe die CRC-Berechnungskomponente trotzdem ununterbrochen Daten verarbeiten kann.
@@ -188,7 +188,7 @@ Abhängig davon, ob genug Daten zum Schreiben oder genug freier Speicher zu Verf
Beim Ausgeben des Datenstroms über die \emph{M\_AXIS} Schnittstelle markiert das \emph{M\_AXIS\_TLAST} Signal das letzte Datenwort eines Pakets. Beim Ausgeben des Datenstroms über die \emph{M\_AXIS} Schnittstelle markiert das \emph{M\_AXIS\_TLAST} Signal das letzte Datenwort eines Pakets.
Die Komponente ist bei Schreib- und Lesebursts in der Lage, 4kB-Adressgrenzen zu erkennen und passt entsprechend die Burstlängen und die Adressen des nächsten Zugriffs an. Die Komponente ist bei Schreib- und Lesebursts in der Lage, 4kB-Adressgrenzen zu erkennen und passt die Burstlängen und die Adressen entsprechend des nächsten Zugriffs an.
Die Schreib- und Leseburst sind in zwei separaten Prozessen bzw. endlichen Automaten aufgeteilt, die weitgehend unabhängig voneinander arbeiten. Die Schreib- und Leseburst sind in zwei separaten Prozessen bzw. endlichen Automaten aufgeteilt, die weitgehend unabhängig voneinander arbeiten.
Daher kann die Komponente parallel Daten lesen und schreiben. Daher kann die Komponente parallel Daten lesen und schreiben.
@@ -205,7 +205,7 @@ Die Register, die zur Konfiguration der CRC-Berechnung dienen, sind als Ausgäng
\label{fig:AxisCRC_entity} \label{fig:AxisCRC_entity}
\end{figure} \end{figure}
In Abbildung ist die Entity der Komponente \texttt{axis\_crc} dargestellt. In Abbildung~\ref{fig:AxisCRC_entity} ist die Entity der Komponente \texttt{axis\_crc} dargestellt.
Die Eingänge \emph{initialValue}, \emph{polynomial}, \emph{finalXOR} und \emph{inOutReflected} dienen zur Konfiguration der CRC-Berechnung. Die Eingänge \emph{initialValue}, \emph{polynomial}, \emph{finalXOR} und \emph{inOutReflected} dienen zur Konfiguration der CRC-Berechnung.
Sie fließen in die Kombinatoriken der CRC-Berechnung ein. Sie fließen in die Kombinatoriken der CRC-Berechnung ein.
@@ -220,7 +220,7 @@ Das \emph{LAST}-Signal wird nicht mehr beim letzten Wort des Datenpakets, sonder
Nachdem die CRC-Prüfsumme ausgegeben wurde, wird intern das CRC-Register wieder mit dem Initialwert initialisiert. Nachdem die CRC-Prüfsumme ausgegeben wurde, wird intern das CRC-Register wieder mit dem Initialwert initialisiert.
Die Komponente ist dann wieder bereit, eine neue CRC-Prüfsumme zu berechnen. Die Komponente ist dann wieder bereit, eine neue CRC-Prüfsumme zu berechnen.
Intern efolgt die Berechnung der CRC-Prüfsumme mithilfe eines endlichen Automaten. Intern erfolgt die Berechnung der CRC-Prüfsumme mithilfe eines endlichen Automaten.
Um keine Timingprobleme zu verursachen, wurde so die Berechnung der CRC-Prüfsumme auf drei Takte aufgeteilt. Um keine Timingprobleme zu verursachen, wurde so die Berechnung der CRC-Prüfsumme auf drei Takte aufgeteilt.
\subsection{AXI-CRC-DMA-IP} \subsection{AXI-CRC-DMA-IP}
@@ -236,7 +236,7 @@ In Abbildung~\ref{fig:CRC_DMA_IP_Architecture} ist die Gesamtarchitektur des IPs
Da die Bestandteile des IPs in den vorherigen Abschnitten beschrieben wurden, erfolgt hier noch eine kurze Erläuterung der Gesamtarchitektur des CRC-DMA-IPs. Da die Bestandteile des IPs in den vorherigen Abschnitten beschrieben wurden, erfolgt hier noch eine kurze Erläuterung der Gesamtarchitektur des CRC-DMA-IPs.
Die Komponente \texttt{axis\_dma} ist für das Lesen und Schreiben der Daten aus dem Speicher zuständig. Die Komponente \texttt{axis\_dma} ist für das Lesen und Schreiben der Daten aus dem Speicher zuständig.
Sie liest so viele Daten, wie zuvor über die AXIL-Register \texttt{Packet Size} und \texttt{Number Packets} konfiguriert wurde. Sie liest so viele Daten, wie zuvor über die AXIL-Register \texttt{Packet Size} und \texttt{Number Packets} konfiguriert wurden.
Die Daten, die aus dem Speicher gelesen werden, werden als AXI-Stream-Datenstrom an das erste FIFO weitergegeben. Die Daten, die aus dem Speicher gelesen werden, werden als AXI-Stream-Datenstrom an das erste FIFO weitergegeben.
Dieses puffert den Datenstrom und gibt ihn an die CRC-Berechnungskomponente \texttt{axis\_crc} weiter, wo aus dem Datenstrom eine bzw. mehrere CRC-Prüfsummen berechnet werden. Dieses puffert den Datenstrom und gibt ihn an die CRC-Berechnungskomponente \texttt{axis\_crc} weiter, wo aus dem Datenstrom eine bzw. mehrere CRC-Prüfsummen berechnet werden.
Die CRC-Prüfsumme wird an den Datenstrom angehängt und über das zweite FIFO an die DMA-Komponente \emph{axis\_dma} zurückgegeben, um sie zurück in den Speicher zu schreiben. Die CRC-Prüfsumme wird an den Datenstrom angehängt und über das zweite FIFO an die DMA-Komponente \emph{axis\_dma} zurückgegeben, um sie zurück in den Speicher zu schreiben.
@@ -295,7 +295,7 @@ Dieses Gesamtsystem kann nun synthetisiert und implementiert werden.
Zur vereinfachten Handhabung des CRC-DMA-IPs wurde ein Struct und eine Treiberfunktion erstellt. Zur vereinfachten Handhabung des CRC-DMA-IPs wurde ein Struct und eine Treiberfunktion erstellt.
In Codeausschnitt~\ref{code:StructCRC} ist das Struct für das CRC-DMA-IP dargestellt. In Codeausschnitt~\ref{code:StructCRC} ist das Struct für das CRC-DMA-IP dargestellt.
Für einen einfacheren Umgang mit den CRC-Parametern befindet sich zusätzlich ein Struct für einen Satz an CRC-Parametern.
\begin{lstlisting}[caption={Struct für CRC-Parameter}, label={code:StructCRCSet}] \begin{lstlisting}[caption={Struct für CRC-Parameter}, label={code:StructCRCSet}]
typedef struct typedef struct
@@ -305,24 +305,23 @@ Für einen einfacheren Umgang mit den CRC-Parametern befindet sich zusätzlich e
uint32_t FinalXOR; uint32_t FinalXOR;
bool InputReflected; bool InputReflected;
bool OutputReflected; bool OutputReflected;
} CrcParameterSet; } CrcParameterSet;
// load a specific set of CRC parameters into Hardware // load a specific set of CRC parameters into Hardware
void CRC_DMA_set_parameters(PCRC_DMA_Typedef baseAddr, const CrcParameterSet* parameterSet); void CRC_DMA_set_parameters(PCRC_DMA_Typedef baseAddr, const CrcParameterSet* parameterSet);
\end{lstlisting} \end{lstlisting}
In Codeausschnitt~\ref{code:StructCRCSet} ist das Struct für einen Satz an CRC-Parametern dargestellt. Für einen einfacheren Umgang mit den CRC-Parametern befindet sich zusätzlich ein Struct für einen Satz an CRC-Parametern.
Diese Struct is in Codeausschnitt~\ref{code:StructCRCSet} dargestellt.
Zum einfachen Setzen der CRC-Parameter im IP kann die Funktion \texttt{void CRC\_DMA\_set\_parameters(...)} genutzt werden. Zum einfachen Setzen der CRC-Parameter im IP kann die Funktion \texttt{void CRC\_DMA\_set\_parameters(...)} genutzt werden.
Beiden gezeigten Codeausschnitte sind in der Headerdatei \texttt{axi\_crc\_dma.h} zu finden. Beide gezeigten Codeausschnitte sind in der Headerdatei \texttt{axi\_crc\_dma.h} zu finden.
\newpage \newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Testkonzept und Ergebnisse} \section{Testkonzept und Ergebnisse}
Das komplette Testkonzept dieser Arbeit kann in drei Teile unterteilt werden.
\subsection{Verifikation der CRC-Berechungskomponente} \subsection{Verifikation der CRC-Berechungskomponente}
Die Korrektheit der von der CRC-Berechnungskomponente berechneten CRC-Prüfsumme ist für das Gesamtsystem von essentieller Bedeutung. Die Korrektheit der von der CRC-Berechnungskomponente berechneten CRC-Prüfsumme ist für das Gesamtsystem von essentieller Bedeutung.
@@ -331,6 +330,7 @@ Daher liegt ein besonderes Augenmerk auf der Verifikation dieser Komponente.
\subsubsection{Referenzprogramm} \subsubsection{Referenzprogramm}
Zunächst wurde das C-Programm \emph{crc.c} geschrieben, das CRC-Prüfsummen in Software berechnet. Zunächst wurde das C-Programm \emph{crc.c} geschrieben, das CRC-Prüfsummen in Software berechnet.
Dieses Programm dient bei der Entwicklung der Hardware als Referenz für die berechneten CRC-Prüfsummen.
Der CRC-Algorithmus wurde hauptsächlich mithilfe von Sunshine2k.de \cite{SunshineCrcErklärung} erstellt. Der CRC-Algorithmus wurde hauptsächlich mithilfe von Sunshine2k.de \cite{SunshineCrcErklärung} erstellt.
Parallel wurden die Ergebnisse mit anderen CRC-Online Rechnern verglichen, um die Korrektheit der Berechnung zu überprüfen \cite{crcCalc}. Parallel wurden die Ergebnisse mit anderen CRC-Online Rechnern verglichen, um die Korrektheit der Berechnung zu überprüfen \cite{crcCalc}.
@@ -397,7 +397,7 @@ Dies geschieht in der Funktion \texttt{void calc\_axis\_crc\_tb()}.
Um die Korrektheit der CRC-Berechnungskomponente \emph{axis\_crc} zu gewährleisten, wurde eine Testbench erstellt. Um die Korrektheit der CRC-Berechnungskomponente \emph{axis\_crc} zu gewährleisten, wurde eine Testbench erstellt.
In dieser Testbench werden von der CRC-Berechnungskomponente insgesamt 24 Prüfsummen über dasselbe Datenpaket von drei 32-Bit-Worten mit verschiedenen Parametern berechnet. In dieser Testbench werden von der CRC-Berechnungskomponente insgesamt 24 Prüfsummen über dasselbe Datenpaket von drei 32-Bit-Worten mit verschiedenen Parametern berechnet.
Da auch nur ein kleinster Fehler in der Implementierung des CRC-Algorithmus völlig andere Ergebnisse zur Folge hätte, genug es zunächst nur ein Datenpaket für die Verifikation zu nutzen. Da auch nur ein kleinster Fehler in der Implementierung des CRC-Algorithmus völlig andere Ergebnisse zur Folge hätte, genügt es zunächst nur ein Datenpaket für die Verifikation zu nutzen.
Die Testbench wurde in VHDL geschrieben und überprüft automatisch die Korrektheit der berechneten CRC-Prüfsummen sowie das korrekte Ausgeben der Daten. Die Testbench wurde in VHDL geschrieben und überprüft automatisch die Korrektheit der berechneten CRC-Prüfsummen sowie das korrekte Ausgeben der Daten.
@@ -437,7 +437,7 @@ Das Grundgerüst dieser Komponente wurde mithilfe von ChatGPT erstellt und ansch
In diesem Simulations-Block-Design wird zum einen die Funktionsweise der AXIL-Schnittstelle überprüft. In diesem Simulations-Block-Design wird zum einen die Funktionsweise der AXIL-Schnittstelle überprüft.
Das heißt, dass die AXIL-Register richtig geschrieben und gelesen werden können und dass der CRC-DMA-Vorgang über das Kontrollregister gestartet werden kann. Das heißt, dass die AXIL-Register richtig geschrieben und gelesen werden können und dass der CRC-DMA-Vorgang über das Kontrollregister gestartet werden kann.
Zum anderen wird vornehmlich das richtige DMA-Verhalten des IPs überprüft. Zum anderen wird vornehmlich das richtige DMA-Verhalten des IPs überprüft.
Dabei sind untern anderem folgende Punkte von Bedeutung: Dabei sind unter anderem folgende Punkte von Bedeutung:
\begin{itemize} \begin{itemize}
\item Werden die Valid/Ready-Handshakes korrekt durchgeführt? \item Werden die Valid/Ready-Handshakes korrekt durchgeführt?
\item Werden die korrekten Adressen übergeben? \item Werden die korrekten Adressen übergeben?
@@ -446,11 +446,11 @@ Dabei sind untern anderem folgende Punkte von Bedeutung:
\item Wird die korrekte Menge an Daten entsprechend der Konfiguration geschrieben? \item Wird die korrekte Menge an Daten entsprechend der Konfiguration geschrieben?
\item Werden stets maximal mögliche Burstlängen verwendet? \item Werden stets maximal mögliche Burstlängen verwendet?
\item Werden 4kB-Adressgrenzen korrekt behandelt? \item Werden 4kB-Adressgrenzen korrekt behandelt?
\item Wird Interruptleitung nach dem Vorgang korrekt gesetzt? \item Wird die Interruptleitung nach dem Vorgang korrekt gesetzt?
\end{itemize} \end{itemize}
Da es sich um eine manuelle Testbench handelt, werden all diese Punkte durch das Betrachten des Wave-Diagramms überprüft. Da es sich um eine manuelle Testbench handelt, werden all diese Punkte durch das Betrachten des Wave-Diagramms überprüft.
Zusätzlich wurden dabei verschiedene Konfigurationen des IPs getstest, um auch die Funktionalität bei unterschiedlichen Parametern zu überprüfen und Edge-Cases mit abzudecken. Zusätzlich wurden dabei verschiedene Konfigurationen des IPs getetest, um auch die Funktionalität bei unterschiedlichen Parametern zu überprüfen und Edge-Cases mit abzudecken.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@@ -471,7 +471,7 @@ Der Ablauf eines Testlaufs ist wie folgt:
\begin{enumerate} \begin{enumerate}
\item Auswählen eines neuen CRC-Parameter-Satzes \item Auswählen eines neuen CRC-Parameter-Satzes
\item Zufällige Datenpakete erzeugen mit einer zufälligen Paketanzahl und -größe \item Zufällige Datenpakete erzeugen mit einer zufälligen Paketanzahl und -größe
\item Konfiguration der CRC-DMA-IPs \item Konfiguration des CRC-DMA-IPs
\item Starten des CRC-DMA-IPs \item Starten des CRC-DMA-IPs
\item Warten auf den Interrupt des IPs \item Warten auf den Interrupt des IPs
\item Berechnen der CRC-Prüfsummen in Software zur Verifikation \item Berechnen der CRC-Prüfsummen in Software zur Verifikation
@@ -490,10 +490,10 @@ Die Ausgabe des Programms erfolgt sowohl über die Konsole als auch in eine Logd
In Abbildung~\ref{fig:AusgabeTestprogramm} ist exemplarisch die Ausgabe des Testprogramms für einen Testlauf dargestellt. In Abbildung~\ref{fig:AusgabeTestprogramm} ist exemplarisch die Ausgabe des Testprogramms für einen Testlauf dargestellt.
Zur Verifikation des CRC-DMA-IPs können nun mithilfe dieses Programms im großen Umfang CRC-Berechnungsvorgänge ausgeführt werden. Zur Verifikation des CRC-DMA-IPs können nun mithilfe dieses Programms im großen Umfang CRC-Berechnungsvorgänge ausgeführt werden.
Durch eine große Anzahl an Testläufen, kann so sichergestellt werden, dass, wenn das IP fehlerhaft ist, diese Fehler auch entdeckt werden. Durch eine große Anzahl an Testläufen kann so sichergestellt werden, dass, wenn das IP fehlerhaft ist, diese Fehler auch entdeckt werden.
Anbei dieser Projektarbeit befindet sich eine Logdatei des Testprogramms, die die Ausgabe für 250 Testläufe enthält. Anbei dieser Projektarbeit befindet sich eine Logdatei des Testprogramms, die die Ausgabe für 250 Testläufe enthält.
Ergebnis dieses Tests ist, dass bei insgesamt gelesenen Menge von ca. 1,4 GB Daten keine Fehler aufgetreten sind. Ergebnis dieses Tests ist, dass bei einer gelesenen Menge von ca. 1,4 GB Daten keine Fehler aufgetreten sind.
Alle Daten wurden korrekt in den Speicher geschrieben. Alle Daten wurden korrekt in den Speicher geschrieben.
Dabei ist anzumerken, dass nur bis zu einer Paketanzahl von 100 und einer Paketgröße von 10000 getestet wurde, auch wenn technisch gesehen sowohl Paketgröße als auch Paketanzahl auf einen Wert bis zu 65535 konfiguriert werden können. Dabei ist anzumerken, dass nur bis zu einer Paketanzahl von 100 und einer Paketgröße von 10000 getestet wurde, auch wenn technisch gesehen sowohl Paketgröße als auch Paketanzahl auf einen Wert bis zu 65535 konfiguriert werden können.