1. Einführung: Die Bedeutung und der Zweck von „display“ in Verilog
Was bedeutet „display“ in Verilog?
In Verilog ist $display ein System‑Task, der als Werkzeug dient, um den internen Zustand eines Designs während der Simulation „anzuzeigen“. Ähnlich wie printf in C ermöglicht er das Ausgeben von Signalen, Variablenwerten und Zeichenketten auf ein Terminal oder in die Konsole – und spielt damit eine zentrale Rolle beim Debugging und bei der funktionalen Verifikation.
Warum ist $display für die Verilog‑Entwicklung unverzichtbar?
Verbesserte Debugging‑Effizienz : In komplexen Schaltungsdesigns ist die Visualisierung, ob interne Signale korrekt funktionieren, entscheidend. Durch den Einsatz von $display können Sie sofort die Werte interessierender Signale während der Simulation prüfen.
Simulation‑Visualisierung : Beim Verfolgen von Wertübergängen zu bestimmten Zeitpunkten können reine Wellenformen unzureichend sein. Anzeige‑Logs bieten ein zuverlässiges Mittel, um genau diese Momente zu kennzeichnen.
Auch für die Dokumentation nützlich : Wenn Sie Design‑Intentionen oder Betriebsregeln anderen Ingenieuren vermitteln, können annotierte Anzeige‑Logs das Verständnis des Codes verbessern.
Zweck und Aufbau dieses Artikels
In diesem Artikel erklären wir methodisch Folgendes:
Grundsyntax und Verwendung : Eine sorgfältige Einführung in die grundlegende Syntax und Nutzung von $display.
Vergleich mit anderen System‑Tasks : Wir stellen die Unterschiede zwischen display‑bezogenen Tasks wie $write, $strobe und $monitor gegenüber.
Format‑Spezifizierer und erweiterte Anwendungstechniken : Der Einsatz von Format‑Spezifizierern wie %d, %b, %h, %s sowie speziellen Anzeige‑Techniken wird vorgestellt.
Praktische Anwendungsbeispiele : Wir zeigen konkrete Beispiele in Testbenches und Code, die sofort anwendbares Know‑how vermitteln.
Display‑Steuerungs‑Anwendungen : Beispiel‑Anwendungsfälle umfassen Hardware‑Ausgaben wie LCD‑ oder Monitor‑Steuerung sowie die Anzeige von Text‑/Bild‑Ausgaben.
Mit diesem Aufbau können sowohl Einsteiger als auch Fortgeschrittene $display in Verilog richtig verstehen und praktisch einsetzen. In jedem nachfolgenden Abschnitt gehen wir klar und anhand von Beispielen und Diagrammen (sofern möglich) vor.
2. Grundlagen von $display: Syntax, Anwendungsfälle und Vorsichtsmaßnahmen
Grundsyntax von $display
Bei der Verwendung von $display in Verilog lautet die Grundsyntax wie folgt.
$display("string or format specifiers", signal1, signal2, ...);
Zeichenketten‑Teil : Schreiben Sie beliebigen Text oder Format‑Spezifizierer (z. B.: %d, %b, %h).
Argumente : Listen Sie Signal‑ oder Variablennamen auf, die im entsprechenden Format ausgegeben werden sollen.
Beispiel: Anzeige von Takt‑Zähler und Signalwerten
In diesem Beispiel werden die Simulationszeit sowie die Werte der Clock/Reset‑Signale ausgegeben.
Anwendungsfälle von $display
Erfassung des Simulationsfortschritts – Durch das Einsetzen von $display an bestimmten Stellen im Design können Sie überprüfen, welchen Teil des Codes die Ausführung erreicht hat.
Signalwert‑Verifikation – Auch wenn Wellenform‑Viewer das intuitive Verstehen von Verzweigungen oder Zustandsübergängen erschweren, erleichtert die Textausgabe das Verständnis.
Bedingte Nachrichtenanzeige – In Kombination mit if‑Anweisungen können Sie Meldungen nur dann protokollieren, wenn bestimmte Bedingungen erfüllt sind. if (reset) $display("Reset asserted at %0t", $time);
Unterschied zwischen $display und $write
$display fügt am Ende der Ausgabe automatisch einen Zeilenumbruch ein. $write hingegen setzt die Ausgabe fort, ohne einen Zeilenumbruch hinzuzufügen.
Beispiel:
$display("Hello");
$display("World");
Ausgabe:
Hello
World
$write("Hello");
$write("World");
Ausgabe:
HelloWorld
Wenn Sie klar strukturierte zeilenweise Logs benötigen, verwenden Sie $display. Möchten Sie mehrere Ausgaben in einer Zeile formatieren, nutzen Sie $write.
Vorsichtsmaßnahmen
Vermeiden Sie übermäßige Ausgabe Wenn Sie $display in jedem Taktzyklus verwenden, werden die Protokolle groß und die Lesbarkeit sinkt. → Verwenden Sie Bedingungen, um die Ausgabe zu reduzieren.
Nutzen Sie die Zeitausgabe Die Ausgabe von $time oder $realtime ermöglicht es Ihnen, den Zeitpunkt von Vorgängen genau zu erfassen.
Nur für Simulation konzipierte Aufgabe$display kann nicht für die Synthese (FPGA/ASIC-Implementierung) verwendet werden. Es ist ausschließlich ein Debug‑Werkzeug für die Simulation.
3. Vergleich von Log‑Ausgabe‑System‑Tasks: $display, $write, $strobe, $monitor
Verilog bietet System‑Tasks über $display hinaus für die Ausgabe. Ihre unterschiedlichen Anwendungsfälle und Zeitpunkte machen es sinnvoll, zu verstehen, wie man sie gezielt einsetzt.
$display: Standard‑Anzeige‑Task
Merkmale Fügt automatisch einen Zeilenumbruch hinzu und protokolliert pro Aufruf eine Zeile.
Anwendungsfall Am häufigsten als einfache Debug‑Methode verwendet; Sie können ihn jederzeit für eine einmalige Ausgabe aufrufen.
$write: Anzeige ohne Zeilenumbruch
Merkmale Fügt keinen Zeilenumbruch hinzu und setzt die Ausgabe daher in derselben Zeile fort.
Anwendungsfall Nützlich, wenn Sie mehrere Werte nebeneinander anzeigen möchten.
Merkmale Gibt Werte aus, nachdem alle Simulationsauswertungen im aktuellen Schritt abgeschlossen sind.
Anwendungsfall Hilfreich, um Rennbedingungen zu vermeiden (wenn mehrere Signale gleichzeitig wechseln).
Beispiel$strobe("Time=%0t, signal=%b", $time, sig); → Während $display Zwischenwerte zeigen kann, zeigt $strobe stabile Werte.
$monitor: Automatische Verfolgungs‑Ausgabe
Merkmale Gibt automatisch aus, wenn sich ein überwachtes Signal ändert.
Anwendungsfall Praktisch, wenn Sie ein Set von Signalen kontinuierlich überwachen möchten.
Beispiel$monitor("At %0t: a=%b, b=%b", $time, a, b); → Protokolliert, wenn entweder a oder b sich ändert.
Zusammenfassungstabelle
Task
Zeilenumbruch
Zeitpunkt der Ausgabe
Hauptanwendungsfall
$display
Ja
Bei Aufruf
Grundlegende Protokollausgabe
$write
Nein
Bei Aufruf
Nebeneinander‑Formatierung
$strobe
Ja
Nach Ende des Simulationszyklus
Stabile Werte prüfen
$monitor
Ja
Automatisch bei Signaländerung
Kontinuierliche Überwachung
Tipps für effektive Nutzung
Verwenden Sie $display standardmäßig: Lesbar und einfach für Anfänger.
Verwenden Sie $write, wenn Sie eine einzeilige kombinierte Ausgabe wünschen.
Verwenden Sie $strobe, wenn Sie nach Änderungen stabile Werte benötigen.
Verwenden Sie $monitor, wenn Sie eine kontinuierliche Signalüberwachung benötigen.
4. Format‑Spezifizierer und erweiterte Anzeige‑Techniken
Mit Tasks wie $display oder $write können Sie „Format‑Spezifizierer“ in Zeichenketten einbinden, um Signale oder Variablen in gewünschten Formaten auszugeben. Da sie C‑printf ähneln, verbessert die korrekte Verwendung je nach Zweck die Debug‑Effizienz erheblich.
Grundlegende Format‑Spezifizierer
Spezifizierer
Beschreibung
Ausgabe‑Beispiel
%b
binär
1010
%d
dezimal
10
%h
hexadezimal
A
%o
oktal
12
%c
ASCII‑Zeichen
A
%s
Zeichenkette
Hello
%t
Simulationszeit
#100 etc.
%m
Modul‑Hierarchie‑Name
top.u1.u2
Praktische Beispiele
Signal in mehreren Formaten anzeigenreg [7:0] data = 8'b10101010; $display("data = %b (bin), %d (dec), %h (hex)", data, data, data); → Beispielausgabe: data = 10101010 (bin), 170 (dec), AA (hex)
Modul‑Hierarchie prüfen$display("Current module hierarchy is %m"); → Beispielausgabe: Current module hierarchy is top.u1.counter
Null‑Padding & Feldbreite Sie können Null‑Padding oder Feldbreite angeben, z. B. %0d. Beispiel: $display("Count=%04d", count); → Ausgabe: Count=0012
Unterscheidung zwischen vorzeichenbehaftet und vorzeichenlos%d behandelt Werte als vorzeichenbehaftet, %u als vorzeichenlos. Wenn ein negativer Wert nicht wie erwartet angezeigt wird, passen Sie den Formatierer an.
Mehrzeilige Nachrichten formatieren Verwenden Sie \n, um Zeilen für bessere Lesbarkeit zu trennen. Beispiel: $display("Start of test\nSignal A=%b\nSignal B=%b", A, B);
Vorsichtsmaßnahmen
Beachten Sie die Bit‑Breite : Verilog‑Signale können unterschiedliche Breiten haben; die Verwendung von %d kann zu Abschneidung oder Vorzeichen‑Erweiterungs‑Problemen führen.
Umgang mit undefinierten Werten (X, Z) : Wenn Sie undefinierte Bits einbinden, zeigt %bx oder z direkt an.
5. Praktische Beispiele: Verwendung von $display in Test‑Benches und Modulen
Im Folgenden stellen wir effektive Einsatzmöglichkeiten von $display anhand von realen Verilog‑Code‑Beispielen vor, von den Grundlagen der Test‑Benches bis hin zu bedingtem Debug‑Logging.
Einfaches Beispiel: Ausgabe in einem Test‑Bench
Durch Einfügen von $display in einen Test‑Bench können Sie das Verhalten während der Simulation beobachten.
module tb_counter;
reg clk;
reg reset;
wire [3:0] count;
// DUT (Device Under Test)
counter uut (
.clk(clk),
.reset(reset),
.count(count)
);
// Clock generation
initial begin
clk = 0;
forever #5 clk = ~clk; // invert every 5 units
end
// Test scenario
initial begin
reset = 1;
#10 reset = 0;
#50 $finish;
end
// Display state
always @(posedge clk) begin
$display("Time=%0t | reset=%b | count=%d", $time, reset, count);
end
endmodule
In diesem Beispiel löst jeder steigende Takt die Ausgabe von reset und count aus. Da Sie sowohl Text‑Logs als auch Wellenformen inspizieren können, wird das Verfolgen des Verhaltens einfacher.
Bedingtes Anzeige‑Beispiel
Durch Kombination mit if‑Anweisungen können Sie nur dann protokollieren, wenn bestimmte Bedingungen erfüllt sind.
always @(posedge clk) begin
if (count == 4'd10) begin
$display("Count has reached 10 (Time=%0t)", $time);
end
end
→ So vermeiden Sie überflüssige Logs und können die für Sie relevanten Ereignisse gezielt erfassen.
Debug‑Nachrichten‑Beispiel
Beim Design‑Debugging ist es effektiv, zu erfassen, wenn ein Signal in einen „unerwarteten Zustand“ wechselt.
always @(posedge clk) begin
if (count > 4'd12) begin
$display("WARNING: count overflow detected! Time=%0t, value=%d", $time, count);
end
end
→ So können Sie Design‑Fehler oder unerwartetes Simulationsverhalten schnell entdecken.
Mehrere Signale gemeinsam überwachen
Wenn viele Signale ausgegeben werden, macht das Zusammenfassen in einer Zeile mittels $display die Logs lesbarer.
Bisher haben wir $display für Simulations‑Logs vorgestellt. Gleichzeitig wird Verilog auch häufig für die „Display‑Steuerung“ in Hardware‑Implementierungen (LCD, VGA, HDMI‑Ausgabe) verwendet. In diesem Abschnitt geben wir einen kurzen Überblick, wie man Bildschirmanzeigen auf Hardware‑Ebene realisiert.
Grundkonzept der Display‑Steuerung
Um Text oder Bilder auf einem Bildschirm anzuzeigen, muss man Videosignale erzeugen, nicht nur $display verwenden. Typische Steuer‑Signale sind:
HSYNC (Horizontal Sync) : Signal, das das Ende jeder Zeile markiert
VSYNC (Vertical Sync) : Signal, das das Ende jedes Bildes markiert
RGB‑Daten : Signal, das die Farbe jedes Pixels repräsentiert (z. B. 8 Bit × 3 = 24‑Bit‑Farbe)
In Verilog steuern Sie diese Signale über Zähler und Zustandsmaschinen und geben sie zeitlich gesteuert aus, um die „Bildschirmanzeige“ zu realisieren.
Beispiel 1: Anzeige von Farb‑Balken
Das grundlegendste Beispiel ist das horizontale Ausgeben von Farbbalken auf einem Display.
always @(posedge clk) begin
if (h_counter < 100) rgb <= 24'hFF0000; // red
else if (h_counter < 200) rgb <= 24'h00FF00; // green
else if (h_counter < 300) rgb <= 24'h0000FF; // blue
else rgb <= 24'h000000; // black
end
→ Dies ergibt rote, grüne und blaue Farbbalken, die horizontal über den Bildschirm ausgerichtet sind.
Beispiel 2: Textanzeige
Für die Textanzeige bereiten Sie ein Font‑ROM vor und wandeln das Punktmuster jedes Zeichens in Pixel um.
// Referencing the pattern of 'A' from the font ROM and displaying
if (font_rom[char_code][y][x] == 1'b1)
rgb <= 24'hFFFFFF; // white for display
else
rgb <= 24'h000000; // black background
→ Dies zeichnet ein bestimmtes Zeichen (z. B. „A“) auf dem Bildschirm.
Beispiel 3: Bildanzeige
Um ein Bild anzuzeigen, lesen Sie vorab gespeicherte Bitmap‑Daten (ROM oder externer Speicher) und wandeln diese in Pixelausgabe um.
rgb <= image_rom[addr]; // Retrieve color data from ROM
In eingebetteten Systemen mit FPGAs ermöglicht diese Methode das Anzeigen einfacher Symbole oder Logos.
Unterschied im Vergleich zu Debug‑$display
$display ist Textausgabe (nur Simulation)
Anzeige‑Steuerung ist Video‑Signal‑Erzeugung (hardware‑implementierbar)
Obwohl ihre Zwecke unterschiedlich sind, verwechseln Lernende von Verilog oft beide.
„Ich möchte das Verhalten während der Simulation überprüfen“ → Verwende $display
„Ich möchte die Ausgabe auf einen echten Bildschirm auf dem FPGA“ → Entwerfe Video‑Signal‑Logik
Erweiterung der Anwendungen
Beim Erlernen von FPGA‑Boards wird Verilog häufig für 7‑Segment‑LED‑Anzeige oder kleine LCD‑Anzeige verwendet.
Wenn man weiterkommt, kann man Systeme bauen, die VGA/HDMI‑Ausgabe für Spieleentwicklung oder GUI‑Anzeige unterstützen.
Durch die Kombination von $display‑Kenntnissen mit Anzeige‑Steuer‑Logik kann man „Anzeige“ sowohl in der Simulation als auch in echter Hardware handhaben.
7. Geeignete Verwendung und Tipps basierend auf Anwendungsszenarien
Wenn wir in Verilog von „Anzeige“ sprechen, gibt es zwei Aspekte: die nur‑Simulation $display‑Aufgaben und die Hardware‑Implementierungs‑Anzeige‑Steuerung. Die jeweils passende Verwendung führt zu effizienter Entwicklung und Fehlersuche.
Verwendung in der Simulation
$display als Debug‑Log
Geben Sie kritische Variablen oder Signale mit $display aus, um zu prüfen, ob Ihr Design wie erwartet funktioniert.
Das Verifizieren von „Werten unter bestimmten Bedingungen“ oder „Zähler‑Erreichen‑Punkten“ über Logs ist effizient.
Vermeiden Sie übermäßige Ausgaben
Das Ausgeben bei jedem Taktzyklus überflutet die Logs und verringert die Lesbarkeit. Beschränken Sie die Bedingungen.
Beispiel: if (state == ERROR) $display("Error occured at %0t", $time);
Unterscheiden Sie zwischen Aufgaben
$monitor → Für Signale, die Sie kontinuierlich beobachten möchten
$strobe → Wenn Sie gesättigte Werte ausgeben müssen
$write → Für formatierte horizontale Ausgabe
Verwendung in der Hardware‑Anzeige‑Steuerung
7‑Segment‑Anzeige zum Lernen
In FPGA‑Einsteigerprojekten ist das Anzeigen eines Zählerwertes auf einer 7‑Segment‑LED Standard.
Kombinieren Sie dies mit der $display‑Simulationausgabe, um das Verständnis von Anzeige vs. Simulation zu vertiefen.
LCD‑ oder VGA‑Monitor‑Steuerung
Verwenden Sie Font‑ROM oder Image‑ROM, um Text oder Bild anzuzeigen.
Durch gleichzeitige Nutzung von $display in der Simulation können Sie die Korrektheit der Video‑Signal‑Erzeugung doppelt prüfen.
Debug‑Overlay in der Hardware
Sie können „Zählerwert“, „Koordinaten“, „Debug‑Nachrichten“ als Overlay auf der tatsächlichen Videoausgabe darstellen.
In der FPGA‑Entwicklung ist es üblich, den Bildschirm selbst zu einem Debug‑Werkzeug zu machen.
Praktische Tipps
Simulation → Hardware‑Fluss folgen Verwenden Sie zuerst $display, um das Verhalten in der Simulation zu überprüfen, und wechseln Sie dann zur Anzeige‑Steuerlogik für die Hardware‑Implementierung.
Protokolle und Wellenformen gemeinsam nutzen Textprotokolle von $display zeigen den „Zeitpunkt des Ereignisses“ an, während Wellenformen die „detaillierten Übergänge“ darstellen. Die Kombination beider erhöht die Debug‑Präzision.
Nachrichtenformat im Team vereinheitlichen Die Standardisierung des $display‑Nachrichtenformats (Präfix, Zeitanzeige usw.) erleichtert die Protokollanalyse, wenn mehrere Personen zusammenarbeiten.
Zusammenfassung
$display‑Aufgaben sind rein simulations‑„Beobachtungswerkzeuge“
Durch geeignete Nutzung und Kombination beider können Sie eine effiziente Entwicklung ermöglichen
8. FAQ (Häufig gestellte Fragen)
Q1. Was ist der Unterschied zwischen $display und $monitor?
A.$display gibt einmal zum Zeitpunkt des Aufrufs aus. Im Gegensatz dazu gibt $monitor automatisch aus, sobald sich ein registriertes Signal ändert.
Für einmaliges Debugging → $display
Für kontinuierliche Überwachung → $monitor
Q2. Wann sollte ich $strobe verwenden?
A.$strobe gibt den stabilisierten Wert am Ende eines Simulationszyklus aus. Zum Beispiel kann $display bei gleichzeitig wechselnden Signalen an einer Taktflanke Zwischenwerte zeigen. In solchen Fällen ist $strobe praktisch, um die Endwerte anzuzeigen.
Q3. Wofür dient der Formatbezeichner %m?
A.%m gibt den aktuellen Modul‑Hierarchienamen aus. In großen Designs erleichtert das Protokollieren, „aus welcher Hierarchie die Nachricht stammt“, die Analyse erheblich.
$display("Current module: %m");
Beispielausgabe:
Current module: top.u1.counter
Q4. Meine Protokolle wurden riesig, weil ich viele $display verwendet habe. Was soll ich tun?
A. Die folgenden Maßnahmen sind wirksam:
Verwenden Sie if‑Anweisungen, um die Ausgabe zu filtern
Geben Sie nur Fehlermeldungen oder bestimmte Ereignisse aus
Nutzen Sie $monitor, um nur die unbedingt erforderlichen Signale zu beobachten
Schreiben Sie in eine Logdatei und wenden Sie während der Analyse Filterwerkzeuge an
Q5. Kann $display für die Synthese (FPGA/ASIC) verwendet werden?
A. Nein. $display ist ausschließlich eine Simulation‑Aufgabe. Synthese‑Tools ignorieren sie, sodass sie in der realen Hardware nicht erscheint. Wenn Sie Ausgaben auf echter Hardware anzeigen möchten, müssen Sie in Verilog mit „7‑Segment‑LED“, „LCD“, „VGA‑Steuerlogik“ usw. entwerfen.
Q6. Wie kann ich Text oder Bilder auf echter Hardware anzeigen?
A. Nicht über $display, sondern durch Erzeugen von Videosignalen.
7‑Segment‑Anzeige → Für einfache numerische oder Zeichenanzeige
VGA/LCD → Erzeugt HSYNC-, VSYNC‑ und RGB‑Signale und steuert sie
Text → Verwenden Sie eine Font‑ROM und geben Sie Punktmuster aus
Bilder → Speichern Sie Bitmaps in ROM oder externem Speicher und geben Sie die Pixel entsprechend aus
9. Fazit & nächste Schritte
Zusammenfassung dieses Artikels
In diesem Artikel haben wir das „display“ in Verilog von den Grundlagen bis zu Anwendungen behandelt. Wichtige Punkte waren:
Grundlagen von $display
Eine Simulationsaufgabe, die Signale oder Variablen anzeigt, ähnlich wie C’s printf.
Unterschiede zu verwandten Aufgaben
$write → Anzeige ohne Zeilenumbruch
$strobe → Gibt am Ende eines Simulationszyklus stabilisierte Werte aus
$monitor → Überwacht Signaländerungen automatisch
Verwendung von Formatbezeichnern
Durch die Verwendung von %b, %d, %h, %m, %t können Sie klarere und praktischere Protokolle ausgeben.
Praktische Beispiele
$display in Testbenches einfügen, um den Fortschritt zu überwachen.
Bedingte Nachrichten verwenden, um effizientes Debugging zu ermöglichen.
Anwendungen in der Anzeige‑Steuerung
$display ist nur für die Simulation; die Hardware‑Implementierung nutzt HSYNC, VSYNC, RGB, um Text/Bild auszugeben.
Von der 7‑Segment‑Anzeige bis zur fortgeschrittenen VGA/HDMI‑Steuerung sind Erweiterungen möglich.
Nächste Schritte
Weiter zu SystemVerilog → In der Nachfolgersprache SystemVerilog können Sie fortgeschrittenere Debug‑Funktionen nutzen (Assertions, erweiterte $display, usw.).
Kombinieren mit Wellenformanzeige → Durch die Kombination von $display‑Logs und Wellenformdaten können Sie sowohl numerische Werte als auch Übergänge analysieren und so die Debug‑Präzision steigern.
Hardware‑Anzeigeausgabe lernen → In einem kleinen FPGA‑Board‑Projekt versuchen Sie, Ausgaben auf einem 7‑Segment‑Display oder LCD zu erzeugen, um den Unterschied zwischen „Simulationsanzeige“ und „Hardware‑Anzeige‑Steuerung“ zu erleben.
In der Team‑Entwicklung anwenden → Durch die Standardisierung des $display‑Nachrichtenformats verbessern Sie die Effizienz der Log‑Analyse in der Mehrpersonen‑Entwicklung.
Zum Abschluss
$display ist mehr als reine „Textausgabe“. Es ist ein leistungsfähiges Werkzeug für das Simulations‑Debugging. Und wenn Sie in die Welt der Anzeige‑steuerung eintauchen, können Sie die Freude erleben, Grafiken auf echten Monitoren via FPGA zu zeigen.
Ich hoffe, dieser Artikel hilft Verilog‑Lernenden, sowohl das „Simulations‑Debugging“ als auch die „Hardware‑Anzeigeausgabe“ klar zu verstehen.