\documentclass[pdf]{prosper}
\usepackage[toc,highlight,clifford,notes,hlsections]{HA-prosper}
\usepackage{graphicx}

\usepackage{svn}
\SVNdate $Date: 2007-09-27 10:30:20 +0200 (Thu, 27 Sep 2007) $

\title{Einf\"uhrung in Verilog HDL}
\subtitle{Hardware Hacken ohne L\"otkolben}
\author{Clifford Wolf\\
\institution{ROCK Linux - \href{http://www.rocklinux.org/}{http://www.rocklinux.org/}}\\
\institution{Csync2 - \href{http://oss.linbit.com/csync2/}{http://oss.linbit.com/csync2/}}\\
\institution{STFL - \href{http://www.clifford.at/stfl/}{http://www.clifford.at/stfl/}} \\
\institution{SPL - \href{http://www.clifford.at/spl/}{http://www.clifford.at/spl/}}}

\DefaultTransition{Wipe}
\TitleSlideNav{FullScreen}
\NormalSlideNav{ShowBookmarks}
\LeftFoot{\href{http://www.clifford.at}{Clifford Wolf}, \today}
\RightFoot{\href{http://www.clifford.at/}{http://www.clifford.at/}}

\begin{document}

\maketitle

% ============================================================================

\tsectionandpart{Einleitung}

\begin{slide}{DISCLAIMER}
\begin{itemize}

\item Dieser Vortrag deckt naturgem\"ass nur einen kleinen Teil des Verilog
HDL Sprachumfanges ab.

\vspace*{0.5cm}

\item Die einzelnen Verilog HDL Implementierungen unterscheiden sich zum Teil
gravierend darin, wie weit aktuellere Verilog HDL Standards (2001 und 2005) 
unterst\"utzt werden.

\vspace*{0.5cm}

\item HDL Design ist nicht Programmieren! Neben der Sprache m\"ussen auch
Konzepte erlernt werden. Und dazu ist \"Ubung notwendig..

\vspace*{0.5cm}

\item Viele der Codebeispiele in den Folien sind ungetestet. \\
Korrekturhinweise bitte an {\tt <clifford@clifford.at>}.

\end{itemize}
\end{slide}


\begin{slide}{Was sind HDLs?}
\begin{itemize}

\item HDL = Hardware Description Language

\vspace*{0.5cm}

\item Computersprachen f\"ur die Beschreibung von Schaltungen
\item .. anstelle von grafischen Schaltpl\"anen.

\vspace*{0.5cm}

\item HDLs erf\"ullen mehrere Zwecke:

\begin{itemize}
\item Dokumentation von Schaltungen
\item Simulation, Test und Verifizierung
\item FPGA und ASIC Schaltungssynthese
\end{itemize}

\vspace*{0.5cm}

\item HDLs sind deklarativ statt prozedural!

\vspace*{0.5cm}

\item Codeteile f\"ur Simulation und Test k\"onnen aber wieder prozedural sein
\item ..was dann vor allem f\"ur Neulinge besonders verwirrend ist.

\end{itemize}
\end{slide}


\begin{slide}{Verilog HDL - Hintergrund}
\begin{itemize}

\item 1983: Projektstart bei Gateway Design Automation.
\item 1985: Markteinf\"uhrung als reiner Simulator.
\item 1989: \"Ubernahme durch Cadence Design Systems.
\item 1990: OVI (Open Verilog International) wird gegr\"undet.
\item 1992: OVI initiert den IEEE Standardisierungsprozess.
\item 1995: Verilog is IEEE Standard 1364-1995.
\item 2001: Deutliche Verbesserungen in IEEE 1364-2001.
\item 2005: Einige weiteren Verbesserungen in IEEE 1364-2005.

\vspace*{0.5cm}

\item SystemVerilog (IEEE 1800-2005) ist ein nochmal sehr viel m\"achtigeres
Superset von Verilog 2005.

\vspace*{0.5cm}

\item Verilog-AMS sind Verilog erweiterungen f\"ur Analoge und Mixed-Signal
Schaltungen.

\end{itemize}
\end{slide}


\begin{slide}{Verilog HDL - Konzepte (1/4)}
\begin{itemize}

\item Verilog HDL erlaubt es sehr low-level zu entwickeln ohne sich dabei in
Details verlieren zu m\"ussen.

\item In dieser Hinsicht ist Verilog HDL vielleicht der Programmiersprache C
sehr \"ahnlich.

\item Damit das gut funktioniert ist aber auch etwas Erfahrung notwendig.

\vspace*{0.5cm}

\item Mit Verilog kann man (digitale) Schaltungen entwerfen.
\item Den Schritt, aus Verilog Code die Schaltungen (Netzlisten) zu generieren
nennt man {\bf Synthese}.

\vspace*{0.5cm}

\item Mit Verilog ist es sehr einfach extrem umfangreiche Schaltungen zu
entwerfen.

\vspace*{0.5cm}

\item Dabei sollte man immer aufpassen nicht zu verschwenderisch mit den
Resourcen umzugehen.

\end{itemize}
\end{slide}


\begin{slide}{Verilog HDL - Konzepte (2/4)}
\begin{itemize}

\item In Verilog HDL kann man sowohl die eigentlichen Schaltungen als auch
Testbenches f\"ur Simulation schreiben.
\item F\"ur die Testbenches gibt es auch einige prozedurale Konstrukte.
\item Damit wird zwischen {\bf synthesef\"ahigem} und {\bf nicht synthesef\"ahigem}
Verilog Code unterschieden.

\vspace*{0.5cm}

\item Es gibt auch Sprachkonstrukte die bei der Synthese einfach ignoriert werden.
\item Beispiele daf\"ur: Delays sowie Undefined Values.

\vspace*{0.5cm}

\item F\"ur Simulationen kann Verilog mit der VPI C-API (\"alter: PLI C-API)
erweitert werden.
\item Damit lassen sich Verilog Simulationsmodelle leicht z.Bsp.
an umfangreiche Architekturmodelle anbinden.

\end{itemize}
\end{slide}


\begin{slide}{Verilog HDL - Konzepte (3/4)}
\begin{itemize}

\item Verilog Designs sind hierarchisch in Module aufgeteilt.

\vspace*{0.5cm}

\item Die atomaren Bausteine dieser Hierarchien (die sog. {\bf Primitives})
sind Gatter, Switches und Speicherzellen.
\item F\"ur die Simulation werden die Primitives \"uber Wahrheitstabellen
abgebildet.
\item Es ist auch m\"oglich eigene Primitives (UDP, {\bf User Defined
Primitives}) zu erstellen.

\vspace*{0.5cm}

\item Den Prozess, Verilog Designs aus Primitives aufzubauen nennt man
Gate-Level Modeling.

\vspace*{0.5cm}

\item Verilog Designs die nur aus Primitives und ihren Verbindungen bestehen
nennt man auch {\bf Verilog Netzlisten}.

\end{itemize}
\end{slide}


\begin{slide}{Verilog HDL - Konzepte (4/4)}
\begin{itemize}

\item Es ist auch m\"oglich Verkn\"upfungen zwischen Signalen mit Operatoren zu codieren.
\item Diesen Ansatz nennt man {\bf Dataflow Modeling}.

\vspace*{1cm}

\item Und ist es m\"oglich eine Schaltung \"uber ihr Verhalten zu codieren.
\item Diesen Ansatz nennt man {\bf Behavioral Modeling}.

\vspace*{1cm}

\item Diese Verfahren sehen rein optisch fast schon wie Programmieren aus.
\item Es ist immer wichtig im Hinterkopf zu behalten, dass es aber genau das
nicht ist!

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Grundlagen und Gate-Level Modeling}

\begin{slide}{Signale}
\begin{itemize}

\item Signale sind die Verilog-Repr\"asentation von Leiterbahnen.

\vspace*{0.5cm}

\item Jedes Signal f\"uhrt zu jedem Zeitpunkt genau einen Wert (normalerweise {\tt 0} oder {\tt 1}).

\vspace*{0.5cm}

\item \"Ahnlich den Variablen in vielen Programmiersprachen m\"ussen Signale
deklariert werden bevor sie verwendet werden k\"onnen.

\vspace*{0.5cm}

\item Signale k\"onnen mit dem {\tt wire} keyword deklariert werden: \\
{\tt wire signal1, signal2, signal3;}

\end{itemize}
\end{slide}


\begin{slide}{Vektoren}
\begin{itemize}

\item Vektoren (Busse) sind die Zusammenfassung mehrerer Signale unter einem Namen.

\vspace*{0.5cm}

\item Die einzelnen Signale eines Vektors sind durchnummeriert.

\vspace*{0.5cm}

\item Bei der Deklaration eines Vektors muss der Indexbereich der Signale {\bf
vor} dem Vektornamen in eckigen Klammern angegeben werden: \\
{\tt wire [31:0] bus\_of\_32\_signals;}

\vspace*{0.5cm}

\item Bei der Verwendung kann man auf Teile des Vektors oder einzelne Signale mit
eckigen Klammern {\bf nach} dem Vektornamen zugreifen: \\
{\tt bus\_of\_32\_signals[15:0]} \\
{\tt bus\_of\_32\_signals[31]}

\end{itemize}
\end{slide}


\begin{slide}{Werte und Konstanten}
\begin{itemize}

\item Signale k\"onnen folgende Werte annehmen:
\begin{itemize}
\item {\tt 0} - Eine logische 0
\item {\tt 1} - Eine logische 1
\item {\tt x} - Ein undefinierter Wert (Kollision bzw. Uninitialisiert)
\item {\tt z} - Hochohmig
\end{itemize}

\vspace*{0.5cm}

\item Konstanten werden gem\"ass folgender Syntax notiert: \\
{\tt <bits>'<basis><werte>}

\vspace*{0.5cm}

\item {\tt <basis>} kann {\tt b} (bin\"ar), {\tt d} (dezimal), {\tt o} (oktal)
oder {\tt h} (hexadezimal) sein.

\vspace*{0.5cm}

\item Underscores in Konstanten werden ignoriert.
\item Einfache Dezimalzahlen sind 32bit Werte.

\vspace*{0.5cm}

\item Beispiele:
\hspace*{0.2cm} {\tt 4b'1010}
\hspace*{0.2cm} {\tt 12h'abc}
\hspace*{0.2cm} {\tt 16'bz}
\hspace*{0.2cm} {\tt 'o777}
\hspace*{0.2cm} {\tt 42}

\end{itemize}
\end{slide}


\begin{slide}{Modul Deklaration}
\begin{itemize}

\item Ein Modul wir eingeleitet mit: \\
{\tt module {\it modulname}({\it portliste});}

\vspace*{0.5cm}

\item Und abgeschlossen mit: \\
{\tt endmodule}

\vspace*{1cm}

\item Die Portliste ist eine mit Kommata getrennte Liste jener Signale die
nach aussen hin sichtbar sein sollen.

\vspace*{0.5cm}

\item Diese Signale m\"ussen im Modulk\"orper mit {\tt input} bzw. {\tt output}
statt {\tt wire} deklariert werden.

\end{itemize}
\end{slide}


\begin{slide}{Instanzierungen}
\begin{itemize}

\item Module k\"onnen Instanzen anderer Module sowie Primitives beinhalten.

\vspace*{0.5cm}

\item Die Instanzierung erfolgt mit folgender Syntax:
{\tt <modul-name> <instanz-name>(<signal-liste>);}

\vspace*{0.5cm}

\item Dabei beinhaltet die {\tt <signal-liste>} jene Signale mit denen die
Ports des Moduls verbunden werden sollen.

\vspace*{0.5cm}

\item Beispiel: \\
{\tt xor my\_xor\_gate(out, in1, in2);}

\end{itemize}
\end{slide}


\begin{slide}{Ports by Name}
\begin{itemize}

\item Bei der Instanzierung komplexer Module mit vielen Ports ist es besser die
Ports lokalen Signalen \"uber die Portnamen als \"uber die Portreihenfolge zuzuweisen.

\vspace*{0.5cm}

\item Das hilft Fl\"uchtigkeitsfehlern vorzubeugen.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
RAMB16_S4_S4 dual_port_mem_cell (
  .DIA(wr_data),    // Port A 4-bit Data Input
  .WEA(wr_en),      // Port A Write Enable Input
  .ADDRA(wr_addr),  // Port A 12-bit Address Input
  .CLKA(wr_clk),    // Port A Clock
  .DOB(rd_data),    // Port B 4-bit Data Output
  .ADDRB(rd_addr),  // Port B 12-bit Address Input
  .CLKB(rd_clk)     // Port B Clock
);
\end{verbatim}

\end{slide}

% ============================================================================

\tsectionandpart{Dataflow Modeling}

\begin{slide}{Assign Statement}
\begin{itemize}

\item Im Dataflow Modeling kann man Ausdr\"ucke (Terme) bilden indem man Signale mit
Operatoren verkn\"upft.

\item Damit kann man z.Bsp. Rechenwerke extrem schnell aufbauen.

\item Man sollte dabei aber nie vergessen, dass jeder verwendete Operator einen
weiteren Hardwareaufwand darstellt.

\vspace*{0.5cm}

\item Das ergebnis eines Ausdrucks kann mit dem {\tt assign} statement einem
neuen Signal zugewiesen werden.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
module add2(sum, a, b);
   output  [2:0]   sum;
   input   [1:0]   a, b;
   assign sum = a + b;
endmodule
\end{verbatim}

\end{slide}


\begin{slide}{Operatoren}
\begin{itemize}

\item Bitweise (infix):
\hspace*{0.3cm} {\tt \& | \textasciicircum{} \textasciitilde{}\textasciicircum{}}
\vspace*{0.1cm}

\item Bitweise (prefix):
\hspace*{0.3cm} {\tt \textasciitilde{}}
\vspace*{0.1cm}

\item Logisch (infix):
\hspace*{0.3cm} {\tt \&\& ||}
\vspace*{0.1cm}

\item Logisch (prefix):
\hspace*{0.3cm} {\tt !}
\vspace*{0.1cm}

\item Reduktion (prefix):
\hspace*{0.3cm} {\tt \& \textasciitilde{}\& | \textasciitilde{}| \textasciicircum{} \textasciitilde{}\textasciicircum{}}
\vspace*{0.1cm}

\item Arithmetrisch (infix):
\hspace*{0.3cm} {\tt + - * / \% **}
\vspace*{0.1cm}

\item Arithmetrisch (prefix):
\hspace*{0.3cm} {\tt + -}
\vspace*{0.1cm}

\item Relational (infix):
\hspace*{0.3cm} {\tt > < >= <= == != === !==}
\vspace*{0.1cm}

\item Shift (infix):
\hspace*{0.3cm} {\tt << >> <<< >>>}
\vspace*{0.1cm}

\item Zusammenh\"angen:
\hspace*{0.3cm} {\tt \{a, b, c\}}
\vspace*{0.1cm}

\item Wiederholung:
\hspace*{0.3cm} {\tt \{4\{a\}\}}
\vspace*{0.1cm}

\item Fallunterscheidung:
\hspace*{0.3cm} {\tt q ? a1 : a2}
\vspace*{0.1cm}

\item Gruppierung:
\hspace*{0.3cm} {\tt (...)}

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Behavioral Modeling}

\begin{slide}{Einleitung}
\begin{itemize}

\item Im Behavioral Modeling wird das Verhalten einer Schaltung beschrieben.

\vspace*{0.5cm}

\item Die Syntheseprodukte solcher Schaltungen vorherzusagen ist nicht immer
ganz einfach.

\vspace*{0.5cm}

\item Daher sollte man soweit es geht hier besonders darauf achten, die 
Syntheseprodukte h\"andisch zu kontrollieren.

\vspace*{0.5cm}

\item Behavioral Modeling eignet sich vor allem f\"ur synchrone (aka.
``getacktete'') Logik.
\item Also Logik mit Registern an den Ausg\"angen.

\end{itemize}
\end{slide}


\begin{slide}{Register und Always Bl\"ocke}
\begin{itemize}

\item Behavioral Modeling geschieht immer in {\tt always} bl\"ocken.

\vspace*{0.3cm}

\item Alle von einem {\tt always} block getriebenen Signale m\"ussen mit {\tt
reg} statt {\tt wire} deklariert werden.

\vspace*{0.3cm}

\item Bei synchroner Logik wird das Synchronisierungsevent mit {\tt @(<event>)}
angegeben, ansonsten {\tt @(*)} verwenden.

\vspace*{0.3cm}

\item Bei mehr als einem Statement im m\"ussen die Keywords {\tt begin} und {\tt
end} benutzt werden.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
always @(posedge clock or posedge reset) begin
   if (reset)
      counter <= 0;
   else
      counter <= counter + 1;
end
\end{verbatim}

\end{slide}


\begin{slide}{If und Case}
\begin{itemize}

\item F\"ur Fallunterscheidungen gibt es ein {\tt if-then-else} Konstrukt sowie
{\tt case}, {\tt casex} und {\tt casez} Konstrukte.

\item Bei {\tt casez} wird {\tt z} und bei {\tt casex} werden {\tt x} und {\tt
z} als don't-care Werte behandelt.

\item If und Case Konstrukte werden zu Multiplexern, (Priority-)Dekodern
und/oder FF-Enable-Signale synthetisiert.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
if (reset) counter <= 0;
else counter <= count + 1;

casex (ins)
  8'b1xxx_xxxx: reg <= {1'b0, ins[6:0]};
  8'b01xx_xxxx: reg <= reg + {2'b00, ins[5:0]};
  8'b00xx_xxxx: reg <= reg - {2'b00, ins[5:0]};
endcase
\end{verbatim}

\end{slide}


\begin{slide}{Non-Blocking und Blocking Assignments}
\begin{itemize}

\item Bei non-blocking assignments ({\tt <=}) gilt der neue Wert erst nach
Durchlauf des {\tt always} blocks.

\vspace*{0.5cm}

\item Bei blocking assignments ({\tt =}) liegt der neue Wert sofort am
Signalnamen an.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
always @(clock) begin
   flip <= flop;
   flop <= flip;
end

always @(*) begin
   addr = base_addr;
   if (use_offset)
      addr = addr + offset;
end
\end{verbatim}

\end{slide}


\begin{slide}{Vermeiden von Hardware Registern}
\begin{itemize}

\item Nicht alle Signale die von {\tt always} Bl\"ocken getrieben werden
m\"ussen als Register ausgef\"uhrt werden.

\vspace*{0.2cm}

\item Oft wird das Synthesetool aber dazu gezwungen ein Register zu erzeugen
weil das Signal nicht in allen Pfaden getrieben wird.

\vspace*{0.2cm}

\item Eine einfache M\"oglichkeit sich vor Programmierfehlern zu sch\"utzen
ist es default-Werte zu verwenden.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
always @(*) begin
   result <= 1'bx;
   if (force_result_to_1)
      result <= 1'b1;
   else
   if (force_result_to_0)
      result <= 1'b0;
end
\end{verbatim}

\end{slide}

% ============================================================================

\tsectionandpart{Weiterf\"uhrende Konzepte}

\begin{slide}{Arrays}
\begin{itemize}

\item Adressierbarer Speicher kann mit Arrays modelliert werden.

\vspace*{0.5cm}

\item Bei der deklaration von Arrays wird die Anzahl der Zellen nach dem
Signalnamen geschrieben.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
module mymem(clock, we, addr, in_data, out_data);
   input clock, we;
   input [7:0] addr, in_data;
   output reg [7:0] out_data;
   reg [7:0] memory [0:255];
   always @(posedge clock) begin
      if (we)
         memory[addr] <= in_data;
      else
         out_data <= memory[addr];
   end
endmodule
\end{verbatim}

\end{slide}


\begin{slide}{Tristate-Netze}
\begin{itemize}

\item Ein Signal kann mehrere Treiber haben.

\vspace*{0.5cm}

\item Ein Signal mit voneinander abweichenden nicht-{\tt z} Treibern nimmt den
Wert {\tt x} an.

\vspace*{0.5cm}

\item Tristate Ports m\"ussen als {\tt inout} deklariert.

\vspace*{0.5cm}

\item Pulldown und Pullup-Netze k\"onnen mit {\tt tri0} und {\tt tri1}
(statt {\tt wire}) modeliert werden.

\vspace*{0.5cm}

\item Wired AND Netze k\"onnen mit {\tt wand} bzw. {\tt triand}, \\
wired OR Netze mit {\tt wor} bzw. {\tt trior} modeliert werden.

\vspace*{0.5cm}

\item Netze mit kapazitativen ``memory'' k\"onnen mit {\tt trireg} modeliert
werden.

\end{itemize}
\end{slide}


\begin{slide}{Parameter}
\begin{itemize}

\item Module k\"onnen parametrisiert werden.
\item Parameter werden mit {\tt parameter} deklariert.
\item Eine M\"oglichkeit Parameter zu \"andern ist: {\tt \#(...)}

\vspace*{0.2cm}

\item Mit {\tt localparam} k\"onnen ``lokale Parameter'' deklariert werden,
die nicht direkt umparametrisiert werden k\"onnen.

\end{itemize}

\vspace*{0.2cm}

\begin{verbatim}
module stepper(clock, reset, value);
   input clock, reset;
   output reg [7:0] value;
   parameter resetval = 0;
   parameter stepsize = 1;
   always @(posedge clock, posedge reset)
      value <= reset ? resetval : value + stepsize;
endmodule
\end{verbatim}

\vspace*{0.2cm}

\begin{verbatim}
stepper #(.resetval(42), .stepsize(7))
   mystepper (clock, reset, stepval);
\end{verbatim}

\end{slide}

\begin{slide}{Funktionen}
\begin{itemize}

\item H\"aufig ben\"otigte Logikbl\"ocke k\"onnen in Funktionen ausgelagert
werden.

\vspace*{0.2cm}

\item Funktionen werden mit {\tt function} deklariert.

\vspace*{0.2cm}

\item Funktionen k\"onnen nur rein kombinatorische Schaltungen abbilden.
Speicherelemente und non-blocking assignments sind nicht erlaubt. Auch
keine delays.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
function [15:0] inverter;
   input [15:0] word;
   begin
      inverter = ~word;
   end
endfunction
\end{verbatim}

\vspace*{0.2cm}

\begin{verbatim}
assign x = inverter(y);
\end{verbatim}

\end{slide}


\begin{slide}{Tasks}
\begin{itemize}

\item Neben Funktionen gibt es auch Tasks.

\vspace*{0.2cm}

\item Diese haben keinen R\"uckgabewert.
\item Daf\"ur d\"urfen sie auch {\tt output} sowie {\tt inout} Ports haben.
\item Und in Tasks sind auch Delays erlaubt.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
task inverter;
   output [15:0] result;
   input [15:0] word;
   begin
      result = ~word;
   end
endtask
\end{verbatim}

\vspace*{0.2cm}

\begin{verbatim}
inverter(x, y);
\end{verbatim}

\end{slide}


\begin{slide}{Generate-Bl\"ocke}
\begin{itemize}

\item Mit {\tt generate} Bl\"ocken k\"onnen Logikbl\"ocke leicht aus Schleifen
und \"Ahnlichem heraus erzeugt werden.

\item Dazu notwendige Variablen (Z\"ahler, etc.) m\"ussen mit {\tt genvar}
deklariert werden.

\end{itemize}

\vspace*{0.4cm}

\begin{verbatim}
module foobarchain(input in, output out);
   parameter chainlen = 8;
   wire [chainlen:0] interconn;
   genvar i;
   generate
      for (i=0; i<chainlen; i = i+1) begin:B1
         foobar chainelement(.in(interconn[i]),
                             .out(interconn[i+1]));
      end
   endgenerate
   assign interconn[0] = in;
   assign out = interconn[chainlen];
endmodule
\end{verbatim}

\end{slide}

\begin{slide}{Compiler Direktiven}
\begin{itemize}

\item Compiler Direktiven beginnen immer mit einem {\tt `} Zeichen.
\item Und werden mit dem Zeilenende abgeschlossen.

\vspace*{1cm}

\item Einige Beispiele f\"ur Compiler Direktiven:

\vspace*{0.5cm}

\item Defines k\"onnen mit {\tt `define <name> <value>} erzeugt und mit {\tt
`<name>} verwendet werden.

\vspace*{0.5cm}

\item Defines k\"onnen mit Konstrukten wie {\tt `ifdef} abgefragt werden.

\vspace*{0.5cm}

\item Andere Dateien k\"onnen mit {\tt `include} eingebunden werden.

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Example: Simplified I2C}

% ============================================================================

\tsectionandpart{Example: Calculator / ALU}

% ============================================================================

\tsectionandpart{Simulation und Test}

\begin{slide}{Integer, Real und Time Register Data Types}
\begin{itemize}

\item Prim\"ar f\"ur die Simulation gibt es neben den Signal Registern ({\tt
reg}) auch weitere Register Datentypen: \\
{\tt integer}, {\tt real} und {\tt time}

\vspace*{1cm}

\item {\tt time} ist mindestens 64 bit breit.

\vspace*{0.5cm}

\item Mit {\tt \$time} kann ermittelt werden, wie viele Zeiteinheiten seit
dem Simulationsstart abgelaufen sind.

\end{itemize}
\end{slide}


\begin{slide}{Prozedurale Programmierung}
\begin{itemize}

\item F\"ur die Simulation gibt es prozedurale Programmkonstrukte wie z.Bsp.
{\tt while} und {\tt for} Schleifen.

\vspace*{0.5cm}

\item Neben {\tt always} Bl\"ocken gibt es auch {\tt initial} Bl\"ocke, die nur
einmal bei Simulationsstart anlaufen.

\vspace*{0.5cm}

\item Mit z.Bsp. {\tt \#100;} kann man in {\tt always} und {\tt initial}
Bl\"ocken 100 Zeiteinheiten warten.

\end{itemize}
\end{slide}


\begin{slide}{System Tasks}
\begin{itemize}

\item System Tasks erlauben w\"ahrend der Simulation die Kommunikation mit der
Aussenwelt.

\vspace*{0.5cm}

\item Die Namen aller System Taks beginnen mit einem {\tt \$}.

\vspace*{0.5cm}

\item Mit {\tt \$finish} kann die Simulation beendet werden.

\vspace*{0.5cm}

\item Mit {\tt \$display} kann eine Textzeile ausgegeben werden.
\item C printf-like Format-Strings sind erlaubt.

\vspace*{0.5cm}

\item {\tt \$monitor} ist wie {\tt \$display}, erzeugt aber automatisch eine
neue Ausgabezeile wenn einer der Werte sich \"andert, mit Ausnahme von {\tt
\$time}.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
initial
   $monitor("%t %b", $time, testee.state);
\end{verbatim}

\end{slide}


\begin{slide}{VCD Dateien}
\begin{itemize}

\item Die Werte von Signalen k\"onnen \"uber den Verlauf einer Simulation
hinweg aufgezeichnet werden.

\vspace*{0.5cm}

\item Daf\"ur gibt es ein standardisiertes Dateiformat: \\
VCD (Value Change Dump)

\vspace*{0.5cm}

\item Das erzeugen von VCD Dateien wird \"uber System Tasks gesteuert.

\end{itemize}

\vspace*{0.5cm}

\begin{verbatim}
initial
   $dumpfile("mydumpdata.vcd");
   $dumpvars(0, testee);
\end{verbatim}

\end{slide}


\begin{slide}{VPI und PLI}
\begin{itemize}

\item VPI und PLI sind C-APIs f\"ur eigene System Tasks.

\vspace*{0.5cm}

\item Damit ist es leicht m\"oglich Verilog Simulationen an externe
Simulationsumgebungen anzubinden.

\vspace*{0.5cm}

\item Einige Anwendungsm\"oglichkeiten sind:
\begin{itemize}
\item GUIs zur einfacheren Interaktion mit der Simulation
\item Datenbanken mit umfangreichen Testdatens\"atzen
\item Integration mit anderen Simulatoren (z.Bsp. qemu)
\end{itemize}

\vspace*{0.5cm}

\item Literatur zu VPI/PLI ist leider extrem teuer.

\vspace*{0.5cm}

\item Aber die System Task Implementierungen aus den Icarus Verilog Sourcen
sind eine gute Referenz.

\vspace*{0.5cm}

\item Und der IEEE Verilog Standard ist sehr bequem zu lesen.

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{FPGA Synthese}

\begin{slide}{Constraints}
\begin{itemize}

\item F\"ur die Synthese brauchen die FPGA Tools zus\"atzliche Informationen,
sogenannte Constraints. Das sind z.Bsp.:
\begin{itemize}
\item Welches Signal liegt auf welchem I/O Pin
\item Wie geh\"oren die I/O B\"anke konfiguriert
\item Wie schnell schalten Clocks und andere Signale
\end{itemize}

\vspace*{0.2cm}

\item Die exakte Syntax ist herstellerspecifisch.

\vspace*{0.2cm}

\item Xilinx benutzt externe UCF Dateien sowie Verilog Attribute.

\vspace*{0.2cm}

\item Dokumentation: Software Manuals - Constraints Guide

\end{itemize}

\vspace*{0.5cm}

\tiny
\begin{verbatim}
NET "clk50m"      LOC = "E12"  | IOSTANDARD = LVCMOS33 | PERIOD = 20.000 ;
NET "leds<0>"     LOC = "R20"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "leds<1>"     LOC = "T19"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "leds<2>"     LOC = "U20"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "leds<3>"     LOC = "U19"  | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
NET "buttons<0>"  LOC = "V8"   | IOSTANDARD = LVCMOS33 ;
NET "buttons<1>"  LOC = "U10"  | IOSTANDARD = LVCMOS33 ;
NET "buttons<2>"  LOC = "U8"   | IOSTANDARD = LVCMOS33 ;
NET "buttons<3>"  LOC = "T9"   | IOSTANDARD = LVCMOS33 ;
\end{verbatim}

\end{slide}


\begin{slide}{Design Libraries}
\begin{itemize}

\item Die Hersteller liefern Bibliotheken mit Modulen f\"ur alle m\"oglichen
Zwecke.

\vspace*{0.5cm}

\item Es empfiehlt sich sich mit diesen Bibliotheken vertraut zu machen und
sie gegebenenfalls zu Nutzen.

\vspace*{0.5cm}

\item Besonders wichtig in diesem Zusammenhang sind:
\begin{itemize}
\item RAM und ROM Zellen
\item Komplexe Arithmetik
\item Clock Buffer
\end{itemize}

\vspace*{0.5cm}

\item Viele FPGA Entwicklungsumgebungen haben auch Tools zum Generieren
speziell angepasster Module.

\end{itemize}
\end{slide}

% ============================================================================

\tsectionandpart{Referenzen}

\begin{slide}{Literatur}
\begin{itemize}

\item ``Verilog HDL'' (Samir Palnitkar) \\
ISBN-13: 978-0130449115

\vspace*{0.4cm}

\item ``CMOS VLSI Design'' (Neil H.E. Weste) \\
{\tt http://www.aw-bc.com/weste/} \\
ISBN-13: 978-0321149015

\vspace*{0.4cm}

\item ``Layoutsynthese elektronischer Schaltungen'' (Jens Lienig) \\
{\tt http://www.ifte.de/lienig/layout/index.html} \\
ISBN-13: 978-3540296270

\vspace*{0.4cm}

\item Verilog HDL auf Wikipedia: \\
{\tt http://en.wikipedia.org/wiki/Verilog}

\vspace*{0.4cm}

\item IEEE 1364-2005 Standard \\
{\tt http://ieeexplore.ieee.org/ \\
\hspace*{0.5cm} servlet/opac?punumber=10779}

\end{itemize}
\end{slide}


\begin{slide}{Freie Software}
\begin{itemize}

\item Icarus Verilog \\
{\tt http://www.icarus.com/eda/verilog/}

\vspace*{0.5cm}

\item GTKWave \\
{\tt http://home.nc.rr.com/gtkwave/}

\vspace*{0.5cm}

\item Qucs \\
{\tt http://qucs.sourceforge.net/}

\end{itemize}
\end{slide}


\begin{slide}{Nicht-Freie Software}
\begin{itemize}

\item Xilinx ISE (WebPACK) \\
{\tt http://www.xilinx.com/ise/}

\vspace*{0.5cm}

\item Synopsys VCS \\
{\tt http://www.synopsys.com/products/simulation/}

\vspace*{0.5cm}

\item Cadence NC-Verilog \\
{\tt http://www.cadence.com/products/ \\
\hspace*{0.5cm} functional\_ver/nc-verilog/}

\vspace*{0.5cm}

\item Mentor ModelSim \\
{\tt http://www.model.com/}

\end{itemize}
\end{slide}

% ============================================================================

\end{document}

