System-Tasks verwenden
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 77 von 90.
Systemtasks sind eingebaute Befehle in Verilog, die mit einem Dollarzeichen ($) beginnen. Sie führen nützliche Funktionen aus, wie das Drucken von Nachrichten, das Beenden der Simulation und das Erstellen von Wellenform-Dateien.
Wir haben $display, $monitor, $dumpfile und $dumpvars bereits in vorherigen Lektionen behandelt. In dieser Lektion werden wir uns weitere Systemaufgaben ansehen, die in Testbenches nützlich sind.
Zusätzliche System-Tasks
| System-Task | Zweck |
|---|---|
$time | Gibt die aktuelle Simulation-Time zurück |
$finish | Beendet die Simulation |
$stop | Pausiert die Simulation |
$random | Generiert eine Random-Number |
$time
Gibt die aktuelle Simulationszeit zurück. Nützlich, um zu verfolgen, wann Ereignisse eintreten.
$display("Current time is %0t", $time);$finish
Beendet die Simulation. Immer am Ende deines Testbenches verwenden.
$finish;$stop
Pausiert die Simulation. Kann mit einem Simulator-Befehl fortgesetzt werden. Nützlich für das Debugging.
$stop;$random
Generiert eine Zufallszahl. Nützlich zum Erzeugen von zufälligen Teststimuli.
reg [7:0] rand_value;
rand_value = $random;Beispiel für die Verwendung mehrerer Systemaufgaben
module system_tasks_demo;
reg [7:0] data;
integer i;
initial begin
$display("Simulation started at time %0t", $time);
for (i = 0; i < 5; i = i + 1) begin
data = $random;
$display("Random value %d: %b", i, data);
end
$stop;
#10 $display("Resumed at time %0t", $time);
$display("Simulation finished at time %0t", $time);
$finish;
end
endmoduleAufgabe
Füge die fehlenden System-Tasks zu dieser Testbench hinzu.
Was zu tun ist:
- Füge
$displayhinzu, um die aktuelle Zeit zu Beginn auszugeben - Füge
$displayhinzu, um die aktuelle Zeit am Ende auszugeben - Füge
$finishhinzu, um die Simulation zu beenden
Probier es selbst
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// TODO: Add $display with current time at start
// Format: "Start time: %0t"
$monitor("Time %0t: a=%b, b=%b, c=%b", $time, a, b, c);
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
// TODO: Add $display with current time at end
// Format: "End time: %0t"
// TODO: Add $finish
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster14Testbench-Grundlagen
Was ist eine TestbenchErstellen von StimuliDisplay und MonitorDumpfile und DumpvarsSystem-Tasks verwendenZusammenfassung – Vollständige Testbench3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen