21.12.2006 Einführung in Verilog 1
Einführung in Verilog HDL
IEEE-1364
Prof. Dr. Bernhard Hoppe, Karthikeyan Balasubramanian, M.Sc.
®
21.12.2006 Einführung in Verilog 2
Verilog Historie
?Ursprünglich eine proprietäre Sprache der Firma Cadence und ein Teil des Verilog-XL Logik Simulators (entstanden 1985)
? Verilog-HDL wurde im Jahr 1990 öffentlich zugänglich
? Beginn der Normierung durch IEEE im Jahr 1993
? 1995 hat IEEE den Standard Verilog als IEEE-Norm 1394 veröffentlicht
? Die Aktualisierung der Norm 2001: Verilog2001TM
21.12.2006 Einführung in Verilog 3
Grundlegende Syntax
21.12.2006 Einführung in Verilog 4
Struktur eines Verilogmodells
Name des Moduls
Port Liste,Port Deklaration, Parameter Deklaration
Variablen Deklarationen, Zuweisungen, Module Instanziierung, sequentielle Blöcke, Unterprogramme
Modul Name
Body
Endmodule
Interface
Abschluss des Moduls
Das Modul ist die grundlegende Modellierungseinheit
21.12.2006 Einführung in Verilog 5
Kommentare
? Kommentare verbessern die Lesbarkeit von Verilog Modellen und dienen der Dokumentation.
? Es gibt zwei verschiedene Kommentaranweisungen. Einzeilige Kommentare beginnen mit “//”.
Mehrzeilige Kommentaranweisungen beginnen mit
“/*” und enden mit “*/”
Beispiele//Beispiel für einen einzeiligen Kommentar /* Beispiel für einen Kommentar über zwei
Zeilen*/
21.12.2006 Einführung in Verilog 6
LeerzeichenLeerzeichen (White spaces)(White spaces)
?Nicht alle Zeichen werden dargestellt! ?Nicht angezeigt werden z.B. Tabulatoren ? In der Regel werden diese Zeichen vom Simulator
ignoriert. Aber in Zeichenketten können sie wichtig sein!
?Nicht angezeigte Zeichen sind:– Leerzeichen,Tabulatoren– Tabulatoren – Zeilenabschlüsse (carriage returns)– Zeileneinschub – Seiteneinschub
21.12.2006 Einführung in Verilog 7
Bezeichner
Die folgenden Regeln müssen berücksichtigt werden, wenn
ein Modul oder Variable benannt werden:
? Verilog unterscheidet zwischen grOgrOßß undund kLEINschreiBunGkLEINschreiBunG
? Zulässig in Namen sind: a-z , A-Z , 0-9 , $
? Ein Name beginnt mit Buchstaben oder Unterstrich (underscore)
? $ Symbol ist am Anfang verboten
? Nicht länger als 1024 Zeichen
? Schlüsselworte der Sprache sind nicht als Name erlaubt:reg,wire,module etc.
21.12.2006 Einführung in Verilog 8
Logiksystem von Verilog
? In Verilog sind die vier logischen Zustände 1, 0, X, Z
vordefiniert:
1 -- High (wahr)
0 -- Low (falsch)
X -- Unbekannt (0 , 1 or Z)
Z -- Hohe Impedanz
? Neben diesen logischen Werten können 8 Signalstärken
verwendet werden. (Siehe nächste Folie)
21.12.2006 Einführung in Verilog 9
Signalstärken
? Es gibt 8 Stärken
HiZ0 HiZ1highz0 highz1Hohe Impedanz(kein Treiber)
0
Sm0 Sm1smallKleine Kapazität1
Me0 Me1mediumMittlere Kapazität2
We0 We1weak0 weak1Schwacher Treiber3
La0 La1largeGroße Kapazität4
Pu1 Pu0pull0 pull1Pull-up/down Stärke5
St0 St1strong0 strong1Starker Treiber6
Su0 Su1supply1 supply0Versorgung7
MnemonicBezeichnerStärkeEbene
21.12.2006 Einführung in Verilog 10
Zahlenspezifikation
? Zahlen werden in Verilog folgendermaßen vorgegeben:
Zahl der Bits ' Radix Wert
Stellen-zahl
Stellen-zahl
Binär ? b od. BOktal ? o od. ODezimal ? d od. DHexadezimal ? h od, H
Binär ? b od. BOktal ? o od. ODezimal ? d od. DHexadezimal ? h od, H
Ziffern oder Logikwerte
0-F, x, z
Ziffern oder Logikwerte
0-F, x, z
Beispiel
2’b00;4’d3;
21.12.2006 Einführung in Verilog 11
Operatoren wirken auf Operanden. Es gibt:
? arithmetische Operatoren* , / , + , - , % (Multiplikation, Division, Addition, Subtraktion, Modulo)Beispiel für den Modulo Operatorx = 3; y = 4;result = y % x; // result wird ‘1’
? logische Operatoren! , && , ||(logische-Negation, logisches-UND, logisches-ODER)
Operatoren
21.12.2006 Einführung in Verilog 12
OperatorenOperatoren? Vergleichsoperatoren
> , < , >= , <= (größer als, kleiner als, größer-gleich, kleiner-gleich)
? Schiebe-Operatoren>> , <<
(schiebe nach rechts, schiebe nach links)Beispiel für SchiebeoperatorA = 8‘b1010_0000A << 2 // ergibt 1000_0000;
21.12.2006 Einführung in Verilog 13
?Gleichheits-Operatoren== , != , === , !== (gleich, ungleich, Zeichen-Gleichheit bzw. -Ungleichheit)
Zeichen-Gleichheit (case equality):‘x’- und ‘z’-Werte mit eingeschlossen!
Beispiele(4’b 1z0x) == (4’b 1z0x) ? x(4’b 1z0x) != (4’b 1z0x) ? x//‘x‘ und ‘z’ werden nicht verglichen(4’b 1z0x) === (4’b 1z0x) ? 1(4’b 1z0x) !== (4’b 1z0x) ? 0//‘x‘ und ‘z’ werden mit verglichen
OperatorenOperatoren
21.12.2006 Einführung in Verilog 14
?Bitweise Operatoren~ , & , | , ^ , ^~ or ~^
(nicht, und, oder, exklusiv oder xor, xnor)
Unterschied zwischen logischen und bitweisen OperatorenLogische Operatoren in booleschen Ausdrücken
Bitweise Operatoren wirken auf die Bits von Signalen
BeispieleA = 3’b001 und B = 3’b11xA && B //ergibt 1’b1 logischer Wert: WahrA & B // ergibt 3’b00x logischer Wert: Falsch
OperatorenOperatoren
21.12.2006 Einführung in Verilog 15
OperatorenOperatoren
?Bedingungs- oder ternärer Operator? :
Beispiela= 3´b001;b= 3´b000;c= 2´b01;d= 2´b01;y = (c == d) ? a+b : a-b ;/* Hier ist ‘c’ gleich‘d’. Also wird ‘y’ a + b zugewiesen (3´b001+ 3`b000 = 3´b001) */
?Reduktionsoperatoren& , ~& , | , ~| , ^ , ^~ (UND, nicht-UND, ODER, nicht-ODER, xor, xnor) Operatoren erzeugen einen Skalar aus einem Vektor
Beispielz = &(10011);// ergibt ‘0’t = |(001); // ergibt ‘1’
21.12.2006 Einführung in Verilog 16
OperatorenOperatoren
? Zusammenfassender Operator (Concatenation Operator)
{ }
Beispiela = 2’b00; b = 4’b1111;c = {a,b}; //output is “c = 6’b00_1111”
?Replikations-Operator
{ { } }
Beispiela = 2’b00; b = 4’b1111;c = {3{a},2{b}};//Ergebnis “c = 14’b00_00_00_1111_1111”
21.12.2006 Einführung in Verilog 17
Operator-Rangordnung
!, &, ~&, | ~, | ^, ~^, +, -(Vorzeichenoperator)
*, /, %+, -
<<, >> <, <=, >=, >
==, !=, ===, ~==&, ~&, ^, ~^
|, ~|,&&
||? :
Hoch
niedrig
21.12.2006 Einführung in Verilog 18
Datentypen
Datatypen fallen in zwei Kategorien
?Register: speichern Daten
? Verhalten sich wie Variablen in Standard-Programmiersprachen
behalten also ihren Wert
hat nichts mit einer Registerschaltung zu tun
?Netze: Definieren Verbindungsstrukturen (connectivity)
? Verhalten sich wie Verbindungsleitungen in einer Schaltung
?müssen ständig getrieben werden, damit sie ihren Wert behalten!
21.12.2006 Einführung in Verilog 19
Register
regintegerrealtimerealtime
Netze
wire tri supply0 supply1wand wortriand triortri1 tri0trireg
Datatypen
21.12.2006 Einführung in Verilog 20
Register
reg Voreinstellung: 1 bit skalarer Datatyp, Anfangswert xreg[31:0] prod is a 32 bit register named prod
integer 2er-Komplement Integerzahl
real Reelle Fließkommagröße: 0.4 or 1.2E12
time 64bit positive physikalische Größe für dieErfassung der Simulationszeit
realtime real-Zahl gespeichert im Fließkommaformat, 0.12
Datatypen
21.12.2006 Einführung in Verilog 21
wire nur Verbindungtri nur Verbindung, aber tristate abschaltbar
supply0 globale Verbindung nach GND
supply1 globale Verbindung nach VDD
wand, wor verbundenes (wired) UND, ODERtriand, trior wired UND, wired ODER aber tristate abschaltbar
tri1, tri0 Widerstand nach VDD, GND(pull-up, pull-down)
trireg ein Netz das die gespeicherte Ladung in einerphysikalischen Leitung nachbildet
Datentypen
21.12.2006 Einführung in Verilog 22
Zeichenfolgen (Strings)
? Verilog hat keinen speziellen Datentyp für Strings.? Strings können aber in reg-Datatypen gespeichert
werden, wenn diese in geeigneter Form deklariertwerden.
Beispiel
reg [8*10: 0]a;a = “verilog_HDL”;
/*‘a’ kann 11 Zeichen aufnehmen. Jedes Zeichendarf aus 8 Bits bestehen*/
21.12.2006 Einführung in Verilog 23
Einfache Verilog Modelle
21.12.2006 Einführung in Verilog 24
Verilog Primitive
? Verilog verfügt über vordefinierte primitive Komponenten für strukturelle Modelle
? Es gibt Verilog-Primitive für logische Gatter, Treiber und Transistoren
? Es handelt um “smart primitives” weil diese Primitiven mit einer beliebigen Zahl an Eingängen bzw. Ausgängen bei Treibern vorgegeben werden können.
? Beispielsweise kann ein “and” Gatterprimitiv über zwei, oder über drei oder sogar noch mehr Eingangssignale verfügen!
21.12.2006 Einführung in Verilog 25
Liste der vordefinierten Primitiven
Logikgatter and, nand, or, nor, xor, xnor
Treiberbuf, bufif0, bufif1not, notif0, notif1,pulldown, pullup
Transistoren und Transfergatternmos, pmos, cmosrnmos, rpmos, rcmostran, tranif0, tranif1,rtran, rtranif0, rtranif1
21.12.2006 Einführung in Verilog 26
Eigenschaften der Primitiven? Primitive erkennt man am Schlüsselwort
? Sie definieren kombinatorische Logikfunktionen oder Schaltfunktionen auf Transistorebene
? Primitive können nur innerhalb von Modulen instanziiert werden
? Der erste Port einer primitiven Gatter-Komponente ist das Ausgang gefolgt von den Eingängen
? Bei primitiven Treiberprimitiven werden die Ports als erste aufgezählt der eine Eingang steht am Ende der Portliste .
? Verilog erlaubt auch anwenderdefinierte primitive
Komponenten. Diese können kombinatorisch oder sequentiell
(flip-flops) sein.
21.12.2006 Einführung in Verilog 27
Syntax in Verilog-Modulen
Name des Moduls
Port Liste,Port Deklaration, Parameter Deklaration
Variablen Declarationen, Zuweisungen, Module Instanziierung, sequentielle Blöcke, Unterprogramme
Modul Name
Body
Endmodule
Interface
Abschluss des Moduls
Das Modul ist die grundlegende Modellierungseinheit
21.12.2006 Einführung in Verilog 28
Port-Typen
? Ports sind die Schnittstellen eines Moduls zur Außenwelt?Der Porttyp legt die Datenflussrichtung fest.? Alle Ports müssen definiert werden.
Typen Schlüsselwort Kommentar
module input
output
inout
Fluss ins Modul
Fluss aus dem Modul heraus
Bidirektionales Datenfluss
module
module
21.12.2006 Einführung in Verilog 29
Port Verbindungsregeln
reg oder net netinput
net
reg oder net
net inout
output net
Module können in Strukturmodellen als Komponenteneingesetzt werden ? Regeln für Datentypen der Ports
Inputs - interner Eingang ist immer ein Netz (net), externer Port net oder reg (Register)
Output - interner Ausgang net oder reg (Register), extern nur net
Inout - intern und extern betrachtet nur net
21.12.2006 Einführung in Verilog 30
Verhaltensmodelle
Aufgabe:? Erstellen Sie ein Modul, das 2 Eingänge und einen
Ausgang aufweist? Sind beide Eingänge “low”, dann wird der Ausgang auf
“high” gesetzt.? Jede andere Kombination der logischen Eingangspegel
erzeugt einen “low”-Wert am Ausgangsport.
Module
A
B
C
21.12.2006 Einführung in Verilog 31
Analyse der Vorgabe
?Wahrheitstabelle: Verhalten = XOR-Gatter
011101110000
Ausgang CEingang BEingang A
Module
A
B
C
21.12.2006 Einführung in Verilog 32
Design
? Das Modul ist die grundlegende Modellierungseinheit.
? Ein Modul kann ein gesamtes System, eine Leiterplatte, einen Chip oder auch nur ein logisches Gatter darstellen.
Module
A
B
C
21.12.2006 Einführung in Verilog 33
Verhaltensmodell des XOR Gatters
module xor_gate (a, b, c);
input a,b;
output c;
xor(c,a,b);
endmodule
Modul-Name
Schnittstellen
Modell-Körper
endmodule als Abschluss
21.12.2006 Einführung in Verilog 34
Strukturelles Modell
Statt Verhaltensmodelle können auch Strukturmodelle ausvernetzten Modulen geschrieben werden:
Beispiel:module struct (in1,in2,in3,in4,out);input in1,in2,in3,in4;output out;wire y1,y2;and (y1,in1,in2);and (y2,in3,in4);xor (out,y1,y2);
endmodule
in1
in2
in3
in4
y1
y2
out
21.12.2006 Einführung in Verilog 35
Skalare Größen und Vektor-Signale
? Eine skalare Verbindung (Netzdatentyp wire) entspricht einer einzelnen Signalleitung, die einen einzelnen Logikwert zu jeder Zeit trägt.
Syntax
wire bit;
?Mehrfachverbindungen können mehrere Bits transportieren.
Syntax
wire [0:n]bus; //‘n’ist bel. integer
?Die gleiche Syntax gilt auch für Registertypen reg
21.12.2006 Einführung in Verilog 36
? Speichernde Elemente
Zweidimensionale Felder modellieren Speicherblöcke
Syntax
reg [7:0]mem[0:1023];// 1024 8 Bit register
?Höherdimensionale Arrays erst ab Verilog-2001!
reg [4:0]mem[4:0][4:0];/* 2 dimensionales
Feld aus 5-Bit Worten */
Skalare Größen und Vektor-Signale
21.12.2006 Einführung in Verilog 37
Gatterverzögerungszeiten (Delays)
?Delays können primitiven Gattern zugewiesen werden, um hardwarenah zu modellieren
? Es gibt drei Arten von Delays: Rise, Fall und Turn-offDelay (Delays für steigende und fallende Flanken sowie das Abschaltdelay)
?Rise-Delay: Verzögerung bei Übergang in den Zustand ‘1’ aus anderen Zuständen
? Fall-Delay: Verzögerung bei Übergang in den Zustand ‘0’ aus anderen Zuständen
? Abschalt-Delay bei Übergang in den Zustand ‘Z’ (hohe Impedanz aus anderen Zuständen
21.12.2006 Einführung in Verilog 38
Delay-Vorgabe bei Primitiven
and #2 (out, in1, in2);
// delay von 2 Zeiteinheiten für alle Übergänge
and #(1.1, 2.1)(out, in1,in2);
// Rise-Delay 1.1 Fall-Delay 2.1
and #(1:2:3) (out, in1, in2);
// min.: typ.: max. Delay für alle Übergänge
and #(1.2:3.7:4.5),(3.1:6.0:7.8),(2.0:4.5:6.0)
(out,in1,in2); /*Separate min: typ: max Delays fürrise, fall und Abschalt Verzögerung.*/
21.12.2006 Einführung in Verilog 39
Transistor als Schalter (Switch-Level)
Verilog bietet die Möglichkeit digitale Transistorschaltmo-delle aufzubauen:
Beispiel: 3faches NAND Gatter Vdd
a b c
a
c
b
y
gnd
21.12.2006 Einführung in Verilog 40
Implementierung des Switch-Level-Modellsmodule nand_gate (y,a,b,c);input a,b,c;output y;
supply0 gnd;supply1 power;wire y1,y2;
pmos(y,power,a);pmos(y,power,b);pmos(y,power,c);nmos(y,y1,a);nmos(y1,y2,b);nmos(y2,gnd,c);
endmodule
21.12.2006 Einführung in Verilog 41
Übung 1
Schreibe ein strukturelles Modell für das gezeigte RS-Latch!Füge die angegebenen Delays hinzu!
Q
Q_
reset
set
Rise-tpy:5 min:3 max 7, Fall-6, Turnoff-4
Fall-tpy:5 min:3 max 7, Rise-6, Turnoff-4
21.12.2006 Einführung in Verilog 42
Modellierungstips
? Verilog-Quelltext kann in jedem Ordner abgelegt werden.
?Quelltext kann mit beliebigem Editor erstellt werden oder
(besser wegen Farbcodierung) mit den Editoren von
Simulationswerkzeugen.
?Dateien mit Verilog Quelltext können beliebig heißen, aber
es ist günstig, die Datei wie das Modul zu benennen.
? Es ist empfehlenswert, den Modulnamen sinnvoll, also
angelehnt an die beschriebene Komponente zu wählen,
also DFF für ein D-Flip-Flop.
21.12.2006 Einführung in Verilog 43
Model-Test
? Jedes Design muss getestet werden, um die Funktion sicherzustellen. Dazu wird simuliert.
? Ein Simulator kann Verilog-Modelle zeilenweise prüfen, um Fehler zu lokalisieren.
? Ist das Modell kompiliert, wird es mit geeigneten Testvektoren angesteuert.
Beispielmodellmodule xor_gate(a,b,c);
input a,b;output c;xor (a,b,c);
endmodule
21.12.2006 Einführung in Verilog 44
Test des XOR_Gatter-Modells
? Der Simulator wird gestartet und das xor_gate Model kompiliert. ? Danach wird der Simulator so eingestellt, dass die Ausgangs- und
Eingangsignale als Wellenzüge dargestellt werden (ports a, b und c).? Das Modell wird mit folgendem Stimulus angesteuert:
Wert Zeit erwarteter Ausgang force a 0 0 0force b 0 0 0force a 1 50 1force b 1 100 0force a 0 150 1force b 0 200 0
? Simuliere 250 Zeitschritte (Run for 250).
21.12.2006 Einführung in Verilog 45
Model Test im Überblick
Erzeuge den Quellcode für das Verilog Modell!
Kompiliere den Quelltext!
Korrigiere die Syntax-Fehler und kompiliereerneut!
Rufe den Simulator auf und lege die Eingangsmuster an! Prüfe Ausgangssignale!
Modell
Entwicklung
Kompiliere
Design
Beseitige
Syntax
Fehler
Simuliere
das Design
Fehler? Korrigiere Modell, kompiliere/simuliereerneut!
21.12.2006 Einführung in Verilog 46
Übung 2
1. Finden Sie die Fehler in folgendem Modell ?module port (a, b, c);input a, b;output c;reg a, b, c;//statements;
endmodule2. Ergänzen Sie die unvollständigen Anweisungen!
module exe (x, y, p, q);input x, q;output ________;reg ________;wire ________;//statements;
endmodule
21.12.2006 Einführung in Verilog 47
Übung 3
1. Welche Variablen haben falsche Namen?a. data_bus ( )b. _net ( )c. reg ( ) d. $flag ( )
2. Welche Zahlen sind falsch dargestellt?a. 2’d 5; ( )b. 4’h a; ( )c. 10’b x; ( )d. 3’d 111; ( )
21.12.2006 Einführung in Verilog 48
Systemaufgaben und Kompilerdirektiven
21.12.2006 Einführung in Verilog 49
Systemaufgaben (System tasks)
? Verilog stellt verschiedene eingebaute Routinen für Systemfunktionen zur Verfügung, um z.B. Ergebnisse zu drucken oder von Dateien zu lesen.
? Jede System-Task erkennt man am Symbol $ vor dem jeweiligen Schlüsselwort.
? System-Tasks dürfen nur aus prozeduralen Blöcken heraus aufgerufen werden (initial Block und alwaysBlock, siehe unten)
Beispiele
$display
$monitor
21.12.2006 Einführung in Verilog 50
Systemaufgaben (System tasks)
? $display – zeigt Werte von Variablen, Zeichenfolgen oder Ausdrücken auf dem Bildschirm an
Syntax$display (“format_def”, p1,p2,p3);“format_def”: Hier wird vorgegeben, in
welchem Format die Werte angezeigt sollen.
p1,p2,p3 : ausgewählte Variablen, deren Werte angezeigt werden sollen
Beispielea = 5;$display(“Hello world”); //druckt Zeichenfolge $display(“a=%d”,a);// gibt den Wert von ‘a’ aus
21.12.2006 Einführung in Verilog 51
$monitor
$monitor (“format_string”, p1,p2,p3);? $monitor verhält sich wie $display, ist aber immer aktiv. $monitor gibt die Variable bei jeder Zustandsänderung aus.
? Zu einer best. Zeit kann nur ein $monitor - Statement aktivsein. Sind mehrere $monitor Anweisungen aktiviert, wirdnur die zuletzt aufgerufene ausgeführt.Besipielinitial
$monitor (“state=%d”, state);/* wenn sich die Größe‘state’ändert, wird ihrWert ausgedruckt */
21.12.2006 Einführung in Verilog 52
Formatierungsmöglichkeiten
?%d oder %D als Dezimalzahl anzeigen
?%b oder %B binär anzeigen
?%s oder %S als Zeichenfolge anzeigen
?%h oder %H als Hex-Zahl anzeigen
?%c oder %C als ASCII-Symbol anzeigen
?%v oder %V Signalstärke anzeigen
?%o oder %O als Oktalzahl anzeigen
?%t oder %T Variable im Current-Time-Format anzeigen
?%f oder %F als relle Zahl anzeigen
21.12.2006 Einführung in Verilog 53
Wichtige System-Routinen
? $time - gibt die aktuelle Simulationszeit zurück
? $stop - hält den Simulator an, und setzt das System in den interaktiven Modus
? $finish - stoppt den Simulator
? $fopen - öffnet eine Datei
? $fclose – schließt eine Datei
? $fwrite – schreibt Daten in eine Datei
? $reset - setzt den Simulator zurück
? $random – erzeugt ganzzahlige Zufallszahlen
21.12.2006 Einführung in Verilog 54
Wichtige System-Routinen
? $monitoroff- deaktiviert die aktuelle $monitor-Routine
? $monitoron - aktiviert $monitor
? $strobe - anzeigen von Variablen am Simulationsende
? $readmemh - lese Hex-Daten aus einer Datei
? $readmemb - lese Binär-Daten aus einer Datei
? $setup - bestimme die setup time (Timing Check)
? $hold - bestimme die Halte-Zeit
? $period - bestimme die Periodendauer eines Signals
21.12.2006 Einführung in Verilog 55
Übung 4
Was wird nach folgenden Anweisungen ausgegeben?
1. latch = 4’d12;
$display(“Der aktuelle Wert von latch= %b”, latch);
2. in_reg = 3’d2;
$display($time,”in_register Wert = %b,in_reg[2:0]);
21.12.2006 Einführung in Verilog 56
Compiler-Direktiven
?Mit diesem Direktiven kann man in Verilog den Kompilationsvorgang steuern. Diese Anweisungen beginnen mit dem `-Symbol
? Einige wichtige Compiler-Direktiven sind
– `define– `include– `ifdef– `else– `endif– `timescale– `reset_all
21.12.2006 Einführung in Verilog 57
? `define – ersetzt als Makrofunktion Text im Verilog-Code. Eine Zeichenfolge kann über einen Namen angesprochenwerden.
Beispiel `define read 1
Wenn im Quellcode ‘read’ auftaucht, wird dieseZeichenfolge durch ‘1’ersetzt
? `include – setzt ein anderes Verilog-File ein:
Beispiel `include “old_file.v”
Compiler-Direktiven
21.12.2006 Einführung in Verilog 58
`ifdef, `else, `endif? Bedingte Kompilation: Verilog kann wahlweise
bestimmte Programmzeilen einschließen oder nicht.Syntax`ifdef macro_name
source_code;`else
source_code;`endif
Compiler-Direktiven
`ifdef TEST/*kompiliere “module one()” nur, wenn TEST gesetzt ist */module one();......endmodule`else /*kompiliere “module two()” als Voreinstellung */module two();......endmodule`endif /* Ende der bedingtenKompilation */
21.12.2006 Einführung in Verilog 59
? `timescale gibt die physikalische Dimension der Zeiteinheit in einer Verilogbeschreibung vor.
Syntax
`timescale <time_unit> / <time_precision>
? Time unit (1. Parameter) definiert die Zeiteinheit.
? Time precision (2. Parameter) die Zeitauflösung.
? Beide Parameter sind ganze Zahlen, mit den Werten 1,10 oder 100.
Compiler-Direktiven
21.12.2006 Einführung in Verilog 60
?Mögliche Zeiteinheiten s (Sekunde), ms (Millisekunde), us (Mikrosekunde), ns (Nanosekunde), ps(Picosekunde), fs (Femtosekunde)
Beispiel`timescale 1ns/100pshier ist #4 ein Delay von 4 Nanosekunden#4.234 und entspricht 4.23ns
`timescale 10ns/100pshier ist #4 gleich 40 Nanosekunden und#4.234 entspricht 42.34ns
Compiler-Direktiven
21.12.2006 Einführung in Verilog 61
Kontinuierliche Anweisungen,Delay,
Prozedurale Blöcke und Answeisungsgruppen
21.12.2006 Einführung in Verilog 62
Kontinuierliche Anweisung
? Anweisungen, die einem Netz logische Pegel zuweisen.?Die Anweisungen sind immer aktiv (wie Signalzu-
weisungen in VHDL). Zuweisung erfolgt mit Zustandswechsel auf der rechten Seite (Event).
? Kontinuierliche Zuweisungen können innerhalb wie außerhalb von prozeduralen Blöcken erfolgen
Syntaxassign wire_name = expression;
Beispielassign sum = a + b;
21.12.2006 Einführung in Verilog 63
Signalverzögerungen (Delays)
?Der Operator ‘ # ’ gibt Delays in Verilog an.
? ‘ # ’ heißt: „Warte eine bestimmte Zeit!“Beispiel
assign # 5 c = a & b;
a
b
c
0 5 10 15 20 25 30
21.12.2006 Einführung in Verilog 64
Prozedurale Blöcke
? Es gibt zwei prozedurale Blöcke
initial -Block
always -Block
?Werden primär in Verhaltensmodellen verwendet.
? Alle Verilog-Anweisungen, die Verhalten beschreiben
(behavioral statements) dürfen nur in diesen Blöcken
verwendet werden.
? Verschiedene prozedurale Blöcke in einem Modell
werden zeitlich parallel bei der Simulation ausgeführt.
21.12.2006 Einführung in Verilog 65
Initial-Block?Der Initial-Block wird nur einmal ausgeführt (one-shot
activity flow)
? Er dient zu Initialisierung von Variablen.
Syntaxinitial
variable_name = value;
Beispielinitial
a = 2’b00;
21.12.2006 Einführung in Verilog 66
Always-Block
?Dieser Block wird wiederholt ausgeführt.?Wenn sich in der Sensitivitätsliste eine Variable ändert,
wird der Block einmal durchlaufen.
Syntax
always @ (sensitivity_list)sequential statement;
Beispiel
always @ (a or b) //’or’ ist einSchlüsselwort
c = a + b; /* Wenn sich ‘a’ oder ‘b’ ändern, wird ‘c’ neu berechnet*/
21.12.2006 Einführung in Verilog 67
Ablauf bei beiden Blocktypen
Initialblock
Alwaysblock
Start
Ende
t = 0 t = 0
Reagiere auf Ereignis
21.12.2006 Einführung in Verilog 68
Anweisungsgruppen
? Treten in einem prozeduralen Block mehrere Anwei-sungen auf, müssen die Anweisungen gruppiert werden.
?Gruppieren kann man mit den Schlüsselworten
begin und end
(oder)
fork und join.
?Diese Schlüsselworte lassen sich verschachteln.
? In begin end Blöcken sind die Anweisungen sequentiell und die Delays addieren sich.
21.12.2006 Einführung in Verilog 69
Beispielinitial begin#5 c = 1;#5 b = 0;#5 d = c;
end
? Hier wartet die zweite Anweisung, bis die erste ausgeführt worden ist.
? Der Block ist nach 15 Zeiteinheiten abgearbeitet.
b
c
d
0 5 10 15 t->
Zusammenfassen von Statements zu Anweisungsgruppen
21.12.2006 Einführung in Verilog 70
? In fork-join Blöcken sind die Statements neben-läufig und die Delays sind voneinander unabhängig.
Beispielinitial
fork#5 c = 1;#5 b = 0;#5 d = c;
join? Hier wird das zweite Statement parallel zum ersten
abgearbeitet. ? Der Block ist nach 5 Zeiteinheiten beendet.
0 5 10 15
b
c
d
t->
Zusammenfassen von Statements
21.12.2006 Einführung in Verilog 71
Das träge Delay und das Transportdelay module delay (in, transport, inertial); input in;output transport;output inertial;reg transport;wire inertial;
assign #100 inertial = in;always @ (in)
begintransport <= # 100 in;
endendmodule
21.12.2006 Einführung in Verilog 72
0 50 100 150 200 250 300 350 400 450 500
in
transport
inertial
Ergebnis als Wellenzüge
?Das Inertial Delay (träges Delay) blendet Eingangssignal-wechsel, die kürzer als die Verzögerungszeit sind, aus.
?Das Transportdelay verzögert jedes Signal wie vorgege-ben!
21.12.2006 Einführung in Verilog 73
Übung 5
? Bestimme die Simulationszeit für jedes Statement. Gebe die End- und Zwischenwerte von a, b, c und d an!
initialbegina = 1'b0;b = #10 1’b1;c = #5 1’b0;d = #20 {a, b, c};
end
21.12.2006 Einführung in Verilog 74
Zeitliche Anblaufkontrolle und prozedurale Zuweisungen
21.12.2006 Einführung in Verilog 75
Prozedurale Ablaufsteuerung
? ‘#’ Operator blockiert die Abarbeitung von Anweisungenfür eine bestimmte Zahl von Zeiteinheiten.
?Der Eventsteuerungsoperator ‘@’ lässt die Abarbeitungnur bei Signalflanken zu. Es gibt 2 Typen: Beispiel für Typ 1 begin
……@ trig sum = a + b; /*sobald ‘trig’ gesetzt ist, wird sum zugewiesen */……
end
?Hier steht ‘@’ vor einem Bezeichner oder einem Ausdruck.
21.12.2006 Einführung in Verilog 76
Beispiel für Typ 2always @ (signal)
begin…… sum = a + b;……
end? Hier wird der Aktivitätsfluss auf ein Ereignis bei einer
Variablen oder bei einem Ausdruck synchronisiert.? Flankensteuerung mit Schlüsselworten posedge (positive
Flanke) oder negedge (negative Flanke). Beispielalways @ (posedge clk or negedge reset)
begin………
end
Prozedurale Ablaufsteuerung
21.12.2006 Einführung in Verilog 77
Wait Anweisung
? Für pegelsensitives Verhalten:Syntaxwait(Ausdruck)
statements;
?Wenn der Ausdruck den Wert “wahr” (“falsch”) ergibt, werden die folgenden Anweisungen (nicht) ausgeführt.
So kann man Ausdrücke überwachen!
Beispielmodule example_wait(
enable, a, b);input enable, a;output b;always beginwait (enable == 1)
b = a;end
endmodule
21.12.2006 Einführung in Verilog 78
Prozedurale Zuweisungen
? Es gibt in Verilog HDL zwei verschiedene Zuweisungs-arten:
blockierende (Blocking)und nicht blockierende Zuweisungen.
? Blockierende Anweisungen werden nacheinander, wie im Block aufgeführt, abgearbeitet. Erst wenn das eine Statement fertig ist, wird das nächste begonnen.
?Nicht blockierende Zuweisungen in einem Block werden zeitgleich gestartet und parallel abgearbeitet.
21.12.2006 Einführung in Verilog 79
Blockierende Zuweisungen? Der Operator ‘=’ kennzeichnet blockierendes Verhalten.? Gibt es Zeitverzögerungen in einer Zeile, wird die
nächste Zeile erst nach Ablauf des Delays angefangen.initial
begina = 5;b = 3;#10 c = 1;#5 d = 5;
endHier haben bei t = 0 ‘a’ und ‘b’ die Werte 5 und 3.Bei t = 10 wird ‘c’ der Wert ‘1’ und bei t = 15 wird ‘d’ ‘5’ zugewiesen.
21.12.2006 Einführung in Verilog 80
Ablauf bei blockierenden Zuweisungen
Beispielinitial // ‘a’ bekommt den Wert von begin // ‘b’ und ‘c’ bekommt dann a = b; // den Wert von ‘a’. Alsoc = a; // hat am Ende ‘c’ den
end // Anfangswert von von ‘b’
b
a
c
21.12.2006 Einführung in Verilog 81
Ablauf bei nicht blockierenden Zuweisungen
Beispielinitialbegina <= b; c <= a;
end
b c
a
Hier werden die rechtenSeiten aller Zuweisungenausgewertet und gleichzeitigzugewiesen.
Im Beispiel bekommt also ‘a’ den Wert von ‘b’ und ‘c’ den Wert von ‘a’.
21.12.2006 Einführung in Verilog 82
?Der erste always-Block verwendet blockierende Zuweisungen. Als Ergebnis erhalten wir: a = 15,b = 15.
?Der zweite Block verwendet nicht blockierende Zuweisungen. Das Ergebnis ist : c = 50, d = 25.
Die Werte werden korrekt ausge-tauscht, weil die Anweisungen zwar gleichzeitig aufgerufen werden, aber die Ergebnisse der rechten Seiten erst zwischengespeichert und danach zugewiesen werden.
Anwendung von nicht blockierenden Zuweisungen
initial begin
a = 10; c = 25;b = 15; d = 50;
endalways @(event)begin
a = b;b = a;
endalways @(event)begin
c <= d;d <= c;
end
21.12.2006 Einführung in Verilog 83
Auswahl und Verzweigung bei prozeduralen Zuweisungen
21.12.2006 Einführung in Verilog 84
Prozedurale Anweisungen
? Anweisungen zur Verzweigung und Auswahl werden in prozeduralen Blöcken verwendet
?Diese Anweisungen eignen sich besonders zur einfachen Modellierung von Hardwareblöcken, wie Komparatoren, Multiplexern, Kodier- und Dekodier-schaltungen usw.
21.12.2006 Einführung in Verilog 85
Bedingte Zuweisung
?Wie in der Sprache ‘C’ gibt es in Verilog if und elseVerzweigungen
Syntaxif (Ausdruck)
Anweisungen;else if (Ausdruck) <optional>
Anweisungen;elsevor_eingestellte_Anweisungen;
? if-else -Verzweigungen können verschachtelt werden.? Anweisungen nach if-else können mittels begin und end zusammengefasst werden.
21.12.2006 Einführung in Verilog 86
Beispielif (num = = 4`ha)out = input_a & input_b;
else if (num != 4`h9)begin out = input_a | input_b;flag = flag + 1`b1;
endelseout = 1`b0;
Bedingte Zuweisung
21.12.2006 Einführung in Verilog 87
Auswahl mit Case ? In Verilog haben wir drei Typen von Auswahl-
Statements: case, casex, casez.?Diese Anweisungen können ebenfalls verschachtelt
werden.? Ist kein Vergleich zutreffend, wird die nach default
stehende Anweisung ausgeführt.
Syntaxcase (Ausdruck)case_index1: Anweisungen1;case_index2: Anweisungen2;default : Anweisungen_def;endcase
21.12.2006 Einführung in Verilog 88
Auswahl mit Case
Beispielcase (select)
2´d0 : out = in1;2´d1 : out = in2;2´d2 : out = in3;
default : out = in4;endcase
/* Wenn select nicht 0, 1, 2 ist, wird out = in4 */
21.12.2006 Einführung in Verilog 89
? casex oder casez überspringen ‘x’- und ‘z’-Werte beim Vergleich von Case-Vorgabe und Case-Auswahl-Index.
? ‘x’ und ‘z’ werden also als nicht relevant (don’t cares) angesehen.Beispiel
casex (one_hot)4´bxx1 : next_state = 2;4´bx1x : next_state = 1;4´b1xx : next_state = 3;
endcase
Auswahl mit Casex oder Casez
21.12.2006 Einführung in Verilog 90
Übung 6
Schreiben Sie ein Modell für einen 4 X 1-Multiplexer mit Hilfe von case-Statements und alternativ mit if-elseVerzweigungen.
21.12.2006 Einführung in Verilog 91
Schleifen in prozeduralen Blöcken
Benannte Blöcke und lokale Variablen
21.12.2006 Einführung in Verilog 92
Schleifen
? In Verilog gibt es vier verschiedene Schleifentypen:
while, for, repeat, forever.
? Schleifen sind nur innerhalb von prozeduralen Blöcken
erlaubt (initial und always Blöcke).
? Zeitlich nebenläufige Anweisungen können nicht
wiederholt durchlaufen werden.
? Jede Schleife kann mit dem Statement disable
beendet werden!
21.12.2006 Einführung in Verilog 93
While-Schleife
? while -Schleifen werden solange ausgeführt, wie ein Ausdruck “wahr” ist.
? Sobald der Ausdruck den Wert “falsch” annimmt, wird die Schleife abgebrochen und das erste Statement nach der Schleife ausgeführt.
Beispiel
while (count <= 4’d 11)begincount = count + 1’b1;end/*wird ausgeführt biscount den wert 11 erreicht*/
Syntax
while(Ausdruck)beginAnweisungen;end
21.12.2006 Einführung in Verilog 94
For-Schleifen
?Haben die gleichen Eigenschaften wie die for Schleifen in ‘C’. Die Schleife wird solange ausgeführt, wie ein Ausdruck “wahr” ist. Abbruch immer über disable möglich.
? Schleifenindex wird am Anfang gesetzt, dann inkrementiert und mit der Bedingung verglichen.
Syntaxfor(Anfangs_Bedingung; Ausdruck; reg_Zuweisung)begin
Anweisungen;end
21.12.2006 Einführung in Verilog 95
?Register-Variable für Schleifenindex muss entweder integer oder reg-Type sein.
Beispielinteger i;for (i=0; i <= 99; i=i+1)
begin...Anweisungen;...
end
Schleife wird 100mal ausgeführt.
For-Schleifen
21.12.2006 Einführung in Verilog 96
Repeat-Schleifen?Hier wird der relevante Ausdruck einmal ausgewertet,
um zu bestimmen, wie oft die Schleife abgearbeitet werden soll. Abbruch wie immer mit disable
?Wenn sich dabei ein ‘x’ oder ‘z’ ergibt, wird die Schleife wie bei ‘0’ gar nicht durchlaufen.
SyntaxRepeat (Ausdruck)
Anweisungen;
Beispielrepeat (16)beginAnweisungen;...
end// 16 Durchläufe
21.12.2006 Einführung in Verilog 97
Forever-Schleife
? Schleife ohne Abbruchbedingung oder Schleifenindex.
? Beenden nur mit disable möglich.
Beispielinitial
beginclk = 1’b0;forever #5 clk = ~clk
end
21.12.2006 Einführung in Verilog 98
Forever-Schleife und always-Block im Vergleich
? Beide sind zyklisch.
? Ein always-Block definiert nebenläufiges Verhalten,
forever-Schleife stellt einen algorithmischen Ablauf dar.
? forever-Schleifen lassen sich schachteln, aber always-
Blöcke nicht.
? forever-Schleifen werden nur dann ausgeführt, wenn sie bei der Simulation des Modells erreicht werden, always-
Blöcke sind stets aktiv.
21.12.2006 Einführung in Verilog 99
Übung 7
Wo liegt der Fehler in der folgenden for-Schleife?module test;integer i;...initialbeginfor (i=0; i<= 15; i = i + 1);
in = i;end
endmodule
21.12.2006 Einführung in Verilog 100
Benannte Blöcke
? Blöcke können Namen erhalten, also benannt werden.? In solchen Blöcken können lokale Variablen deklariert
werden. ? Benannte Blöcke können sogar mit dem Schlüsselwortdisable deaktiviert werden.
Beispiel
initialbegin : benannter_Blockreg a;integer count;......
end
21.12.2006 Einführung in Verilog 101
Disable-Anweisung
?Diese Anweisung beendet die Ausführung von benannten Blöcken und von Schleifen!
Examplefor (count=100;count>=10;count=count-1)begin : testout = a + b;if (out = = 50)
disable test;end
21.12.2006 Einführung in Verilog 102
Hierarchie und strukturelle Modellierung
21.12.2006 Einführung in Verilog 103
Hierarchie in Modulen
Top Modul
Sub-Modul 1 Sub-Modul 2
Modul 1 Modul 2 Modul 3
Beispiel
Volladdierer
Halb-Addierer
Halb-Addierer
21.12.2006 Einführung in Verilog 104
Hierarchie und Struktue
? Komplexe Modelle können zur Verbesserung der Übersichtlichkeit in kleinere aufgeteilt werden.
?Diese kleineren Module werden verbunden, um die gewünschte Funktion zu erhalten, in dem die Modelle instanziiert werden (strukturelles Modell).
?Das Modul auf der obersten Hierarchieebene ist das Top-Modul.
?Das oberste Moduls muss nicht immer Ports besitzen.
21.12.2006 Einführung in Verilog 105
Beispiel für strukturelles Modell
module halb_addierer(S,C,A,B);
output S, C;input A, B;
wire S, C, A, B;
assign S = A ^ B;assign C = A & B;
endmodule
AB
S
C
HalbAddierer
A
B
S
C
21.12.2006 Einführung in Verilog 106
Schaltplan Volladdierer
Halb-Add. 2
ha2
A
B
S
C
Halb-Add. 1
ha1
A
B
S
C
in1
in2
cincout
sumI1
I2 I3
Volladdierer
21.12.2006 Einführung in Verilog 107
Verbindung von Modul-Ports in Strukturmodellen
?Modelle auf niedrigeren Hierarchieebenen müssen nicht nur instanziiert werden, sondern auch verbunden, damit die angestrebte Funktion entsteht.
?Diese Port-Verbindungen zwischen verschiedenen Modulen kann auf 2 Arten erfolgen:
Verbindung nach Position
Verbindung durch explizite benannte Zuordnung
21.12.2006 Einführung in Verilog 108
Verbindung mit expliziter Zuordnung
Volladdierer (Verbindung mit benannter Zuordnung)module full_adder(sum,in1,in2,cin,cout);
input in1,in2,cin;half_adder h_a1 (.S(I1),.A(in1),.B(in2),.C(I2));
half_adder h_a2 (.S(sum),.A(I1),.B(cin),.C(I3));output sum;output cout;wire I1,I2,I3;
or(cout,I2,I3);half_adder h_a1 (.S(I1),.A(in1),.B(in2),.C(I2));half_adder h_a2 (.S(sum),.A(I1),.B(cin),.C(I3));
endmoduleInstanzen Namen – unterscheiden Mehrfach-
instanzen desselben Moduls.
Portverbindung mit benannter Zuordnung, d.h. Verbindung über Port-name und zugeordneter Signalleitung.
21.12.2006 Einführung in Verilog 109
Verbindung mit impliziter Zuordnung
Volladdierer (Verbindung nach Position)module full_adder(sum,in1,in2,cin,cout);
input in1,in2,cin;output sum;output cout;wire I1,I2,I3;
or(cout,I2,I3);half_adder h_a1 (I1,I2,in1,in2);half_adder h_a2 (sum,I3,I1,cin);
endmodule
Sieht einfach aus!Aber explizite Zuordnung ist weniger fehleranfällig!
Verbindung der Modul-Ports gemäß Position in Submodul.
21.12.2006 Einführung in Verilog 110
Parameter, der Datentyp “Event”
und Unterprogramme
21.12.2006 Einführung in Verilog 111
Parameter
? Konstanten, die bei der Simulation verwendet werden und ganze sowie reelle Zahlen, Zeiten, Verzögerungen oder ASCII Folgen darstellen.
? Konstanten in Verilog erkennt man am Schlüsselwort ‘parameter’
? Jede Konstante kann bei der Kompilation verändert werden, aber nicht während der Simulation.
Beispielparameter delay = 10;
Hier ersetzt der Kompiler überall im Quellcode ‘delay’durch ’10’.
21.12.2006 Einführung in Verilog 112
Überschreiben von Parametern
?Manchmal müssen Parameter geändert werden.
? Angenommen man hat ein parametrisiertes Verhaltens-
modell für einen 2Bit-Addierer geschrieben, das später
als 10-Bit.Addierer verwendet werden soll.
?Wenn sich der Parameter 2 Bit für die Addiererbreite
überschreiben lässt, ist dies die einzige notwendige
Änderung!
?Das Schlüsselwort ‘defparam’ kann zum Überschreiben
von Parameterwerten benutzt werden.
21.12.2006 Einführung in Verilog 113
Überschreiben von Parametern
Beispielmodule one();
…parameter delay = 100;…
endmodule
module two();…defparam g1.delay = 150, g2.delay = 200;…one g1();one g2();…
endmodule
Instanz g1 von Modul one erhält delay = 150
Instanz g2 von Modul one erhält delay = 200
21.12.2006 Einführung in Verilog 114
Datentyp Event
?Wird als Indikator für ein Ereignis benutzt. ? Variablen dieses Typs können keine logischen Werte
annehmen oder Daten speichern.?Dieser Datentyp eignet sich zum Synchronisieren von
nebenläufigen Aktivitäten in einem Modul. ?Das Schlüsselwort ‘event’ kennzeichnet Signale dieses
Typs.
? Events werden mit dem Operator ‘->’ ausgelöst.
? Events erkennt man mit dem Event-Operator @.
21.12.2006 Einführung in Verilog 115
Beispiel...event start;always @ (posedge clock)begin...if (data == 1'b0)-> start; // wenn data == 1’b0 wird, löst dies... // einen Event auf dem Signal start aus
endalways @ (start) // always Block reagiert auf den Eventbegin...statements;...
end...
Beispiel für Event
21.12.2006 Einführung in Verilog 116
Unterprogramme
?Unterprogramme gliedern ein komplexes Modell.
?Code-Segmente, die mehrfach genutzt werden, brauchen nur einmal eingegeben zu werden.
?Unterprogramme vereinfachen so die Wartung, Aktualisierung und Portabilität von Modellen.
? Verilog kennt zwei Klassen von Unterprogrammen:
task und function
21.12.2006 Einführung in Verilog 117
Tasks? Tasks fassen prozedurale Anweisungen zusammen.
? Es sind beliebig viele Eingangs-, Ausgangs- und
bidirektionale Ports zulässig.
? Tasks werden innerhalb eines Modeuls deklariert (keine
Packages wie in VHDL)
? Tasks können andere Tasks oder Funktionen aufrufen.
? Tasks können nur von einer prozeduralen Anweisung
aufgerufen werden und dürfen nicht in Ausdrücken
auftreten.
21.12.2006 Einführung in Verilog 118
Tasks
Syntax
task task_name;port Deklaration;...Anwesiungen;...
endtaks
21.12.2006 Einführung in Verilog 119
Task Beispiel
module task_add(data_1,data_2,out);input [1:0]data_1,data_2;output [2:0]out;reg [2:0]out;
always@(data_1 or data_2)add(data_1,data_2,out);
task add;input [1:0]a; input [1:0]b;output [2:0]c; c = a + b;
endtaskendmodule
Task Deklaration
Task Aufruf im always-Block
21.12.2006 Einführung in Verilog 120
Function ? Functions können nur kombinatorisches Verhalten
darstellen
? Functions dürfen keine Delays, flankensensitives oder
zeitkontrolliertes Verhalten enthalten.
? Functions müssen einen oder mehrere Eingänge auf-
weisen. Ausgabeports und bidirektionale Ports sind nicht
erlaubt. Funktionen geben einen einzigen Wert zurück.
? Functions können andere Funktionen aber keine Tasks
aufrufen.
?Der Rückgabetyp muss angegeben werden
21.12.2006 Einführung in Verilog 121
Functions
Syntax
function [Typ_oder_Bereich] function_name;input_port deklaration ;...Anweisungen;...
endfunction
/* [Typ_oder_Bereich] =
real,integer,time,realtime oder Bereich */
21.12.2006 Einführung in Verilog 122
Function Beispielmodule fun_mux(sel,a,b,out); // Multiplexer für 8Bit-Worte
input [7:0]a,b; // a, b: Eingangsworteinput sel; // sel: Auswahlbitoutput [7:0] out; // out: Ausgabewortreg [7:0]out;
always @(sel,a,b)out = mux(sel,a,b);
function [7:0]mux; input sel;input [7:0]a,b; case (sel)
1'b0 : mux = a;1'b1 : mux = b;default : mux = 7'bx;
endcaseendfunction
endmodule
Function-Deklaration: Name mux,
Bereich = 8 Bit
Aufruf im always-Block
21.12.2006 Einführung in Verilog 123
Übung 8
1. Schreibe eine Funktion, die die beiden 4-Bit Zahlen ‘a’
und ‘b’ multipliziert! Das Ergebnis ist 8 Bit breit. Testen
Sie die Funktion in einem Modul!
2. Schreibe eine Funktion, die die Fakultät n! einer 4-Bit
Zahl berechnet. Das Ergebnis ist ein 32-Bit Wert und
wird mit einer Verzögerungszeit von 10 Zeiteinheiten
zugewiesen.
21.12.2006 Einführung in Verilog 124
Specify Blöcke
21.12.2006 Einführung in Verilog 125
Specify Blöcke
? In diesen Blöcken können Verzögerungszeiten und Laufzeiten für ein Modul festgelegt werden.
? Ein specify-Block ist ein eigenständiger Block, der nicht in prozeduralen Blöcken eingebunden sein darf.
? specify-Blöcke haben folgende Aufgaben:
Zuweisen von Pin-zu-Pin-Delays für ein Modul
Setup-Timing-Checks
Festlegen von specparam-Konstanten
21.12.2006 Einführung in Verilog 126
?Das Delay zwischen einem input/inout-Port und einemoutput/inout-Port ist ein Pin-zu-Pin Delay.
?Dieses Delay kann in paralleler Form oder als vollstän-dige Möglichkeit (full connection) vorgegeben werden:
Pin-zu-Pin Verzögerungen
input/inout port
output/ inout port
input/inout port
output/ inout port
Operator ‘=>’ Operator ‘*>’
Parallel Full
21.12.2006 Einführung in Verilog 127
Parallele Verbindung
Beispiel
module pc(inA,inB,inC,out1,out2,out3);input inA, inB, inC;output out1,out2,out3;
specify(inA => out1) = 3;(inB => out2) = 3;(inC => out3) = 4;
endspecify
and(out1,inA,inB,inC);or (out2,inA,inB,inC);xor(out3,inA,inB,inC);
endmodule
Pfadverzögerungen von: inA nach out1, inB nach out2 und inC nach out3
21.12.2006 Einführung in Verilog 128
Examplemodule fc(inA,inB,inC,out);
input inA, inB, inC;output out;
specify(inA,inB,inC *> out) = 3;
endspecify
and(out,inA,inB,inC);or (out,inA,inB,inC);xor(out,inA,inB,inC);
endmodule
“Full” Verbindung
Alle kombinatorischmöglichen
Pfadverzögerungen sind 3 Zeiteinheiten
21.12.2006 Einführung in Verilog 129
Weitere Möglichkeiten
? specify-Blöcke können bedingte Pfadverzögerungen vorgeben:Beispielspecifyif (data = 1) (data => out ) = 10;if (data = 0) (data => out ) = 8;
endspecify? Generische Parameter können in specify-Blöcken definiert werden
mit Schlüsselwort ‘specparam’ (entspricht VHDL Generics)
Beispielspecify
specparam delay = 10;
(in => out) = delay;endspecify
21.12.2006 Einführung in Verilog 130
Testbenches
21.12.2006 Einführung in Verilog 131
Test Bench
?Diese Module dienen in Verilog zur automatisierten
Verifikation anderer Module.
? Zu testendes Modul wird in die Test Bench eingesetzt.
?Das zu verifizierende Design heißt das Design Under
Test (DUT)
21.12.2006 Einführung in Verilog 132
Test-Methodik
Testvektor-Generator
Ausgabe-Überwachung
Design Under Test
Test Bench
21.12.2006 Einführung in Verilog 133
DUT Beispiel
//Design Under Test
module halb_addierer (a,b,sum,carry);output sum, carry;input a, b;
wire sum, carry, a, b;
//kontinuierliche Zuweisungenassign sum = a ^ b;assign carry = a & b;
endmodule
21.12.2006 Einführung in Verilog 134
Testbench Beispielmodule tb;reg a,b;wire sum, carry;
//halb_addierer Instanziierunghalb_addierer ins1(a,b,sum,carry);/*Port Verbindung
erfolgt implizit */initialbegin //Output monitor
$monitor ( $time,"input_a= %b,input_b=%b,Sum=%b,Carry=%b",a,b,sum,carry);
endinitialbegin //Test-Vektor-Generierung
#10 a = 0 ; b = 0;#10 a = 0 ; b = 1;#10 a = 1 ; b = 0; #10 a = 1 ; b = 1;
endendmodule
21.12.2006 Einführung in Verilog 135
Ergebnis
# 0 input_a= x,input_b=x,Sum=x,Carry=x# 10 input_a= 0,input_b=0,Sum=0,Carry=0# 20 input_a= 0,input_b=1,Sum=1,Carry=0# 30 input_a= 1,input_b=0,Sum=1,Carry=0# 40 input_a= 1,input_b=1,Sum=0,Carry=1
Textausgabe mit Hilfe der $monitor System Task
Wellenzüge
21.12.2006 Einführung in Verilog 136
Übung 9
Schreibe ein Modell für einen 4 zu 2 Decoder und teste die Funktion des Modells mit einer Testbench!
21.12.2006 Einführung in Verilog 137
Erweiterungen in Verilog 2001
21.12.2006 Einführung in Verilog 138
Verilog 2001
? Verilog-95(IEEE 1394) wurde aktualisiert und verbessert. Mit diesen Erweiterungen entstand der IEEE Standard 1364-2001, kurz Verilog-2001
? Verilog 2001 vereinfacht die Nutzung Verilog noch weiter
? Verilog 2001 verknappt die Syntax.
?Die meisten EDA-Produkte unterstützen den neuenStandard!
21.12.2006 Einführung in Verilog 139
Verilog 2001- Port DeklarationVerilog 1995module add
(a,b,c_in,sum,c_out);input [7:0] a,b;input c_inoutput [7:0] sum;output cout;reg [7:0] sum;reg c_out;wire [7:0] a,b;wire c_in;. . .
Verilog 2001 – entweder können Portrichtungund Datentyp zusammengefasst werdenmoduleadd(a,b,c_in,sum,c_out);input wire [7:0] a,b;input wire c_in;output reg [7:0] sum;output reg cout;
. . .
Verilog 2001 – oder die gesamte Portinforma-tion wird in der Portliste angegebenmodule add(input wire [7:0] a,b;input wire c_in;output reg [7:0] sum;output reg cout;). . .
21.12.2006 Einführung in Verilog 140
Task und Function
Verilog 1995
task parity_check;input [15:0]data_in;output even;output odd;wire [15,10] dat_inwire even, odd;...endtask
Verilog 2001Datenflussrichung und Datentypkönnen zusammen in der Portlisteangegeben werden (gilt auch fürFunctions).task parity_check (input wire [15:0] data_in,output wire even,output wire odd);…endtask
21.12.2006 Einführung in Verilog 141
Generate-Anweisung
? Verilog 1995 – Nicht vorhanden
? Verilog 2001 – Reguläre Modellstrukturen werden algorithmisch mitdem generate-Statement erzeugt.
Beispielmodule gray2bin1 (bin,gray);
parameter SIZE = 8;output [SIZE-1:0] bin;input [SIZE-1:0] gray;
genvar i;generate for(i=0; i<SIZE; i=i+1)begin
assign bin[i] = ^gray[SIZE-1:i];end
endmodule
Generierung von 8 assignAnweisungen mit angepass-ten Indexwerten
genvar: neuer Datentyp als Indexvariable für generate
21.12.2006 Einführung in Verilog 142
Neue Sensitivitätsliste
Verilog 1995? Tritt mehr als eine Variable in einer Sensitivitätsliste auf,
dann werden diese mit dem or Schlüsselwort getrennt:always @(negedge rst or posedge clk) begin{statements} ;
end
Verilog 2001?Hier können die Variablen in der Liste mit Kommas
getrennt werden:always @(negedge rst, posedge clk) begin{statements} ;
end
21.12.2006 Einführung in Verilog 143
Potenzierungsoperator
Verilog 1995Nicht vorhanden
Verilog 2001Der Operator ** in Verilog 2001 erlaubt die Potenzbildung:integer resultat, basis, exponent;always @(posedge clock)
resultat = basis ** exponent;
21.12.2006 Einführung in Verilog 144
Zweierkomplement-Arithmetik
Verilog 1995? reg und net Datentypen werden als vorzeichenlose
Typen betrachtet. Vorzeichen können nur bei integerberücksichtigt werden.
Verilog 2001? reg und net Datentypen können auch vorzeichenbe-
haftet verarbeitet werde, wenn sie mit dem Schlüssel-wort ‘signed’ versehen werden:
module multiplier_8by8 (a, b, product);input signed [7:0] a, b;output signed [15:0] product;assign product = a * b;
endmodule
21.12.2006 Einführung in Verilog 145
Multidimensionale Felder
Verilog 1995?Nur eindimensionale Felder:
//1-dim. Feld aus 8-bit reg-Variablenreg [7:0] array1 [0:255];
Verilog 2001?Mehr-dimensional Arrays sind zulässig. /* 3-dimensionales Feld aus 8-Bit Netzen vomTyp wire */
wire [7:0] array3 [0:255][0:255][0:15];