Menu
Coddy logo textTech

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-TaskZweck
$timeGibt die aktuelle Simulation-Time zurück
$finishBeendet die Simulation
$stopPausiert die Simulation
$randomGeneriert 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
endmodule
challenge icon

Aufgabe

Füge die fehlenden System-Tasks zu dieser Testbench hinzu.

Was zu tun ist:

  1. Füge $display hinzu, um die aktuelle Zeit zu Beginn auszugeben
  2. Füge $display hinzu, um die aktuelle Zeit am Ende auszugeben
  3. Füge $finish hinzu, 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
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen