Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Datei-E/A in Verilog meistern: Öffnen, Lesen, Schreiben und Schließen

Verilog stellt System-Tasks und -Funktionen bereit, um Dateien zu öffnen, Werte in Dateien zu schreiben, Werte aus Dateien zu lesen und in Variablen zu laden sowie Dateien wieder zu schließen.

Dateien öffnen und schließen

module tb;
  // Variable für den Datei-Handle deklarieren
  integer fd;
  initial begin
    // Neue Datei "my_file.txt" mit Schreibrechten öffnen
    // und den Datei-Handle in Variable "fd" speichern
    fd = $fopen("my_file.txt", "w");
    // Den Datei-Handle, auf den "fd" zeigt, schließen
    $fclose(fd);
  end
endmodule

Datei-Öffnungsmodi

ArgumentBeschreibung
"r" oder "rb"Zum Lesen öffnen
"w" oder "wb"Neue Datei zum Schreiben erstellen. Falls die Datei existiert, wird sie auf Länge 0 gekürzt und überschrieben
"a" oder "ab"Falls Datei existiert, anhängen (am EOF zum Schreiben öffnen), andernfalls neue Datei erstellen
"r+", "r+b" oder "rb+"Zum Lesen und Schreiben öffnen
"w+", "w+b" oder "wb+"Für Update kürzen oder erstellen
"a+", "a+b" oder "ab+"Anhängen oder neue Datei für Update am EOF erstellen

In Dateien schreiben

FunktionBeschreibung
$fdisplayÄhnlich wie $display, schreibt aber in Datei statt auf Konsole
$fwriteÄhnlich wie $write, schreibt aber in Datei statt auf Konsole
$fstrobeÄhnlich wie $strobe, schreibt aber in Datei statt auf Konsole
$fmonitorÄhnlich wie $monitor, schreibt aber in Datei statt auf Konsole

Alle oben genannten System-Funktionen geben Werte standardmäßig im Dezimalformat aus. Sie verfügen jeweils über drei weitere Varianten für binäre, oktale und hexadezimale Ausgabe.

FunktionBeschreibung
$fdisplay()Gibt standardmäßig dezimal aus
$fdisplayb()Gibt binär aus
$fdisplayo()Gibt oktal aus
$fdisplayh()Gibt hexadezimal aus
module tb;
  integer fd;
  integer i;
  reg [7:0] my_var;
  initial begin
    // Neue Datei erstellen
    fd = $fopen("my_file.txt", "w");
    my_var = 0;
    $fdisplay(fd, "Wert ausgegeben mit \$fdisplay");
    #10 my_var = 8'h1A;
    $fdisplay(fd, my_var);      // Dezimal
    $fdisplayb(fd, my_var);     // Binär
    $fdisplayo(fd, my_var);     // Oktal
    $fdisplayh(fd, my_var);     // Hexadezimal
    
    // \$fwrite gibt das Newline-Zeichen nicht automatisch am Zeilenende aus
    // Daher erscheinen alle unten stehenden Werte auf derselben Zeile
    $fdisplay(fd, "Wert ausgegeben mit \$fwrite");
    #10 my_var = 8'h2B;
    $fwrite(fd, my_var);
    $fwriteb(fd, my_var);
    $fwriteo(fd, my_var);
    $fwriteh(fd, my_var);
    
    // Mit Newline zur nächsten Zeile springen und mit Strobe ausgeben,
    // welcher den endgültigen Wert nach non-blocking Assignments nimmt
    $fdisplay(fd, " Wert ausgegeben mit \$fstrobe");
    #10 my_var <= 8'h3C;
    $fstrobe(fd, my_var);
    $fstrobeb(fd, my_var);
    $fstrobeo(fd, my_var);
    $fstrobeh(fd, my_var);
    
    #10 $fdisplay(fd, "Wert ausgegeben mit \$fmonitor");
    $fmonitor(fd, my_var);
    for(i = 0; i < 5; i = i+1) begin
      #5 my_var <= i;
    end
    #10 $fclose(fd);
  end
endmodule

Simulations-Ausgabe:

Wert ausgegeben mit $fdisplay
26
00011010
032
1a
Wert ausgegeben mit $fwrite
43001010110532b
Wert ausgegeben mit $fstrobe
60
00111100
074
3c
Wert ausgegeben mit $fmonitor
60
0
1
2
3
4

Aus Dateien lesen

Eine Zeile lesen

Die System-Funktion $fgets liest Zeichen aus der durch fd spezifizierten Datei in die Variable str, bis str gefüllt ist, ein Newline-Zeichen gelesen und in str übertragen wurde, oder eine EOF-Bedingung auftritt.

Tritt beim Lesen ein Fehler auf, gibt sie 0 zurück, ansonsten die Anzahl der gelesenen Zeichen.

EOF erkennen

Die System-Funktion $feof gibt einen Wert ungleich 0 zurück, wenn EOF erreicht wurde, andernfalls 0 für einen gegebenen Datei-Deskriptor als Argument.

module tb;
  reg[8*45:1] str;
  integer fd;
  initial begin
    fd = $fopen("my_file.txt", "r");
    // Zeilen lesen, bis EOF gefunden wird
    while (! $feof(fd)) begin
      // Aktuelle Zeile in Variable 'str' lesen
      $fgets(str, fd);
      // Inhalt der Variable anzeigen
      $display("%0s", str);
    end
    $fclose(fd);
  end
endmodule

Mehrere Argumente für $fdisplay

Wenn mehrere Variablen an $fdisplay übergeben werden, werden diese einfach in der angegebenen Reihenfolge nacheinander ohne Leerzeichen ausgegeben.

module tb;
  reg [3:0] a, b, c, d;
  reg [8*30:0] str;
  integer fd;
  initial begin
    a = 4'ha; b = 4'hb; c = 4'hc; d = 4'hd;
    fd = $fopen("my_file.txt", "w");
    $fdisplay(fd, a, b, c, d);
    $fclose(fd);
  end
endmodule

Simulations-Ausgabe:

10111213

Daten in einen String formatieren

Das erste Argument der System-Funktion $sformat ist der Variablenname, in den das Ergebnis geschrieben wird. Das zweite Argument ist der Format-String, der angibt, wie die folgenden Argumente in einen String formatiert werden sollen.

module tb;
  reg [8*19:0] str;
  reg [3:0] a, b;
  initial begin
    a = 4'hA; b = 4'hB;
    // 'a' und 'b' gemäß Format in String formatieren und in 'str' speichern
    $sformat(str, "a=%0d b=0x%0h", a, b);
    $display("%0s", str);
  end
endmodule

Simulations-Ausgabe:

a=10 b=0xb

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Verilog Clock Generator: Design & Implementierungsleitfaden
  8. Verilog Math Functions meistern für effizientes Hardware-Design
  9. Verilog $timeformat meistern: Präzision und Anzeigesteuerung
  10. Verilog Timescales an jedem Scope verstehen und ausgeben