\section{Allgemein}
%\abbildung{pipeline.png}{so schaut unsre Architektur aus}{fig:pipeline}{1.4\textwidth}{90}
\abbildung{pipeline.png}{Schematische Darstellung der Pipeline}{fig:pipeline}{0.95\textheight}{90} %0.95 weil sonst warning!
Die Pipeline gliedert sich in 4 getrennte Stages. Jene sind Fetch, Decode, Execute und Writeback.
\section{Fetch-Stage}
Die Aufgaben der Fetch-Stage sind relativ simple in
\begin{itemize}
	\item Anlegen der Instruktionsadresse an den Instruktions-Speicherbus. Daraufhin erh\"alt die Decode-Stage die gew\"unschte Instruktion im n\"achsten Zyklus.
	\item Die Instruktionsadresse ist entweder der inkrementierte Programmcounter, Jump-Result oder das Ergebnis der statischen Branchprediction
\end{itemize}
gegliedert.
\section{Decode-Stage}
Die Aufgaben der Decode-Stage fallen schon etwas komplexer aus und sind in
\begin{itemize}
	\item Decodieren der dichten Instruktion in eine aufgespaltene Form.
	\item Laden der Operanden aus dem Registerfile und \"ubergeben der jeweiligen Adressen.
	\item Laden von Immediates in die Operanden.
	\item	Evaluierung der Branchprediction. R\"uckf\"uhrung der statischen Sprungadresse
				und NOP insertion falls die ALU/Writeback springt.
\end{itemize}
gegliedert.
\section{Execute-Stage}
Neben den Berechnungen beinhaltet diese Stage auch die Forward-Unit welche s\"amtlichen
Konflikte behandelt.
\begin{itemize}
	\item Ausf\"uhrung der einzelnen Instruktionen auf die Operanden
	\item Signalisieren eines Sprungs (ret vs. jmp). Die Jumpadresse kommt entweder vom Datenbus oder aus dem ALU-Ergebnis.
	\item Signalisieren eines Registerschreibzugriffs, wobei dieses Ergebnis wieder vom Result oder Datenbus kommt.
	\item Ansprechen des Datenbusses (RAM, Extension-Module, read, write) und des Statuswortes sowie des Stackpointers.
\end{itemize}


Die Forward-Unit muss s\"amtliche Konflikte behandeln und veraltete Operanden durch die letzten Ergebnisse ersetzen. Sie besteht aus
\begin{itemize}
	\item 2-Register um \"Anderungskonflikte an Registern zu l\"osen.
	\item	Zusammensetzen eines dieser zwei Register mit dem Wert vom Datenbus (load byte etc.).
\end{itemize}

Die Extensionmodule werden vom Prozessor aus wie der Speicher behandelt. Jedes Modul besitzt einen spezifischen Adressbereich.
Ein eigener Controller mapped die Adressbereiche auf die Extensionmodule und leitet die entsprechenden Daten \"uber ein Register auf das Modul weiter. 
Beim Lesezugriff auf einen dieser Speicherbereiche legt das Extensionmodul einen Zyklus sp\"ater seinen Output auf den Datenbus. 


\section{Writeback-Stage}

Die Writeback-Stage \"ubernimmt die Werte aus dem Ergebnisregister der ALU oder aus der Forward-Unit (Registerzusammensetzung) und schreibt diese in das Registerfile zur\"uck. 
Des weiteren kann die ALU das Jump Result nicht direkt an die Decode-Stage zur\"uckgeben, da dieses erst im Folgezyklus vorhanden ist (im Falle eines branch-returns).
Somit muss dies auch von der Writeback-Stage erledigt werden.
