Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Maîtriser les entrées/sorties de fichiers en Verilog : Ouvrir, Lire, Écrire et Fermer

Verilog propose des tâches et fonctions système permettant d'ouvrir des fichiers, d'y écrire des valeurs, de lire des valeurs depuis des fichiers pour les charger dans des variables, et de fermer les fichiers.

Ouverture et fermeture de fichiers

module tb;
  // Déclaration d'une variable pour stocker le gestionnaire de fichier
  integer fd;
  initial begin
    // Ouvre un nouveau fichier nommé "my_file.txt"
    // avec des permissions d'écriture, et stocke le pointeur
    // du gestionnaire de fichier dans la variable "fd"
    fd = $fopen("my_file.txt", "w");
    // Ferme le gestionnaire de fichier pointé par "fd"
    $fclose(fd);
  end
endmodule

Modes d'ouverture de fichiers

Argument Description
"r" ou "rb" Ouvre en lecture
"w" ou "wb" Crée un nouveau fichier pour l'écriture. Si le fichier existe, le tronque à zéro et l'écrase
"a" ou "ab" Si le fichier existe, ajoute (ouvre en écriture à la fin), sinon crée un nouveau fichier
"r+", "r+b" ou "rb+" Ouvre pour la lecture et l'écriture
"w+", "w+b" ou "wb+" Tronque ou crée pour mise à jour
"a+", "a+b" ou "ab+" Ajoute, ou crée un nouveau fichier pour mise à jour à la fin

Comment écrire dans des fichiers

Fonction Description
$fdisplay Similaire à $display, mais écrit dans un fichier
$fwrite Similaire à $write, mais écrit dans un fichier
$fstrobe Similaire à $strobe, mais écrit dans un fichier
$fmonitor Similaire à $monitor, mais écrit dans un fichier

Chacune de ces fonctions système affiche les valeurs en radix décimal par défaut. Elles possèdent également trois variantes pour afficher en binaire, octal et hexadécimal.

Fonction Description
$fdisplay() Affiche en décimal par défaut
$fdisplayb() Affiche en binaire
$fdisplayo() Affiche en octal
$fdisplayh() Affiche en hexadécimal
module tb;
  integer fd;
  integer i;
  reg [7:0] my_var;
  initial begin
    // Crée un nouveau fichier
    fd = $fopen("my_file.txt", "w");
    my_var = 0;
    $fdisplay(fd, "Valeur affichée avec $fdisplay");
    #10 my_var = 8'h1A;
    $fdisplay(fd, my_var);      // Affiche en décimal
    $fdisplayb(fd, my_var);     // Affiche en binaire
    $fdisplayo(fd, my_var);     // Affiche en octal
    $fdisplayh(fd, my_var);     // Affiche en hexadécimal
    // $fwrite n'ajoute pas automatiquement le caractère de nouvelle ligne '\n'
    // à la fin de chaque ligne ; toutes les valeurs ci-dessous apparaîtront
    // donc sur la même ligne
    $fdisplay(fd, "Valeur affichée avec $fwrite");
    #10 my_var = 8'h2B;
    $fwrite(fd, my_var);
    $fwriteb(fd, my_var);
    $fwriteo(fd, my_var);
    $fwriteh(fd, my_var);
    // Passe à la ligne avec '\n', et affiche avec strobe qui prend
    // la valeur finale de la variable après les affectations non bloquantes
    $fdisplay(fd, " Valeur affichée avec $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, "Valeur affichée avec $fmonitor");
    $fmonitor(fd, my_var);
    for(i = 0; i < 5; i = i+1) begin
      #5 my_var <= i;
    end
    #10 $fclose(fd);
  end
endmodule

Journal de simulation

Valeur affichée avec $fdisplay
26
00011010
032
1a
Valeur affichée avec $fwrite
43001010110532b
Valeur affichée avec $fstrobe
60
00111100
074
3c
Valeur affichée avec $fmonitor
60
0
1
2
3
4

Comment lire des fichiers

Lecture d'une ligne

La fonction système $fgets lit les caractères depuis le fichier spécifié par fd dans la variable str jusqu'à ce que str soit remplie, qu'un caractère de nouvelle ligne soit lu et transféré dans str, ou qu'une condition EOF soit rencontrée.

Si une erreur survient pendant la lecture, elle retourne le code zéro ; sinon, elle retourne le nombre de caractères lus.

Détection de la fin de fichier (EOF)

La fonction système $feof retourne une valeur non nulle lorsque EOF est trouvé, et zéro sinon, pour un descripteur de fichier donné en argument.

module tb;
  reg[8*45:1] str;
  integer fd;
  initial begin
    fd = $fopen("my_file.txt", "r");
    // Continue à lire les lignes jusqu'à ce que EOF soit trouvé
    while (! $feof(fd)) begin
      // Récupère la ligne courante dans la variable 'str'
      $fgets(str, fd);
      // Affiche le contenu de la variable
      $display("%0s", str);
    end
    $fclose(fd);
  end
endmodule

Arguments multiples pour $fdisplay

Lorsque plusieurs variables sont données à $fdisplay, il affiche simplement toutes les variables dans l'ordre donné, les unes après les autres, sans espace.

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

Journal de simulation

10111213

Formatage de données dans une chaîne

Le premier argument de la fonction système $sformat est le nom de la variable dans laquelle le résultat est placé. Le second argument est la chaîne de format qui indique comment les arguments suivants doivent être formatés dans une chaîne.

module tb;
  reg [8*19:0] str;
  reg [3:0] a, b;
  initial begin
    a = 4'hA;
    b = 4'hB;
    // Formate 'a' et 'b' dans une chaîne selon le format donné,
    // et stocke le résultat dans la variable 'str'
    $sformat(str, "a=%0d b=0x%0h", a, b);
    $display("%0s", str);
  end
endmodule

Journal de simulation

xcelium> run
a=10 b=0xb
xmsim: *W,RNQUIE: Simulation is complete.

Verilog

  1. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  2. Maîtriser la concaténation Verilog : Guide pratique
  3. Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
  4. Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
  5. Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
  6. Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
  7. Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
  8. Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
  9. Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage