Menu
Coddy logo textTech

Korzystanie z zadań systemowych

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 77 z 90.

Zadania systemowe to wbudowane polecenia w Verilogu, które zaczynają się od znaku dolara ($). Wykonują przydatne funkcje, takie jak wyświetlanie komunikatów, kończenie symulacji i tworzenie plików przebiegów.

Omówiliśmy już $display, $monitor, $dumpfile i $dumpvars na poprzednich lekcjach. W tej lekcji przyjrzymy się dodatkowym zadaniom systemowym, które są przydatne w testbenchach.

Dodatkowe zadania systemowe

Zadanie systemoweCel
$timeZwróć bieżący czas symulacji
$finishZakończ symulację
$stopWstrzymaj symulację
$randomWygeneruj losową liczbę

$time

Zwraca bieżący czas symulacji. Przydatne do śledzenia, kiedy występują zdarzenia.

$display("Current time is %0t", $time);

$finish

Kończy symulację. Zawsze używaj na końcu swojego testbencha.

$finish;

$stop

Wstrzymuje symulację. Można ją wznowić za pomocą polecenia symulatora. Przydatne podczas debugowania.

$stop;

$random

Generuje losową liczbę. Przydatne do tworzenia losowych bodźców testowych.

reg [7:0] rand_value;
rand_value = $random;

Przykład użycia wielu zadań systemowych

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

Wyzwanie

Dodaj do tego testbencha brakujące zadania systemowe.

Co należy zrobić:

  1. Dodaj $display, aby wypisać aktualny czas na początku
  2. Dodaj $display, aby wypisać aktualny czas na końcu
  3. Dodaj $finish, aby zakończyć symulację

Spróbuj swoich sił

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: Dodaj $display z bieżącym czasem na początku
    // 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: Dodaj $display z bieżącym czasem na końcu
    // Format: "End time: %0t"
    
    
    // TODO: Dodaj $finish
    
  end
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online