03.02.2015 Aufrufe

Design Flow und Verilog (v. Matthias Harter)

Design Flow und Verilog (v. Matthias Harter)

Design Flow und Verilog (v. Matthias Harter)

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Gajski Y-Diagramm<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

Boole‘sche<br />

Gleichungen<br />

RTL<br />

Transistoren<br />

Differenzialgleichungen<br />

Geometrie<br />

ALU, MUX,<br />

Register<br />

Polygone<br />

Zellen<br />

CPU,<br />

Speicher<br />

Gatter<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Struktur<br />

Blockschaltbild<br />

• 3 Achsen für 3 Formen der<br />

Beschreibung eines Systems<br />

• Außen: hoher Abstraktionsgrad <strong>und</strong><br />

geringes Maß an Detailinformationen<br />

• Innen: geringer Abstraktionsgrad <strong>und</strong><br />

hohes Maß and Detailinformationen<br />

• Fertigungstechnologie (Lithographie)<br />

gibt zwingend vor: Polygone als<br />

Beschreibungsform<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 1


Verhalten: Spezifikation<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Beschreibung des Systemverhaltens in<br />

natürlicher Sprache<br />

• Hohe Form der Abstraktion, wenig Details<br />

• Aufgabe eines Hardware-Entwicklers: Diese<br />

Beschreibungsform in eine exaktere <strong>und</strong><br />

detailreichere Form überführen<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 2


Verhalten: Algorithmus<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Entscheidender Schritt:<br />

Entwurf eines Algorithmus für<br />

das Verhalten des Systems<br />

• Ziel der EDA: Möglichst alle<br />

nachfolgenden Schritte<br />

automatisieren<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 3


Verhalten: RTL<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

ALU, MUX,<br />

Register<br />

Polygone<br />

Zellen<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Register<br />

Transistoren<br />

Differenzialgleichungen<br />

Kombinatorische<br />

Logik<br />

Register<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Register-Transfer-Level (RTL)<br />

• Verbindet den Algorithmus mit physikalischen<br />

Elementen (Register bzw. Flip-Flops)<br />

• Bietet genügend Details für Automation aller<br />

nachfolgenden Transformationsschritte der<br />

Beschreibungsform<br />

• Allerdings: Hardware-Entwickler müssen die<br />

automatischen Tools sukzessive mit zusätzlichen<br />

Informationen unterstützen<br />

• Außerdem: Kontrolle des Transformationsprozesses<br />

<strong>und</strong> ggf. manuelle Eingriffe nötig<br />

• Wichtigste Form der Beschreibung in HDLs<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 4


Verhalten: Boole‘sche Gleichungen<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Übergang von RTL zu den Boole‘schen<br />

Gleichungen für Entwickler sehr aufwendig<br />

• Gleichungen können red<strong>und</strong>ante Terme<br />

aufweisen<br />

• Gewinn durch so detailreiche Beschreibung für<br />

den Entwickler gering, Aufwand jedoch hoch<br />

• In den Anfängen der EDA-Industrie: Häufig<br />

verwendete Form der Beschreibung eines<br />

digitalen Systems<br />

• Vertreter aus diesen Tagen: ABEL HDL<br />

(Advanced Boolean Equation Language)<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 5


Verhalten: Differenzialgleichungen<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Herleitung der Differenzialgleichungen aus der<br />

Spezifikation des Verhalten eines Systems für<br />

Entwickler:<br />

- Sehr aufwendig<br />

- Nahezu unmöglich für komplexe Systeme<br />

• Daher: Geringe praktische Bedeutung für den<br />

Entwurf digitaler Systeme<br />

• Bei analogen Schaltkreisen: Simulation der<br />

Schaltung auf dieser Ebene mit SPICE<br />

- Unnötig, da viel zu detailreich<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 6


Struktur: Blockschaltbild<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Hohe Abstraktion ähnlich der sprachlichen<br />

Spezifikation des Verhaltens<br />

• Häufig verwendete Form der Beschreibung für<br />

Anwender, z.B. in Handbüchern <strong>und</strong><br />

Datenblättern<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 7


Struktur: CPU, Speicher, etc.<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

Gatter<br />

CPU,<br />

Speicher<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Memory CPU IO<br />

Geometrie<br />

• Weitere Aufteilung des Blockschaltbilds in seine<br />

Bestandteile<br />

• Kann bereits genügen, um ein digitales System zu<br />

beschreiben <strong>und</strong> zu implementieren<br />

• Beispiel: PC aus Standardkomponenten (Mainboard,<br />

Speicher, Prozessor, Grafikkarte, usw.)<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 8


Struktur: ALU, MUX, Register, etc.<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Stellt Ebene der Schaltplan-Eingabe (schematic<br />

entry) in vielen modernen Entwicklungstools für<br />

digitale Systeme dar<br />

• In Altera MAX+Plus führt diese Ebene durch<br />

Verwendung von parametrisierbaren Blöcken<br />

(LPMs) bereits zu lauffähigen Systemen<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 9


Struktur: Gatter<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

Gatter<br />

CPU,<br />

Speicher<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Vergleichbares Maß an Details wie bei<br />

Boole‘schen Gleichungen<br />

• Ähnliche Probleme (red<strong>und</strong>ante Terme)<br />

• Bereits hoher Aufwand für Entwickler nötig, aber<br />

immer noch praktikabel bei kleinen Systemen<br />

• Gute Kontrolle der verbrauchten Ressourcen<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 10


Struktur: Transistoren<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

Polygone<br />

Gatter<br />

CPU,<br />

Speicher<br />

Struktur<br />

Blockschaltbild<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Herleitung der Verschaltung der Transistoren<br />

aus der Spezifikation des Verhalten oder dem<br />

Blockschaltbild für Entwickler:<br />

- Sehr aufwendig<br />

- Nahezu unmöglich für komplexe Systeme<br />

- Unnötig bei den meisten digitalen Systemen<br />

• Daher: Geringe praktische Bedeutung für den<br />

Entwurf digitaler Systeme<br />

• Ausnahme: Bei der sog. Charakterisierung von<br />

Zellbibliotheken<br />

• Wichtig <strong>und</strong> weiterhin eingesetzt beim Entwurf<br />

analoger Systeme<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 11


Geometrie: Geometrische Partitionierung<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

Polygone<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Leiterplatte 3<br />

Leiterplatte 2<br />

Leiterplatte 1<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Chip 1 Chip 2<br />

Geometrie<br />

Chip 3<br />

• Aufteilung des Systems auf mehrere<br />

Leiterplatten oder Chips<br />

• Bisher noch geringe Unterstützung durch<br />

Entwurfsautomation, da die Elemente zu<br />

heterogen sind<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 12


Geometrie: Floorplan<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Bei ASICs <strong>und</strong> Full-Custom: Freie Wahl<br />

der Lage der I/O Zellen, Speicher-Module,<br />

Stromversorgungs-Leitungen, Analog-<br />

Teile, etc.<br />

• Bei FPGAs, CPLDs: Wahl der I/O Zellen,<br />

Speicher-Module <strong>und</strong> Analog-Teile unter<br />

den bereits vorhandenen <strong>und</strong> fixen<br />

Ressourcen<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 13


Geometrie: Zellen<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

• Bei ASICs: Automatische Plazierung von<br />

sog. Standard-Zellen<br />

• Bei Full-Custom: Manuelles Plazieren<br />

von Einheiten beliebiger Größe<br />

• Bei FPGAs <strong>und</strong> CPLDs: Fix!<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 14


Geometrie: Polygone<br />

Verhalten<br />

Spezifikation<br />

Algorithmus<br />

RTL<br />

Boole‘sche<br />

Gleichungen<br />

Transistoren<br />

Differenzialgleichungen<br />

ALU, MUX,<br />

Register<br />

CPU,<br />

Speicher<br />

Gatter<br />

Struktur<br />

Blockschaltbild<br />

Polygone<br />

Zellen<br />

Floorplan<br />

Geometrische<br />

Partitionierung<br />

Entwurfsziel<br />

Geometrie<br />

• Gesamtheit der Polygone ergeben das Layout zur<br />

Maskenherstellung<br />

• Layout beschreibt den Chip vollständig <strong>und</strong><br />

dient direkt der Fertigung<br />

• Daher: Ebene der Polygone ist das Entwurfsziel<br />

• Bei FPGAs <strong>und</strong> CPLDs: Fix!<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 15


Hardware Description Languages<br />

Verhalten<br />

Spezifikation<br />

Manuelle<br />

Implementierung<br />

Automatische<br />

Implementierung<br />

Algorithmus<br />

Boole‘sche<br />

Gleichungen<br />

RTL<br />

Transistoren<br />

Differenzialgleichungen<br />

Geometrische<br />

Partitionierung<br />

Geometrie<br />

Polygone<br />

Zellen<br />

ALU, MUX,<br />

Register<br />

Floorplan<br />

CPU,<br />

Speicher<br />

Gatter<br />

<strong>Verilog</strong>, VHDL<br />

Struktur<br />

Synthese<br />

RTL<br />

Gatter<br />

Blockschaltbild<br />

• Mit HDLs können das Verhalten<br />

<strong>und</strong> die Struktur beschrieben<br />

werden<br />

• Keine Beschreibung der<br />

Geometrie mit HDLs möglich!<br />

• Front-end <strong>Design</strong> <strong>Flow</strong>: Von der<br />

Spezifikation zur Gatter-Ebene<br />

• Back-end <strong>Design</strong> <strong>Flow</strong>: Von der<br />

Gatter-Ebene zur Layout-Ebene<br />

• Synthese <strong>und</strong> Technology<br />

Mapping: Von der RTL-<br />

Beschreibung zur Gatter-Ebene<br />

(Gate-Level Netlist)<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 16


Front-end <strong>Design</strong> <strong>Flow</strong><br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 17


Überblick <strong>Verilog</strong><br />

• Entwickelt 1983/1984 als Werkzeug zur<br />

Modellierung, Simulation <strong>und</strong> Analyse digitaler<br />

Schaltungen<br />

• Ursprünglich Eigentum von Cadence<br />

• 1990 gab Cadence die Sprache zur Verwendung durch<br />

Dritte frei<br />

• Standardisierung im Jahr 1995 durch die IEEE<br />

• Einfach zu lernen<br />

• Kompakter Code<br />

• Syntax ähnelt C<br />

• Stark verbreitet in Nordarmerika <strong>und</strong> Japan, weniger<br />

in Europa<br />

• Stark bei low-level designs, hat Schwächen bei<br />

system-level designs<br />

• Wird verwendet zur Spezifikation von Netzlisten im<br />

back-end<br />

• 1993 wurden 85% der ASICs mit <strong>Verilog</strong><br />

entworfen (Quelle: EE Times)<br />

• Im Internet unter: www.ovi.org<br />

case (sel)<br />

0: out = in1;<br />

1: out = in2;<br />

85 %<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 18


<strong>Verilog</strong><br />

vs. VHDL<br />

module counter (data, clk, clrn, ena, ld, count);<br />

input [7:0] data;<br />

input clk, clrn, ena, ld;<br />

output [7:0] count;<br />

reg [7:0] count_tmp;<br />

always @(posedge clk or posedge clrn)<br />

begin<br />

if (clrn)<br />

count_tmp = 'b0;<br />

else if (ld)<br />

count_tmp = data;<br />

else if (ena)<br />

count_tmp = count_tmp + 'b1;<br />

end<br />

assign count = count_tmp;<br />

endmodule<br />

C-style<br />

library ieee;<br />

use ieee.std_logic_1164.all;<br />

entity counter is<br />

port<br />

( data : in integer range 0 to 255;<br />

clk, clrn, ena, ld : in std_logic;<br />

count : out integer range 0 to 255 );<br />

end counter;<br />

architecture counter_arch of counter is<br />

signal countsig : integer range 0 to 255;<br />

begin<br />

process (clk, clrn)<br />

begin<br />

if clrn = '0' then<br />

countsig


Definition eines Moduls<br />

module module_name (port_list) ;<br />

Port-Deklaration<br />

Parameter-Deklaration<br />

Variablen-Deklarationen<br />

Zuweisungen<br />

Weitere Modul-Instanzierungen<br />

„initial“ <strong>und</strong> „always“ Blöcke<br />

Prozeduren <strong>und</strong> Funktionen<br />

endmodule<br />

Schnittstelle<br />

Hauptteil<br />

Modul-Definition<br />

• Module stellen das wichtigste strukturelle<br />

Element in <strong>Verilog</strong> dar<br />

• Beinhalten das eigentliche <strong>Design</strong><br />

• Jedes <strong>Design</strong> besteht aus mindestens<br />

einem Modul (sog. top-level Modul)<br />

• Können verschachtelt werden, definieren so die<br />

<strong>Design</strong>-Hierarchie<br />

• Können also strukturell aufgebaut sein durch<br />

Instanzen von Gatter, Leaf-Cells (Standard-Zellen)<br />

oder weiteren Modulen<br />

• Ebenso möglich: Inhalt eines Moduls wird<br />

algorithmisch beschrieben durch sog. „always“-Blöcke<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 20


Die Modul-Schnittstelle<br />

Op1 Op2 Sel<br />

Mode<br />

C_out<br />

ALU<br />

C_in<br />

Result<br />

Equal<br />

Port-Deklaration:<br />

Genaue Angabe der<br />

Richtung des<br />

Signalflusses durch den<br />

Port <strong>und</strong> seine Breite<br />

module ALU (Result, Equal, C_out,<br />

C_in, Op1, Op2, Sel, Mode);<br />

input [3:0] Op1, Op2, Sel;<br />

input C_in, Mode;<br />

output [3:0] Result;<br />

output C_out, Equal;<br />

.<br />

.<br />

.<br />

endmodule<br />

Port-Liste:<br />

Angabe der<br />

Portnamen<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 21


Signale<br />

<strong>Verilog</strong>-Schlüsselworte<br />

für externe Signale:<br />

input, output oder<br />

inout<br />

<strong>Verilog</strong>-Schlüsselwort<br />

für Signale innerhalb<br />

eines Moduls: wire<br />

module ALU (Result, Equal, C_inout,<br />

C_in, Op1, Op2, Sel, Mode);<br />

input [3:0] Op1, Op2, Sel;<br />

input C_in, Mode;<br />

output [3:0] Result;<br />

inout C_inout, Equal;<br />

wire<br />

reg<br />

.<br />

.<br />

.<br />

endmodule<br />

[7:0] IntSig;<br />

[3:0] Result;<br />

Vektoren: Angabe der<br />

Indizes in eckigen<br />

Klammern, z.B. [7:0],<br />

zwischen Schlüsselwort<br />

<strong>und</strong> Signalnamen<br />

Externe Signale vom<br />

Typ „output“ <strong>und</strong><br />

interne Signale können<br />

mit „reg“ als Register<br />

gekennzeichnet werden<br />

• Signale in <strong>Verilog</strong> können nur vier Werte annehmen:<br />

0, 1, X (x) oder Z (z)<br />

• X steht für „Unknown“, d.h. das Signal kann 0, 1<br />

oder Z sein oder ändert sich gerade<br />

• Z steht für „High Impedance“, d.h. die Signalquelle<br />

ist abgetrennt<br />

• Output-Ports vom Typ „reg“ werden in<br />

sequentiellen Schaltkreisen verwendet<br />

• Damit wird sichergestellt, dass der Wert<br />

des Signals bis zum nächsten Taktzyklus<br />

gehalten wird, statt in den Zustand „High<br />

Impedance“ zu wechseln<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 22


Strukturelle Beschreibung<br />

module MUX (A,B,C,D,<br />

Sel0,Sel1,Z);<br />

input A,B,C,D,Sel0,Sel1;<br />

output Z;<br />

wire NotSel0, NotSel1;<br />

wire Y0, Y1, Y2, Y3;<br />

not (NotSel0, Sel0);<br />

not (NotSel1, Sel1);<br />

and (Y0, A, NotSel0, NotSel1);<br />

and (Y1, B, NotSel0, Sel1);<br />

and (Y2, C, Sel0, NotSel1);<br />

and (Y3, D, Sel0, Sel1);<br />

or (Z, Y0, Y1, Y2, Y3);<br />

endmodule<br />

• Beschreibung des Systems durch Module <strong>und</strong> ihre Verbindungen<br />

• Jedes Modul kann seinerseits aus untereinander verb<strong>und</strong>enen<br />

Modulen bzw. Instanzen bestehen<br />

• Je tiefer die Hierarchie-Ebene, desto detaillierter die Beschreibung<br />

<strong>und</strong> desto näher an der physikalischen Implementierung<br />

• <strong>Verilog</strong> stellt sog. Primitive auf Gatter-Ebene zur Verfügung, die<br />

nicht weiter aufgelöst werden müssen<br />

• Reihenfolge der Instanzen irrelevant<br />

⇒ Konzept der Nebenläufigkeit<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 23


Strukturelle Beschreibung (Forts.)<br />

module MUX (A,B,C,D,<br />

Sel0,Sel1,Z);<br />

input A,B,C,D,Sel0,Sel1;<br />

output Z;<br />

wire NotSel0, NotSel1;<br />

wire Y0, Y1, Y2, Y3;<br />

Eindeutiger<br />

Instanzname<br />

• Strukturelle Beschreibung auf Gatter-Ebene durch<br />

Primitive, z.B.:<br />

• multiple-input gates: and, nand, nor, or, xnor <strong>und</strong> xor<br />

• multiple-output gates: buf, not<br />

• tristate gates: bufif0, bufif1, notif0, notif1<br />

• (c)mos gates, bidirectional gates, pullup, -down gates<br />

not #4 U1 (NotSel0, Sel0);<br />

not #4 U2 (NotSel1, Sel1);<br />

and #5 U3 (Y0, A, NotSel0, NotSel1);<br />

and #5 U4 (Y1, B, NotSel0, Sel1);<br />

and #5 U5 (Y2, C, Sel0, NotSel1);<br />

and #5 U6 (Y3, D, Sel0, Sel1);<br />

or #5 U7 (Out, Y0, Y1, Y2, Y3);<br />

endmodule<br />

Signal-<br />

Verzögerung<br />

5 Zeiteinheiten<br />

• Einer Instanz einer Gatter-Primitive können<br />

zusätzliche Informationen beigefügt werden, z.B.<br />

Treiber-Stärke, Signal-Verzögerung, Instanz-Name <strong>und</strong><br />

eine Bereichsangabe für Felder (arrays) von Instanzen<br />

• Treiber-Stärke <strong>und</strong> Signal-Verzögerung nichtsynthetisierbare<br />

Konstrukte<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 24


User-Defined Primitives (UDP)<br />

• Erweiterung des Konzepts der Gatter-Primitive<br />

durch User-Defined Primitives (UDP)<br />

• Sowohl kombinatorische als auch<br />

sequentielle Logik kann spezifiziert werden<br />

• UDPs sind nicht synthetisierbar!<br />

• Für jede mögliche Belegung der<br />

Eingangssignale wird der Wert des Ausgangs<br />

in einer Tabelle spezifiziert<br />

• Ist eine Belegung nicht aufgelistet wird der<br />

Ausgang auf ‘x’ gelegt<br />

Implementierte<br />

Boole’sche Funktion<br />

als Tabelle<br />

spezifiziert<br />

primitive UDP_name (port_list) ;<br />

Port-Deklaration<br />

UDP Initialisierung<br />

Wahrheits- oder Zustandstabelle<br />

Nur ein Ausgang<br />

erlaubt, keine<br />

Vektoren<br />

Bei sequentieller<br />

Logik: Wert des<br />

Ausgangs zu<br />

Beginn<br />

endprimitive<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 25


User-Defined Primitives (Beispiele)<br />

2 zu 1<br />

Multiplexer<br />

Toggle-Flipflop<br />

mit ‘clear’<br />

primitive MUX (Z,<br />

Sel, A, B);<br />

input A, B, Sel;<br />

output Z;<br />

Reihenfolge der<br />

Eingänge wie in<br />

der Port-Liste<br />

primitive TFF (Q, Clk, Clr);<br />

input Clk, Clr;<br />

output Q;<br />

reg Q;<br />

Gegenwärtiger<br />

Wert des Ausgangs<br />

table<br />

// Sel A B : Z<br />

0 0 : 0;<br />

0 1 : 1;<br />

1 0 : 0;<br />

1 1 : 1;<br />

x : x;<br />

endtable<br />

endprimitive<br />

steht für<br />

0, 1 oder x<br />

r = steigende<br />

Taktflanke<br />

f = fallende<br />

Taktflanke<br />

initial<br />

Q = 0;<br />

table<br />

// Clk Clr : Q : Q+<br />

1 : : 0;<br />

r 0 : 0 : 1;<br />

r 0 : 1 : 0;<br />

f 0 : : -;<br />

f : : 0;<br />

endtable<br />

Nächster Wert<br />

des Ausgangs<br />

Minus-Zeichen:<br />

Keine Änderung<br />

endprimitive<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 26


Datenflussbasierte Beschreibung<br />

module MUX (A,B,C,D,<br />

Sel0,Sel1,Z);<br />

input A,B,C,D,Sel0,Sel1;<br />

output Z;<br />

assign Z = (~Sel0 & ~Sel1 & A) |<br />

(~Sel0 & Sel1 & B) |<br />

(Sel0 & ~Sel1 & C) |<br />

(Sel0 & Sel1 & D);<br />

endmodule<br />

• Einem Signal wird ein (neuer) Wert zugewiesen<br />

(assignment)<br />

• Dieser Wert ergibt sich aus der Transformation<br />

eines oder mehrerer Operanden durch einen<br />

Operator<br />

assign #3 Out = A & B;<br />

delay<br />

Operand 1 Operand 2<br />

Ergebnis<br />

Operator<br />

• Einfachste Form Operanden: vom Typ wire oder reg<br />

• Typ des Ergebnis immer vom Typ wire<br />

• Weiterhin: Konstanten, Vektoren <strong>und</strong><br />

Funktionsaufrufe<br />

• Modellierung der Verzögerung (delay) nicht<br />

synthetisierbar!<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 27


Operanden<br />

Einige ausgewählte Beispiele für Operanden:<br />

wire signal1;<br />

wire [3:0] bus1;<br />

real temperatur;<br />

reg [7:0] data;<br />

signal1<br />

temperatur<br />

data[7:4]<br />

data[0]<br />

{ signal1, bus1[2:1], bus1[3] }<br />

114<br />

1.2e7<br />

4‘b0101<br />

‘hFF<br />

CToF(temperatur)<br />

Einfache Referenz auf ein Netz<br />

Einfache Referenz auf ein Register vom Typ real<br />

„Part-select“ Operand, Teil des Vektors data<br />

„Bit-select“ Operand, ein Bit des Vektors data<br />

Konkatenation<br />

Konstante ohne Basis, <strong>Verilog</strong> nimmt Dezimalzahl an<br />

Konstante vom Typ real in wissenschaftl. Notation<br />

Konstante der Größe 4 Bit<br />

Konstante der Größe 32 Bit in Hexadezimal<br />

Funktionsaufruf<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 28


Operatoren<br />

Arithmetische Operatoren<br />

a + b a plus b<br />

a - b a minus b<br />

a * b a mal b<br />

a / b a geteilt durch b<br />

a % b a modulo b<br />

• Division bei Integer liefert Integer, Nachkommastellen<br />

werden abgeschnitten<br />

• Modulo nur bei Integer erlaubt<br />

• x oder z in einem Operanden führt zu x als Ergebnis<br />

Relationale Operatoren<br />

a < b a kleiner b<br />

a > b a größer b<br />

a = b a größer od. gleich b<br />

Gleichheits-Operatoren<br />

a === b a gleich b, einschl. x <strong>und</strong> z<br />

a !== b a ungleich b, einschl. x u. z<br />

a == b a gleich b, kann x liefern<br />

a != b a ungleich b, kann x liefern<br />

DST SS2003 - Hardware Description Languages<br />

• x oder z in einem Operanden führt zu x als Ergebnis<br />

• Ist ein Operand kleiner als der andere, wird er von<br />

links mit Nullen gefüllt<br />

• In den ersten beiden Fällen werden auch x <strong>und</strong> z mit<br />

0, 1, x <strong>und</strong> z verglichen<br />

• 1xz0 === 1xz0 liefert also 1<br />

• Bei den anderen beiden liefert x <strong>und</strong> z im Operanden<br />

immer x<br />

• 1xz0 == 1xz0 liefert also x<br />

SuS@TI, Seite 29


Operatoren (Forts.)<br />

Bitweise Logik-Operatoren<br />

& bitweises UND<br />

| bitweises ODER<br />

^ bitweises XOR<br />

~^ bitweises XNOR<br />

~ bitweises NOT<br />

• Bitweise logische Verknüpfung<br />

• Ist ein Operand kürzer als der andere, wird er mit<br />

Nullen gefüllt<br />

• Ergebnis hat immer dieselbe Größe wie der größte<br />

Operand<br />

Logische Operatoren<br />

&& logisches UND<br />

|| logisches ODER<br />

! logisches NICHT<br />

• Ist ein Operand Null, wird FALSCH angenommen<br />

• Ist ein Operand ungleich Null, wird WAHR<br />

angenommen<br />

• Liefern immer Ergebnis der Größe eins, 0, 1 oder x<br />

a > b<br />

Shift-Operatoren<br />

Verschiebe Vektor a<br />

um b Positionen nach links<br />

Verschiebe Vektor a<br />

um b Positionen nach rechts<br />

• Der rechte Operand wird immer als Zahl vom Typ<br />

unsigned integer behandelt<br />

• Leere Stellen werden mit Nullen aufgefüllt<br />

• x oder z im rechten Operanden führt zu x<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 30


Verhaltensbasierte Beschreibung<br />

module MUX (A,B,C,D,<br />

Sel0,Sel1,Z);<br />

input A,B,C,D,Sel0,Sel1;<br />

output Z;<br />

reg Z;<br />

A<br />

B<br />

C<br />

Z<br />

always @(A or B or C or D or Sel0 or Sel1)<br />

begin<br />

case ({Sel1, Sel0})<br />

2’b00 : Z = A;<br />

2’b01 : Z = B;<br />

2’b10 : Z = C;<br />

2’b11 : Z = D;<br />

default : Z = 1’bx;<br />

endcase<br />

end<br />

endmodule<br />

D<br />

Sel0<br />

Sel1<br />

• Modellierung des Verhaltens durch eine<br />

Beschreibung nahe am Algorithmus<br />

• Worin unterscheiden sich Algorithmen in<br />

Software zu Algorithmen für Hardware<br />

• Antwort: Durch spezielle HDL-Konstrukte<br />

<strong>und</strong> sog. Coding-Styles<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 31


Parameter<br />

Parameter-Konstanten<br />

parameter Name = Konstante;<br />

• Parameter dienen zur Definition von<br />

elementaren Konstanten, wie z.B.<br />

Verzögerungen (delays), Busbreiten <strong>und</strong><br />

Schleifendurchläufe<br />

• Werden zwei oder mehr Konstanten<br />

deklariert, müssen die einzelnen Name-<br />

Werte-Paare mit Kommas getrennt werden<br />

parameter BusWidth = 8;<br />

reg [BusWidth-1:0] DataBus;<br />

parameter Iterations = 5;<br />

for (k=0; k


Register<br />

Netze (wires) in Hardware:<br />

• Der Wert eines Signals in digitalen<br />

Schaltkreisen werden bestimmt vom<br />

Treiber des Netzes<br />

• Ist der Treiber abgeschaltet, befindet sich<br />

das Netz im Zustand „high impedance“<br />

Variablen in einem Algorithmus:<br />

• Der Wert einer Variablen in<br />

Programmiersprachen wird nicht einem Treiber<br />

zugewiesen, sondern direkt einem Wert<br />

• Dieser Wert wird gespeichert solange er nicht<br />

verändert wird<br />

Register in <strong>Verilog</strong>:<br />

• Register in <strong>Verilog</strong> als Modell von Variablen in Programmiersprachen<br />

• Für logische Werte vom Typ reg, für Zahlen vom Typ integer oder real (time, realtime)<br />

• Output-Ports vom Typ „reg“ werden in sequentiellen Schaltkreisen verwendet<br />

• Damit wird sichergestellt, dass der Wert des Signals bis zum nächsten Taktzyklus<br />

gehalten wird, statt in den Zustand „High Impedance“ zu wechseln<br />

• Register in <strong>Verilog</strong> sind nicht equivalent mit Flip-Flops in Hardware!<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 33


„initial“- <strong>und</strong> „always“-Blöcke<br />

• Alle verhaltensbasierten Beschreibungen müssen in sog. „initial“- oder „always“-<br />

Blöcken eingebettet sein<br />

• Jeder dieser Blöcke innerhalb eines Modules werden nebenläufig ausgeführt<br />

• Jedes Modul kann beliebig viele Blöcke beinhalten<br />

• Blöcke können nicht verschachtelt werden<br />

• Anweisungen innerhalb eines Blocks werden mit „begin“ <strong>und</strong> „end“ gruppiert<br />

• Die Anweisungen zwischen „begin“ <strong>und</strong> „end“ werden sequentiell ausgeführt<br />

„initial“-Blöcke<br />

• Werden nur zu Beginn (Zeitpunkt 0)<br />

ausgeführt<br />

• Werden hauptsächlich benutzt, um<br />

Register zu initialisieren<br />

• Nicht synthetisierbar<br />

„always“-Blöcke<br />

• Starten ebenfalls zum Zeitpunkt 0,<br />

werden jedoch immer wieder ausgeführt<br />

• Sie dienen zur Modellierung des „immer<br />

an“-Verhalten digitaler Schaltkreise<br />

• Synthetisierbar<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 34


Variablen <strong>und</strong> Verhalten<br />

• Bei verhaltensbasierten Beschreibungen ist das Ziel einer Variablenzuweisung<br />

immer ein Register, kein Netz (wire)<br />

• Das Schlüsselwort „assign“ entfällt<br />

• Die Zuweisung muss innerhalb eines „initial“ oder „always“-Blockes geschehen<br />

• Modellierung sequentieller Zuweisungen: sog. „blocking assignments“<br />

• Modellierung nebenläufiger Zuweisungen: sog. „non-blocking assignments“<br />

blocking assignment<br />

• Sequentielle Ausführung<br />

• Zuweisung durch das Symbol „=“<br />

• Die Variable ändert ihren Wert zum Zeitpunkt der<br />

Ausführung der Zuweisungsoperation innerhalb<br />

der Sequenz von Anweisungen in einem Block<br />

• Bei Delays: Spezifizieren die Zeit zwischen den<br />

Anweisungen<br />

non-blocking assignment<br />

• Nebenläufige Ausführung<br />

• Zuweisung durch das Symbol „


Hochsprachenkonstrukte<br />

x oder z als Ausdruck wird<br />

als falsch interpretiert<br />

x oder Bei z mehr als Ausdruck als einer wird<br />

Anweisung: als falsch begin interpretiert <strong>und</strong> end<br />

Bedingungen<br />

if (Ausdruck) wahr_teil; else falsch_teil;<br />

Schleifen<br />

repeat (Ausdruck) Anweisung(en);<br />

while (Ausdruck) Anweisung(en);<br />

for (A1 ; A2 ; A3) Anweisung(en);<br />

Initialisierung<br />

des Zählers<br />

Abbruchbedingung<br />

Modifikation<br />

des Zählers<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 36


Hochsprachenkonstrukte (Forts.)<br />

case, casex, casez<br />

Fallunterscheidungen<br />

case(x,z) (Ausdruck)<br />

Belegung1 : Anweisung1;<br />

...<br />

BelegungN : AnweisungN;<br />

default Anweisung;<br />

endcase<br />

• case: Alle vier Logikwerte (0, 1, x, z)<br />

werden berücksichtigt<br />

• casez: z (high impedance) wird als<br />

don´t care interpretiert<br />

• casex: x <strong>und</strong> z werden als don´t care<br />

interpretiert<br />

1xxx<br />

1000<br />

✓<br />

✕<br />

xx1x<br />

zz1z<br />

✓<br />

✕<br />

1xxx<br />

1000<br />

✓<br />

✕<br />

xx1x<br />

zz1z<br />

✓<br />

✓<br />

1xxx<br />

1000<br />

✓<br />

✓<br />

xx1x<br />

zz1z<br />

✓<br />

✓<br />

case ({D0, D1, D2, D3})<br />

4’b1xxx : Z = 0;<br />

4’bx1xx : Z = flag;<br />

4’bxx1x : Z = interrupt;<br />

4’bxxx1 : Z = 1;<br />

default Z = 0;<br />

endcase<br />

casez ({D0, D1, D2, D3})<br />

4’b1xxx : Z = 0;<br />

4’bx1xx : Z = flag;<br />

4’bxx1x : Z = interrupt;<br />

4’bxxx1 : Z = 1;<br />

default Z = 0;<br />

endcase<br />

casex ({D0, D1, D2, D3})<br />

4’b1xxx : Z = 0;<br />

4’bx1xx : Z = flag;<br />

4’bxx1x : Z = interrupt;<br />

4’bxxx1 : Z = 1;<br />

default Z = 0;<br />

endcase<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 37


Prozeduren<br />

Prozeduren<br />

task Prozedurname;<br />

input Signal1;<br />

output Signal2;<br />

inout Signal3;<br />

begin<br />

Anweisung1;<br />

...<br />

AnweisungN;<br />

end<br />

endtask<br />

Definition der<br />

Argumente,<br />

Anzahl beliebig<br />

• Konzept ähnlich den Programmiersprachen: Mehrfachnutzung<br />

des Codes (design re-use)<br />

• Aufruf der Prozedur: Prozedurname(Liste der Argumente);<br />

• Argumente werden gemäß ihrer Reihenfolge bei der Definition<br />

in der Prozedur interpretiert<br />

• Werden zu dem Zeitpunkt des Aufrufs ausgeführt<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 38


Funktionen<br />

Falls Vektor als Rückgabewert:<br />

Definition der Vektorgröße<br />

Funktionen<br />

function Funktionsname;<br />

input Signal;<br />

begin<br />

Anweisung1;<br />

...<br />

AnweisungN;<br />

end<br />

endfunction<br />

Keine Definition<br />

von Ausgängen<br />

(output, inout)<br />

erlaubt<br />

• Funktionen liefern nur einen Wert zurück<br />

• Falls nicht anders spezifiziert, ist Rückgabewert ein 1-Bit Register (reg)<br />

• Keine Definition von Ausgängen (output, inout) erlaubt<br />

• Rückgabe geschieht durch Zuweisung an die durch den Funktionsnamen<br />

gegebene lokale Variable<br />

• Kein Spezifikation von delays <strong>und</strong> keine Ereigniskontrolle in Funktionen erlaubt<br />

• Funktionen werden in einer Zeiteinheit der Simulation ausgeführt<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 39


Konstante Zahlen<br />

• Konstante Zahlen können dezimal, hexadezimal, oktal oder binär angegeben werden.<br />

• Zwei Formen der Angabe sind möglich:<br />

1. Normale dezimale Schreibweise durch Verwendung der Ziffern 0 bis 9. Die Größe der<br />

Zahl ergibt sich aus der max. Größe der anderen Operanden eines Ausdrucks.<br />

2. Spezielle Schreibweise (Syntax) der Form ss…s´nn…n<br />

Größe in Bits<br />

als Dezimalzahl<br />

ss…s´f nn…n<br />

d<br />

h<br />

Basis<br />

dezimal<br />

hexadezimal<br />

Wert als Folge<br />

von Ziffern<br />

Beispiele:<br />

123<br />

´h fff<br />

12´h x<br />

12´b 0x0x_1101_0010<br />

o<br />

b<br />

oktal<br />

binär<br />

Optional zur Verbesserung<br />

der Lesbarkeit<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 40


Rangfolge der Operatoren<br />

Stärkste<br />

Bindung<br />

Unitäre Operatoren<br />

! & ~& | ~| ^ ~^ + -<br />

VZ-Wechsel<br />

Rechenoperatoren<br />

* / %<br />

+ -<br />

Shift-Operatoren<br />

><br />

Vergleichsoperatoren<br />

< >=<br />

== != === !==<br />

Logikoperatoren<br />

(bitweise)<br />

& ~& ^ ~^<br />

| ~|<br />

Boolesche Operatoren<br />

&&<br />

||<br />

Schwächste<br />

Bindung<br />

Bedingungsoperator<br />

(conditional)<br />

:<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 41


Der Bedingungsoperator<br />

• Wie in der Hochsprache C gibt es eine Kurzschreibweise für folgendes Konstrukt:<br />

If (Ausdruck) Register = Zuweisung_wahr;<br />

else Register = Zuweisung_falsch;<br />

Beispiel:<br />

If (Sel) Z = A;<br />

else Z = B;<br />

• Dieser Bedigungsoperator (conditional operator) hat die Form:<br />

Signal = Ausdruck Zuweisung_wahr; :<br />

Zuweisung_falsch;<br />

Beispiel:<br />

Z = (Sel) A : B;<br />

• Der Bedigungsoperator kann geschachtelt werden:<br />

Beispiel:<br />

Z = (Sel1) (Sel2) A : B : C;<br />

• Der Bedigungsoperator kann in einer verhaltensbasierten Beschreibung verwendet werden <strong>und</strong><br />

in einer datenflussbasierten (assign), d.h. einer strukturellen Beschreibung auf Gatterebene.<br />

• Im Gegensatz dazu kann „if-then-else“ nur in einer verhaltensbasierten Beschreibung (also<br />

innerhalb eines „always“-Blockes) verwendet werden.<br />

• Bei der Synthese wird immer ein<br />

Multiplexer (MUX) oder ein Tristate-<br />

Buffer mit „enable „ erzeugt:<br />

Z = (Sel) A : B;<br />

Z = (en) Z : 1´bz;<br />

Z<br />

A<br />

B<br />

en<br />

Sel<br />

Z<br />

Z<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 42


Die „sensitivity list“ <strong>und</strong> „events“<br />

• Neben Spezifikation von „delays“ zur zeitlichen<br />

Kontrolle der Ausführung: „Events“<br />

• Events sind Änderungen in einem Netz oder Register<br />

• Events können an denselben Stellen verwendet<br />

werden wie delays<br />

• Events werden mit dem @-Zeichen spezifiziert<br />

• Es gibt 3 Arten von Events<br />

@ (posedge Signal) Anweisung<br />

@ (negedge Signal) Anweisung<br />

@ (Signal) Anweisung<br />

• Wird eine Anweisung durch mehrere Signale<br />

aktiviert, sprich man von einer „sensitivity list“<br />

• Die einzelnen Signale werden durch das<br />

Schlüsselwort „or“ getrennt<br />

• Sensitivity lists werden hauptsächlich in always-<br />

Blöcken verwendet, um die unendliche<br />

Iteration anzuhalten bzw. fortzusetzen<br />

Event<br />

STOP<br />

always @(posedge reset or posedge clk)<br />

begin<br />

if (reset) Q = 1´b0;<br />

else if (clk) Q = D;<br />

end<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 43


„wait“ <strong>und</strong> „event“-Kontrolle<br />

• Die „wait“-Anweisung hält die Ausführung eines Blockes von sequentiellen Anweisungen an <strong>und</strong> wartet<br />

bis der angegebene Ausdruck wahr wird:<br />

wait (Ausdruck) Anweisung;<br />

• „wait“ kann in nebenläufigen Blöcken von sequentiellen Anweisungen verwendet werden (z.B.<br />

„always“-Blöcke).<br />

• Ein anderer nebenläufiger Block muss dafür sorgen, dass Ausdruck wahr wird.<br />

• Die „wait“-Anweisung ist level-sensitiv, d.h. sie wartet nicht auf die Änderung eines Wertes sondern<br />

überprüft nur, ob der angegebene Ausdruck wahr ist.<br />

• Im Gegensatz dazu ist die „event“-Kontrolle mit „@(…)“ flankengesteuert (edge-triggered), d.h. sie<br />

wartet auf die Änderung eines Wertes.<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 44


Simulation <strong>und</strong> Synthese<br />

Synthetisierbare<br />

Konstrukte<br />

Simulierbare<br />

Konstrukte<br />

• Die meisten der vorgestellten Konstrukte sind<br />

synthetisierbar<br />

• Nicht synthetisierbar sind initial-Anweisungen,<br />

UDPs, delays <strong>und</strong> einige weitere Konstrukte<br />

• Die Menge der synthetisierbaren Sprachelemente<br />

stellt eine Untermenge der simulierbaren <strong>Verilog</strong>-<br />

Konstrukte dar<br />

• Synthetisierbare Logik kann auf mehrere Arten in<br />

einer HDL beschrieben werden<br />

• Sie unterscheiden sich jedoch i.d.R. durch ihre<br />

Effizienz bei der Implementierung<br />

• Deshalb: Verwendung eines sog. „coding style“, der<br />

bestimmten Sprachkonstrukten eine feste<br />

Hardware-Implementierung zuordnet<br />

• Achtung: coding styles sind teilweise Synthese-Tool<br />

abhängig!<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 45


Systemfunktionen <strong>und</strong> -Prozeduren<br />

• Es gibt eine Reihe von Systemfunktionen <strong>und</strong> –Prozeduren, die ausschließlich der Simulation dienen.<br />

• Zweck: Debugging, Logging, Dateiein/-ausgabe, Simulation anhalten, etc.<br />

• Sie beginnen immer mit einem vorangestellten „$“-Zeichen.<br />

• Sie sind (selbstverständlich) nicht synthetisierbar.<br />

• Häufigste Verwendung: Testbenches.<br />

Beispiel<br />

Text in der Konsole anzeigen<br />

Signal/Variable überwachen<br />

Gegenwärtige Simulationszeit<br />

$display(„Inhalt Datenbus: %b.“, databus);<br />

$monitor(„Inhalt Datenbus: %b.“, databus);<br />

$time<br />

Simulation beenden<br />

$stop<br />

$finish<br />

Zufallszahl erzeugen<br />

$random(seed);<br />

In eine Datei schreiben<br />

$fdisplay(…) $fwrite(…)<br />

$fmonitor(…)<br />

Aus einer Datei lesen<br />

$readmemx(„testvectors.dat“, mem, 0, 128);<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 46


Compiler- <strong>und</strong> Synthesedirektiven<br />

• Es gibt zwei Arten von Direktiven:<br />

1. Standard <strong>Verilog</strong>-Compilerdirektiven. Beginnen immer mit einem Hochkomma ( ' ).<br />

2. Toolspezifische Synthesedirektiven. Sind syntaktisch gesehen mit einem Kommentar gleich, da sie immer<br />

mit einem Doppelslash ( // ) beginnen.<br />

• Synthesedirektiven sind toolspezifisch. Ist einem Synthesetool die Direktive unbekannt, wird sie<br />

wie ein Kommentar behandelt.<br />

• Synthesedirektiven von Synopsys werden fast immer unterstützt ( //synopsys ... ).<br />

Beispiel<br />

Quelldatei einfügen<br />

Zeiteinheit <strong>und</strong> Genauigkeit<br />

festlegen<br />

Makro festlegen<br />

Fallunterscheidung<br />

'include("C:\Projects\myverilog.v");<br />

'timescale 10 ns / 1 ns<br />

'define NOP 8'b1f<br />

'ifdef 'ifndef 'else 'elsif 'endif<br />

Synthese ausschalten<br />

Synthese einschalten<br />

//synopsys synthesis_off<br />

//synopsys synthesis_on<br />

//synopsys translate_off<br />

//synopsys translate_on<br />

Diverse Synthesedirektiven<br />

//synopsys infer_mux //synopsys state_vector //...<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 47


Synthese von Flip-Flops<br />

reg X, Y;<br />

always @(A or B or C)<br />

begin<br />

X


Achtung: Latches<br />

always<br />

begin<br />

end<br />

if (Flag)<br />

else<br />

begin<br />

end<br />

Erzeugt Latches<br />

Z = A & B;<br />

if (!Sel)<br />

else<br />

begin<br />

end<br />

begin<br />

end<br />

X = A; Y = B;<br />

X = B; Y = A;<br />

Keine Aussage<br />

über X <strong>und</strong> Y<br />

Keine Aussage<br />

über Z<br />

Keine Aussage<br />

über Z<br />

always<br />

begin<br />

end<br />

if (Flag)<br />

else<br />

Frei von Latches<br />

begin<br />

end<br />

Z = A & B; X = 0; Y = 0;<br />

if (!Sel)<br />

else<br />

begin<br />

end<br />

begin<br />

end<br />

X = A; Y = B; Z = 0;<br />

X = B; Y = A; Z = 0;<br />

Zuweisung an<br />

X <strong>und</strong> Y<br />

Zuweisung<br />

an Z<br />

Zuweisung<br />

an Z<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 49


Beispiel<br />

module counter (data, clk, clrn, ena, ld, count);<br />

input [7:0] data;<br />

input clk, clrn, ena, ld;<br />

output [7:0] count;<br />

reg [7:0] count_tmp;<br />

always @(posedge clk or posedge clrn)<br />

begin<br />

if (clrn)<br />

count_tmp = 'b0;<br />

else if (ld)<br />

count_tmp = data;<br />

else if (ena)<br />

count_tmp = count_tmp + 'b1;<br />

end<br />

assign count = count_tmp;<br />

endmodule<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 50


Überblick (1/2)<br />

module M (P1, P2, P3, P4);<br />

input P1, P2;<br />

output [7:0] P3;<br />

inout P4;<br />

reg [7:0] R1, M1[1:1024];<br />

wire W1, W2, W3, W4;<br />

parameter DATAWIDTH = 8;<br />

initial<br />

begin : BlockName<br />

// Statements<br />

end<br />

always @(posedge clk)<br />

begin<br />

// Statements<br />

end<br />

// Continuous assignments...<br />

assign W1 = Expression;<br />

wire [3:0] #3 W2 = Expression;<br />

// Module instances...<br />

COMP U1 (W3, W4);<br />

COMP U2 (.P1(W3), .P2(W4));<br />

task T1;<br />

input A1;<br />

inout A2;<br />

output A3;<br />

begin<br />

// Statements<br />

end<br />

endtask<br />

function [7:0] F1;<br />

input A1;<br />

begin<br />

// Statements<br />

F1 = Expression;<br />

end<br />

endfunction<br />

endmodule<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 51


Überblick (2/2)<br />

#delay<br />

wait (Expression)<br />

@(A or B or C)<br />

@(posedge Clk)<br />

Reg = Expression;<br />

Reg


Ausblick <strong>und</strong> weitere Quellen<br />

Entwicklung von <strong>Verilog</strong>: Wie geht es weiter<br />

• IEEE <strong>Verilog</strong> Standard von 1995 (IEEE 1364-1995): Standard-<strong>Verilog</strong> dieser Folien<br />

• IEEE <strong>Verilog</strong> Standard von 2001 (IEEE 1364-2001): Erweiterung des Standard-<strong>Verilog</strong> um einige<br />

Konstrukte, z.B. multidimensionale Arrays, Potenzoperator, @* sensitivity list, usw.<br />

• System<strong>Verilog</strong>: Erweiterung für bessere Modellierung auf abstraktem System-Level.<br />

• IEEE Standard for <strong>Verilog</strong> RTL Synthesis (IEEE 1364.1-2002): Standardisierung der <strong>Verilog</strong>-<br />

Untermenge der synthesefähigen Konstrukte.<br />

Diese Folien ersetzen keine <strong>Verilog</strong>-Referenz oder ein Lehrbuch! Sie dienen nur als Einführung!<br />

Ziehen Sie unterstützend folgende Quellen zu Rate:<br />

• Thomas & Moorby´s „The <strong>Verilog</strong> Hardware Description Language“, 4th. Edition, Kluwer Academic<br />

Publishers<br />

• „The <strong>Verilog</strong> Golden Reference Guide“, Doulos<br />

• Offizielle <strong>Verilog</strong>-Seiten: www.ovi.org <strong>und</strong> www.systemverilog.org<br />

• Formelle Syntaxspezifikation: www.verilog.com/<strong>Verilog</strong>BNF.html<br />

• Online Manual: www.see.ed.ac.uk/~gerard/Teach/<strong>Verilog</strong>/manual/index.html<br />

• Tutorial: www.deeps.org/<strong>Verilog</strong>/veritut.html<br />

• Schnellübersicht: www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_top.html<br />

DST SS2003 - Hardware Description Languages<br />

SuS@TI, Seite 53

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!