Wichtige Eigenschaften von VHDL
Transcrição
Wichtige Eigenschaften von VHDL
Praktium Systementwurf mit VHDL HDL Design Lab Lehrstuhl für Entwurfsautomatisierung Technische Universität München 1 Das Projekt: Verschlüsselung — Entschlüsselung 2 Hardware-Emulation Signalgenerator Hardware Oszillograph 3 Hardware-Emulation Signalgenerator Hardware Oszillograph Hardware-Replika Software-Modell (VHDL) Computer 4 Hardware-Emulation Signalgenerator Hardware Oszillograph Hardware-Replika Software-Modell (VHDL) Testumgebung (Software, VHDL) Computer 5 Modellierung Digitaler Systeme • Wozu dienen Hardware-Beschreibungssprachen wie VHDL? Zur Beschreibung von Hardware-Systemen durch Software-Modelle • Definition (nach IEEE-Wörterbuch): Ein Modell ist eine idealisierte Darstellung eines Systems. Die Vollständigkeit und Detailtreue eines Modells werden durch die zu untersuchenden Eigenschaften, den Wissensstand und die Modellumgebung bestimmt. • Modelle können unvollständig oder ungenau sein und zu falschen Aussagen führen, wenn sie außerhalb ihres vorgesehenen Anwendungsbereichs eingesetzt werden. • Mit formalen Sprachen wie VHDL beschriebene Modelle besitzen eine eindeutige Interpretation und werden deshalb Formale Modelle genannt. 6 Anwendungsbereiche Digitaler Systeme • Wozu werden Modelle gebraucht? – Als Prototypen zur Spezifikation der Anforderungen – Zur Überprüfung des (zeitlichen) Verhaltens durch Simulation und formale Verifikation – Zur automatisierten Synthese – Zur Dokumentation – Zur Wiederverwendung (Design Reuse) – Zum Datenaustausch zwischen Komponentenanbieter und Entwickler, sowie zwischen verschiedenen Entwurfssystemen • Welche Ziele werden bei der Modellbildung verfolgt? – Minimierung von Entwurfskosten und Entwurfszeit – Vermeiden von Fehlern beim Entwurf – Vermeiden unnötiger Entwurfszyklen, Redesigns 7 VHDL • V H D L VHSIC (Very High Speed Integrated Circuit) Hardware Description Language • Verbreitete Programmiersprache mit Erweiterungen zur Beschreibung von Hardware: nebenläufige Prozesse, Zeitmodell • Hierarchische Modellierung • Verschiedene Entwurfsstile • Seit 1987 durch IEEE- und ANSI-Standard genormt. Hier wird VHDL-87 verwendet (VHDL-93 enthält Erweiterungen). • Verilog ist eine andere häufig verwendete HDL. • Erweiterung für Analog- und Mixed-Signal-Schaltungen: VHDL-AMS 8 Literatur • Peter J. Ashenden The Designer‘s Guide to VHDL Morgan Kaufman Publishers, 1996 9 Der Entwurfsraum Zweistufiger Syntheseprozess unter Verwendung einer Zellbibliothek Entwurfssicht Abstraktionsniveau Verhalten Struktur Geometrie Architektur SystemSpezifikation SystemPartitionierung Bauplan (floorplan) Register Transfer Algorithmus Modul-Netzliste (ALU, Mux, Register) Makro-Zellen (IP-Blöcke) Logik Boolesche Gleichungen Gatter-Netzliste (Gatter, FlipFlops) Standardzellen Bibliothekszellen Schaltkreis Differentialgleichungen Transistor-Netzliste Maskendaten, Polygone 10 Modellierungsraum Funktionssicht Struktursicht ProzessorMemorySwitch Algorithmen RegisterTransfers Boolesche Gleichungen RegisterTransfers Gatter Differentialgleichungen Transistoren Polygone Geometriesicht Y-chart nach Gajski & Kahn Standardzellen Makrozellen Chip-, Floorplan 11 Der Entwurfsprozess Anforderungen Systemmodell Algor. Synthese Verhaltensmodell Simulation RT-Synthese RT-Modell Testrahmen Simulation (test bench) Logiksynthese ASIC oder FPGA Gatter-Modell Simulation Layoutsynthese Signallaufzeiten 12 Register-Transfer-Beschreibung Auf RT-Ebene werden Aktivitäten (Funktionen, Operationen) als Transfers von Datenwerten zwischen Registern beschrieben, die Taktzyklen zugeordnet sind (Verhaltenssicht, Datenfluß). Clock Ctrl In Operationen und Register werden meist zu Datenpfaden zusammengefaßt, die durch KontrollKontrolleinheiten gesteuert einheit werden (Struktursicht). Eine RT-Schaltung besteht typi(Zustandsscherweise aus Modulen automat) (z.B. Addierer, Multiplizierer, Register, Zustandsautomaten), Ctrl Out die durch Signalnetze verbunden sind. Data In Control Register Speicher ALU +/* Status Register Data Out Charakteristisch für RT-Beschreibungen ist auch, daß Operationen nicht auf einzelne Logikwerte (Bits), sondern auf Mengen von Logikwerten angewandt werden. Diese werden zu Worten gruppiert, deren 0-1-Muster als (alpha)numerische Werte interpretiert werden. 13 Simulation Simulation dient der Verifikation von Entwurfsschritten. Simulation ist notwendig, weil bei der automatisierten Synthese nicht alle Anforderungen exakt erfüllt werden (können) und weil Syntheseprogramme fehlerhaft sein können. Durch Simulation werden insbesondere folgende Fragen beantwortet: • Simulation von Verhaltensmodellen – Erfüllt das Verhaltensmodell die (VHDL-)Syntax? – Erfüllt das Verhaltensmodell die spezifizierten Anforderungen (die Spezifikation)? – Welche Eigenschaften besitzt das modellierte System? • Simulation von Strukturmodellen – Erfüllt das Strukturmodell die (VHDL-)Syntax? – Besitzt das Strukturmodell (die RT- oder die GatterNetzliste) dieselbe Funktion wie das Verhaltensmodell? – Erfüllt das Strukturmodell die zeitlichen Anforderungen? 14 Gliederung dieser Einführung in VHDL 1) Formaler Aufbau von VHDL-Modellen 2) Testumgebungen VHDL-Modelle, die Eingangssignale zum Testen eines Modells bereitstellen 3) Zeitmodelle in VHDL Nachbildung des Zeitverhaltens der modellierten Hardware 4) Modellierung von Zustandsautomaten in VHDL Systematische Beschreibung digitaler Systeme 15 Gliederung dieser Einführung in VHDL 1) Formaler Aufbau von VHDL-Modellen 2) Testumgebungen VHDL-Modelle, die Eingangssignale zum Testen eines Modells bereitstellen 3) Zeitmodelle in VHDL Nachbildung des Zeitverhaltens der modellierten Hardware 4) Modellierung von Zustandsautomaten in VHDL Systematische Beschreibung digitaler Systeme 16 Formaler Aufbau von VHDL-Modellen Formaler Aufbau von VHDL-Modellen 17 Modellieren von Schnittstellen (Interfaces) Eine Entity beschreibt eine Schaltung(skomponente) aus externer Sicht, d.h. Anzahl und Typ ihrer Ein- und Ausgänge (ports). Beispiel: A B D0 D1 DEK2X4 D2 EN D3 2x4Dekoder Name der entity Liste von port-Namen reservierte Zeichen entity DEK2X4 is port (A, B, EN: in bit; D: out bit_vector(0 to 3)); end DEK2X4; reservierte Worte port-Modus port-Typ 18 Modellieren von Schnittstellen (Interfaces) Eine Entity beschreibt eine Schaltung(skomponente) aus externer Sicht, d.h. Anzahl und Typ ihrer Ein- und Ausgänge (ports). Beispiel: A B D0 D1 DEK2X4 D2 EN D3 2x4Dekoder Name der entity EN A B D0 D1 D2 D3 0 - - 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 Liste von port-Namen reservierte Zeichen entity DEK2X4 is port (A, B, EN: in bit; D: out bit_vector(0 to 3)); end DEK2X4; reservierte Worte port-Modus port-Typ 19 Modellierung von Schaltungsverhalten oder -struktur • Architectures – beschreiben aus interner Sicht, welche Funktion eine entity hat und wie sie realisiert wird – sind Implementierungen einer entity – können mehrfach pro entity (mit derselben Funktion) auftreten • Architectures können in verschiedenen Modellierungsstilen beschrieben werden: – Verhaltensmodelle beschreiben das Verhalten (die Funktion) einer Schaltung(skomponente), d.h. die Werte der Ausgangssignale als Funktion der Werte der Eingangssignale. – Strukturmodelle beschreiben eine Schaltung(skomponente) als eine hierarchische Struktur von Subkomponenten, die durch Signale verbunden sind (hierarchisch strukturierte Netzliste). 20 Verhaltensmodell des 2x4-Dekoders entity DEK2X4 is port (A, B, EN: in bit; D: out bit_vector(0 to 3)); end DEK2X4; architecture VERHALTEN_1 of DEK2X4 is begin VERH_1_DEK: process(A,B,EN) begin if EN='1' then -- '1' ist eine Konstante vom Typ bit D(0) <= not (not A and not B); D(1) <= not (not A and B); D(2) <= not (A and not B); D(3) <= not (A and B); else -- EN='0' ist ein Kommentar D <= "1111"; -- Konstante vom Typ bit_vector end if; end process VERH_1_DEK; end VERHALTEN_1; 21 Prozesse Ein Prozess beschreibt das Verhalten (die Funktion) einer Schaltung(skomponente) als eine Sequenz von Anweisungen. Wie in einer herkömmlichen Programmiersprache sind alle Datenund Anweisungstypen verfügbar wie z.B. Konstanten, Variable, Felder, Records, Zuweisungen, Verzweigungen, Schleifen. Prozesse werden durch Namen (process labels) identifiziert und können eine Empfindlichkeitsliste (sensitivity list) besitzen. Ein Prozess wird aktiviert, wenn sich der Wert eines Signals in seiner sensitivity list ändert. Zum Speichern des Prozesszustands dienen Variable. Sie können nur innerhalb von Prozessen deklariert und benutzt werden. Signale entsprechen Drähten zwischen Hardware-Blöcken und dienen zur Kommunikation zwischen nebenläufigen Prozessen. Sie halten Werte wie die Variablen, haben aber ein Zeitverhalten. Innerhalb von Prozessen dürfen Signale nicht deklariert werden. Mit der end-Anweisung wird der Prozess suspendiert. 22 Verhaltensmodell eines 4fach-Multiplexers entity MUX4 is port(X: in bit_vector(3 downto 0); SEL: in bit_vector(1 downto 0); Z: out bit); end MUX4; architecture VERH_MUX4 of MUX4 is begin MUX4_proc: process(X,SEL) variable TMP:bit; -- Variable ohne Zeitverhalten begin X(0) SEL case SEL is X(1) when "00" => TMP:=X(0); Z X(2) when "01" => TMP:=X(1); X(3) when "10" => TMP:=X(2); when "11" => TMP:=X(3); -- Zuweisungen an Variable end case; -- alle Alternativen sind aufzuführen! Z <= TMP after 5 ns; -- Zuweisung an Signal end process MUX4_proc; -mit Verzögerung end VERH_MUX4; 23 Datenfluß-Modelle • Datenfluß-Modelle (oder funktionale Modelle) sind Verhaltensmodelle, bei denen die zu beschreibende Funktion der Schaltung(skomponente) eine einfache Transformation von Eingangssignalen in Ausgangssignale ist. • VHDL stellt dafür Kurzschreibweisen bereit, die nebenläufigen Signalzuweisungen (concurrent signal assignments). • Die Bearbeitung von Signalzuweisungen außerhalb von Prozessen ist daher unabhängig von der Reihenfolge, in der sie aufgeschrieben sind. • Jede nebenläufige Signalzuweisung bildet einen eigenen Prozess, der genau dann aktiviert und ausgeführt wird, wenn sich der Wert von mindestens einem Signal auf der rechten Seite des Zuweisungszeichens ändert. 24 Datenfluß-Modell eines Halbaddierers entity HALF_ADDER is port(A, B: in bit; SUM, CARRY: out bit:='0'); -- Voreinstellungen end HALF_ADDER; architecture CONCURRENT_HA of HALF_ADDER is constant S_delay: time:=8 ns; -- benannte Konstanten constant C_delay: time:=4 ns; begin SUM <= A xor B after S_delay; -- nebenläufig! CARRY <= A and B after C_delay; -- nebenläufig! end CONCURRENT_HA; 25 Datenfluß-Modelle: Selektive Signalzuweisungen • Selected signal assignment (z.B. 4fach-Multiplexer): architecture VERH2_MUX4 of MUX4 is begin with SEL select –- Auswahlsignal Z <= X(0) after 5 ns when "00"; X(1) after 5 ns when "01"; X(2) after 5 ns when "10"; X(3) after 5 ns when "11"; end VERH2_MUX4; X(0) X(1) X(2) X(3) SEL Z • Diese Anweisung entspricht einem case-Konstrukt. • Für sämtliche möglichen Kombinationen des Selektors muß ein Signalwert zugewiesen werden. • Falls nicht alle Kombinationen definiert sind, muß zwingend unter einer letzten Bedingung when others ein Wert zugewiesen werden. 26 Datenfluß-Modelle: Bedingte Signalzuweisungen • Conditional signal assignment (z.B. 4fach-Multiplexer): architecture VERH3_MUX4 of MUX4 is begin Z <= X(0) after 5 ns when SEL="00" else X(1) after 5 ns when SEL="01" else X(2) after 5 ns when SEL="10" else X(3) after 5 ns when SEL="11"; end VERH3_MUX4; • Diese Anweisung entspricht einem if-then-else-Konstrukt. • Es können beliebig viele Bedingungen abgefragt werden. Die Priorität der Bedingungen entspricht ihrer Reihenfolge. Das Zeitverhalten unterscheidet sich von der selektiven Signalzuweisung. • Im Gegensatz zur selektiven Signalzuweisung können bei der bedingten Signalzuweisung unterschiedliche Signale in den einzelnen Bedingungen kombiniert werden. 27 Verhaltensmodelle Bei Verhaltensmodellen (behavioral architectures) ist zwischen zwei Formen zu unterscheiden: • Algorithmische Modelle – beschreiben die Funktion (das Verhalten) einer Schaltung(skomponente) wie in einer (herkömmlichen) Programmiersprache durch eine Sequenz von Anweisungen, die in einem Prozess zusammengefaßt sind – sind nur zur Simulation des Schaltungsverhaltens geeignet • Datenflußmodelle – beschreiben die Schaltungsfunktion als Datenfluß zwischen kommunizierenden Prozessen (nebenläufig, zeitlich parallel) – sind besonders geeignet zur Beschreibung auf der RegisterTransfer-Ebene – können als Ausgangspunkt für eine automatisierte Synthese der Schaltungsstruktur verwendet werden 28 Die Struktur einer Schaltung Schaltplan (schematic diagram) des 2x4-Dekoders DEK2X4 & D(0) G0 A 1 IA AQ B 1 IB BQ EN & D(1) G1 & D(2) G2 & D(3) G3 33 Modellieren der Schaltungsstruktur Beispiel: 2x4Dekoder architecture STRUKTUR of DEK2X4 is component INV port(A: in bit; Z: out bit); end component; component NAND3 port(A,B,C: in bit; Z: out bit); end component; signal AQ,BQ: bit; begin -- Netzliste (nebenläufig!) -- component-Instanzierungen IA: INV port map(A,AQ); IB: INV port map(B,BQ); G0: NAND3 port map(AQ,BQ,EN,D(0)); G1: NAND3 port map(AQ,B,EN,D(1)); G2: NAND3 port map(A,BQ,EN,D(2)); G3: NAND3 port map(A,B,EN,D(3)); end STRUKTUR; 34 Modellieren von Teilschaltungen entity INV is port (A: in bit; Z: out bit); Komponenten end INV; INV und NAND3 architecture ARCH_INV of INV is des 2x4begin -- Verhaltensbeschreibung Dekoders Z <= not A after 12 ns; end ARCH_INV; Beispiel: entity NAND3 is port (A,B,C: in bit; Z: out bit); end NAND3; architecture ARCH_NAND3 of NAND3 is begin -- Verhaltensbeschreibung Z <= not(A and B and C) after 8 ns; end ARCH_NAND3; 35 Hierarchische Modellierung der Schaltungsstruktur Beispiel: Komponente NAND3 des 2x4Dekoders A B C X Y Z architecture STRUK_NAND3 of NAND3 is component AND2 port(E1,E2: in bit; A: out bit); end component; component INV port(A: in bit; Z: out bit); end component; signal X, Y: bit; begin M1: AND2 port map(A,B,X); M2: AND2 port map(C,X,Y); M3: INV port map(Y,Z); end STRUK_NAND3; library MyLib; configuration NAND3_CONF of NAND3 is for STRUK_NAND3 –- Name der architecture for all:AND2 use entity MyLib.AND2(TimAr); end for; AUTOMATIC IN XILINX TOOLS! for M3:INV use entity WORK.INV(ARCH_INV); end for; end for; end NAND3_CONF; 36 Configurations (Binden architecture an entity) entity AUTOMATIC IN XILINX TOOLS! architecture Verhaltensbeschreibung architecture GatterNetzliste configuration Für eine entity kann eine von mehreren architectures ausgewählt werden. Dadurch kann beispielsweise eine Verhaltensbeschreibung leicht (ohne Eingriff in die Quelltexte) durch eine Strukturbeschreibung ersetzt werden. architecture RTBeschreibung 37 Libraries & Packages • Die Library (Bibliothek) WORK wird beim Übersetzen automatisch eingebunden. In ihr legt der VHDL-Compiler alle übersetzten Design Units (Entities, Architectures, Configurations) ab, die dann ohne explizite Angabe der Library benutzt werden können. • Das Package STANDARD mit den grundlegenden Datentypen wird ebenfalls automatisch eingebunden. • Eine Library kann PACKAGE Design Units enthalten, in denen TYPE-, SUBTYPE- und FUNCTION-Deklarationen zusammengefasst werden. Das ermöglicht die Verwendung dieser Deklarationen in verschiedenen Modellen ohne wiederholte (und fehlerträchtige) erneute Deklaration. • Syntax: library IEEE; -- Einbinden der library IEEE use IEEE.STD_LOGIC_1164.all; 41 Datentypen, Subtypen (package STANDARD) package STANDARD is -- wird automatisch geladen -- enthält u.a. die Datentypen type boolean is (false,true); type bit is ('0','1'); type character is (...); type integer is ...; subtype natural is integer range 0 to integer'high; subtype positive is integer range 1 to integer'high; type real is ...; type time is ... units fs; ps=1000 fs; ...; type string is array (positive range <>) of character; type bit_vector is array (natural range <>) of bit; -- Die zugehörigen Operatoren sind auch definiert. end standard; 42 Neunwertige Logik (IEEE package STD_LOGIC_1164) package STD_LOGIC_1164 is -- ist gespeichert in der library mit dem Namen IEEE type STD_LOGIC is ('U', -- nicht initialisiert (Voreinstellung) 'X', -- Signalkonflikt zwischen '0' und '1' '0', -- aktive '0' (durch Gatter getrieben) '1', -- aktive '1' (durch Gatter getrieben) 'Z', -- hochohmig (tri-state Ausgang) 'W', -- Signalkonflikt zwischen 'L' und 'H' 'L', -- passive '0' (pull-down Widerstand) 'H', -- passive '1' (pull-up Widerstand) '-' -- don't care, Wert ist bedeutungslos und ); -kann zur Logikminimierung dienen type STD_LOGIC_VECTOR is array (natural range <>) of STD_LOGIC; -- definiert sind auch die Logikoperatoren -and, nand, or, nor, xor, xnor, not end STD_LOGIC_1164; 43 Ausgewählte Attribute von Signalen signal S; variable T: time; S'event Diese Funktion liefert den Booleschen Wert true, wenn im aktuellen Simulationszyklus beim Signal S ein Event auftritt, sonst false. S'last_event Diese Funktion liefert die Simulationszeit, seit beim Signal S das letzte Event auftrat. Das Ergebnis ist also 0 fs, wenn S'event true ist. S'last_value Wert von S, unmittelbar bevor das letzte Event auftrat. S'stable(T) Boolesches Signal, das den Wert true annimmt, wenn beim Signal S für T Zeiteinheiten kein Event aufgetreten ist. Wenn (T) fehlt, werden 0 fs angenommen. S'delayed(T) Signal vom selben Typ und mit denselben Werten wie S, aber um T Zeiteinheiten verzögert. Wenn (T) fehlt, werden 0 fs angenommen. 45 Parametrisierung von Modellen entity NANDg is -- generisches NAND-Gatter generic(Wb:positive:=3; -- Wortbreite Vz:time:=8 ns); -- Verzögerungszeit port(X: in bit_vector(Wb-1 downto 0); Y: out bit); end NANDg; architecture NANDg_Verh of NANDg is begin NANDg_proc: process(X) begin Y <= '0' after Vz; -- Voreinstellung for K in X'range loop -- Attribut des Signals X -- K = Wb-1, Wb-2, Wb-3, ..., 1, 0 if X(K)='0' then Y <= '1' after Vz; end if; end loop; end process NANDg_proc; end NANDg_Verh; 47 Schaltungsstruktur mit generischem NAND-Gatter Beispiel: 2x4-Dekoder architecture STRUKTgen of DEK2X4 is component NANDg generic(Wb:positive; Vz:time); port(X: in bit_vector(Wb-1 downto 0); Y: out bit); end component; signal AQ,BQ: bit; begin IA: NANDg generic map(1,6 ns) port map(X(0)=>A,Y=>AQ); IB: NANDg generic map(1,6 ns) port map(X(0)=>B,Y=>BQ); G0: NANDg port map(X(2)=>AQ,X(1)=>BQ,X(0)=>EN, Y=>D(0)); G1: NANDg port map(X(2)=>AQ,X(1)=>B, X(0)=>EN, Y=>D(1)); G2: NANDg port map(X(2)=>A, X(1)=>BQ,X(0)=>EN, Y=>D(2)); G3: NANDg port map(X(2)=>A, X(1)=>B, X(0)=>EN, Y=>D(3)); end STRUKTgen; 48 Beispiel: Generischer n-Bit-Zähler entity genCntr is generic ( N : positive := 8 ); port ( CLOCK, RESET : in bit; COUNTER : out integer range 0 to 2**N-1 ); end genCntr; architecture arch_genCntr of genCntr is signal intCntr : integer range 0 to 2**N-1; begin process (CLOCK) begin if CLOCK'event and CLOCK = '1'; if RESET = '1' or intCntr = 2**N-1 then intCntr <= 0; else intCntr <= intCntr + 1; end if; end if; end process; COUNTER <= intCntr; end arch_genCntr; 49 Beispiel: Generischer n-Bit-Zähler entity genCntr is generic ( N : positive := 8 ); port ( CLOCK, RESET : in bit; COUNTER : out integer range 0 to 2**N-1 ); end genCntr; architecture arch_genCntr of genCntr is signal intCntr : integer range 0 to 2**N-1; begin process begin wait until ( CLOCK'event and CLOCK = '1' ); if RESET = '1' or intCntr = 2**N-1 then intCntr <= 0; else intCntr <= intCntr + 1; end if; end process; COUNTER <= intCntr; end arch_genCntr; 50 Generics, Attribute & Assertions am Beispiel: D-FlipFlop entity DFF is generic(Tpd,Tsu,Thld:time); -- Verzögerung, Setup, Hold port(Clk,D: in bit; Q: out bit); end DFF; architecture ArchDFF of DFF is begin –- drei kommunizierende Prozesse Q <= D after Tpd when Clk='1' and Clk'event; ChkSetup: process –- Prüfen der Setup-Zeit begin –- Test bei steigender Clk-Flanke wait until Clk='1'; assert D'last_event>=Tsu report "setup violation"; end process ChkSetup; ChkHold: process –- Prüfen der Hold-Zeit begin –- Test nach Ablauf der Hold-Zeit wait until Clk'delayed(Thld)='1'; assert D'delayed'last_event>=Thld report "hld viol."; end process ChkHold; end ArchDFF; 51 Testrahmen (test benches) Testrahmen (test benches) 52 Testrahmen entity TB is -- leer TB end TB; -- ohne Inputs, Outputs architecture STIMULI of TB is component DEK2X4 port(A,B,EN: in bit; D: out bit_vector(0 to 3)); end component; signal X,Y,E: bit:='0'; R: bit_vector(0 to 3):="1111"; begin UUT: DEK2X4 port map(X,Y,E,R); ... end STIMULI; X Y E A B EN UUT DEK2X4 D0 D1 D2 D3 R0 R1 R2 R3 53 Testrahmen – Stimuli architecture STIMULI of TB is component DEK2X4 port(A,B,EN: in bit; D: out bit_vector(0 to 3)); end component; signal X,Y,E: bit:='0'; R: bit_vector(0 to 3):="1111"; begin -- Datenflußbeschreibung (nebenläufig!) -- Instanzierung der “unit under test" UUT: DEK2X4 port map(X,Y,E,R); -- Stimuli = Input-Signalverläufe (waveforms) X <= '0' , '1' after 5 ns, '0' after 10 ns, '1' after 15 ns, '0' after 20 ns, '1' after 25 ns, '0' after 30 ns, '1' after 35 ns; Y <= '0' , '1' after 10 ns, '0' after 20 ns, '1' after 30 ns; E <= '0' , '1' after 20 ns; end STIMULI; ... 54 Testrahmen – Signalverläufe X 1 0 0 1 0 1 0 1 0 1 Y 1 0 0 0 1 1 0 0 1 1 E 1 0 0 0 0 0 1 1 1 1 R0 1 0 R1 1 0 R2 1 0 R3 1 0 0 0 0 0 0 5 10 15 20 25 30 35 40 ns 55