Verilog fournit de nombreuses tâches système pouvant manipuler des fichiers. Les tâches système couramment utilisées comprennent principalement :

  • Ouverture/fermeture de fichier : $fopen, $fclose, $ferror
  • Écriture dans un fichier : $fdisplay, $fwrite, $fstrobe, $fmonitor
  • Écriture de chaîne : $sformat, $swrite
  • Lecture de fichier : $fgetc, $fgets, $fscanf, $fread
  • Positionnement dans un fichier : $fseek, $ftell, $feof, $frewind
  • Chargement de mémoire : $readmemh, $readmemb

Lors de l'utilisation de tâches d'opération sur fichiers (en faisant particulièrement attention à $sforamt, $gets, $sscanf, etc.) pour manipuler des fichiers, vous devez déterminer quelle tâche système utiliser en fonction de la nature du fichier et du contenu des variables, et garantir la cohérence des paramètres et des types de variables de lecture/écriture avec le contenu du fichier. Ne confondez pas les types chaîne avec les types multi-radix.

Ouverture/Fermeture de fichier

Tâche systèmeFormat d'appelDescription de la tâche
Ouverture de fichierfd = $fopen("fname", mode) ;fname est le nom du fichier à ouvrir
fd est le descripteur de fichier 32 bits renvoyé
--- Lorsque l'ouverture est correcte, fd est non nul
--- Lorsqu'une erreur se produit à l'ouverture, fd est égal à zéro
mode est utilisé pour spécifier le mode d'ouverture du fichier
Fermeture de fichier$fclose(fd) ;Fermer le fichier correspondant décrit par fd
Erreur de fichiererr = $ferror(fd, str) ;Lorsque le fichier est ouvert normalement :
--- err et str valent tous les deux zéro,
Lorsqu'une erreur se produit lors de l'ouverture du fichier :
--- err renvoie une valeur non nulle pour indiquer une erreur
--- str renvoie une valeur non nulle contenant le type d'erreur
--- La recommandation officielle est que la longueur de str soit de 640 bits

L'exemple de code est le suivant :

Exemple

  //ouvrir/fermer le fichier
   integer fd1, fd2 ;
   integer err1, err2 ;
   reg [320:0] str1, str2 ; //La variable pour le type d'erreur peut aussi être un type de chaîne pris en charge
   initial begin
      //fichier existant
      fd1 = $fopen("./DATA_RD.HEX", "r");    //Ouvrir un fichier existant
      err1 = $ferror(fd1, str1);
      $display("Le descripteur de File1 est : %h.", fd1 );//Valeur non nulle
      $display("Le numéro d'Error1 est : %h.", err1 );  //0
      $display("L'info d'Error2 est : %s.", str1 );    //0
      $fclose(fd1);
      //fichier inexistant
      fd2 = $fopen("../../FILE_NOEXIST.HEX", "r");//Le fichier ouvert n'existe pas
      err2 = $ferror(fd2, str2);
      $display("Le descripteur de File2 est : %h.", fd2 ); //0
      $display("Le numéro d'Error2 est : %h.", err2 );   //Valeur non nulle
      $display("L'info d'Error2 est : %s.", str2 );     //Valeur non nulle
      $fclose(fd2);
   end

Les types de mode d'ouverture de fichier et leurs descriptions sont les suivants :

rOuvrir un fichier texte en lecture seule, autoriser uniquement la lecture des données.
wOuvrir un fichier texte en écriture seule, autoriser uniquement l'écriture des données. Si le fichier existe, le contenu d'origine du fichier sera supprimé. Si le fichier n'existe pas, créer un nouveau fichier.
aOuvrir un fichier texte en mode ajout, et écrire des données à la fin du fichier. Si le fichier n'existe pas, créer un nouveau fichier.
rbOuvrir un fichier binaire en lecture seule, autoriser uniquement la lecture des données.
wbOuvrir ou créer un fichier binaire en écriture seule, autoriser uniquement l'écriture des données.
abOuvrir un fichier binaire en mode ajout, et écrire des données à la fin du fichier.
r+Ouvrir un fichier texte en lecture et en écriture, en autorisant à la fois la lecture et l'écriture.
w+Ouvrir ou créer un fichier texte pour la lecture et l'écriture, permettant à la fois la lecture et l'écriture. Si le fichier existe, le contenu d'origine du fichier sera supprimé. Si le fichier n'existe pas, créer un nouveau fichier.
a+Ouvrir un fichier texte en lecture et écriture, permettant à la fois la lecture et l'écriture. Si le fichier n'existe pas, créer un nouveau fichier. La lecture commence au début du fichier, l'écriture se fait uniquement en mode ajout.
rb+Ouvrir un fichier binaire en lecture et écriture, similaire à "r+".
wb+Ouvrir ou créer un fichier binaire en lecture et écriture, similaire à "w+".
ab+Ouvrir un fichier binaire en lecture et écriture, similaire à "a+".

Écriture de fichiers

Les tâches système pour l'écriture de fichiers comprennent principalement : $fdisplay, $fwrite, $fstrobe, $fmonitor, ainsi que leurs tâches système correspondantes avec des formats intégrés tels que $fdisplayb, $fdisplayh, $fdisplayo, etc.

Format d'appelDescription de la tâche
$fdisplay(fd, arguments) ;Écrire dans le fichier de manière séquentielle ou conditionnelle, avec saut de ligne automatique.
$fwrite(fd, arguments) ;Écrire dans le fichier de manière séquentielle ou conditionnelle, sans saut de ligne automatique.
$fstrobe(fd, arguments) ;Écrire dans le fichier en mode strobe après l'exécution de l'instruction.
$fmonitor(fd, arguments) ;Écrire dans un fichier chaque fois que les données changent.

Par rapport aux tâches d'affichage standard $display, $write, $strobe, $monitor, les tâches système d'écriture dans un fichier nécessitent un descripteur de fichier fd supplémentaire dans le format d'utilisation, mais toutes les autres conditions d'impression et caractéristiques temporelles sont cohérentes avec leurs tâches d'affichage correspondantes.

Un exemple d'écriture dans un fichier en mode ajout est le suivant :

Exemple

  //(2) écrire dans un fichier
   integer fd ;
   integer err, str ;
   initial begin
      fd = $fopen("./DATA_RD.HEX", "a+");  //Ouvrir en mode ajout à la fin
      err = $ferror(fd, str);
      if (!err) begin
         $fdisplay(fd, "Nouvelle donnée1 : %h", fd) ;
         $fdisplay(fd, "Nouvelle donnée2 : %h", str) ;
         $fdisplay(fd, "Nouvelle donnée3 : %h", err) ;
         //$write(fd, "New data3: %h", err) ; //Affiche la dernière ligne sans saut de ligne
      end
      $fclose(fd);
   end

Ouvrez le fichier DATA_RD.HEX, et vous pouvez constater que 3 lignes de données ont été ajoutées à la fin du fichier.

Écriture de chaînes

Verilog fournit également les tâches système $swrite et $sformat pour écrire des données dans des chaînes.

Format d'appelDescription de la tâche
$swrite(reg, list_of_arguments) ;Écrire des chaînes dans une variable reg de manière séquentielle ou conditionnelle.
len = $sformat(reg, format_str, arguments) ;Écrire des chaînes dans une variable reg selon le format format_str.
Le format est conforme à celui spécifié par $display.
Il n'est pas recommandé d'omettre le deuxième paramètre format_str.
Peut renvoyer la longueur de chaîne len.

Le deuxième paramètre de format de $sformat est de type chaîne, et il est généralement recommandé de ne pas l'omettre. Ce paramètre spécifie le type de la variable d'entrée. Lors de la spécification du type, d'autres informations de chaîne peuvent également être incluses. Pour les types et l'utilisation, reportez-vous à la fonction d'affichage $display. Ce paramètre peut également être de type registre, mais les données stockées doivent être des données de chaîne normales.

Un exemple de code pour écrire des chaînes est le suivant :

Exemple

   //(3) écrire une chaîne
   reg [299:0] str_swrite, str_sformat;
   reg [63:0] str_buf ;
   integer    len, age ;
   initial begin
      #20 ;
      str_buf   = "example!" ;
      age       = 9 ;

      //$swrite écrit une chaîne contenant des variables dans un format spécifié
      $swrite(str_swrite, "%s age is %d", str_buf, age) ;
      $display("%s", str_swrite);
      //$swrite écrit directement une chaîne sans variables
      $swrite(str_swrite, "years ", "old.") ;
      $display("%s", str_swrite);
      //$swrite écrit une chaîne contenant des variables sans format spécifié, non recommandé
      $swrite(str_swrite, age) ;
      $display("$swrite test d'erreur : %d", str_swrite);

      $display();
     //$sformat écrit une chaîne contenant des variables dans un format spécifié
      $sformat(str_sformat, "J'ai appris en %s", str_buf) ;
      $display("%s", str_sformat);
      //$sformat écrit directement une chaîne sans variables et obtient la longueur de la chaîne
      len = $sformat(str_sformat, "pendant 4 ans !") ;
      $display("%s", str_sformat);
      $display("$sformat longueur : %d", len);
      //$sformat écrit directement plusieurs chaînes sans variables en une seule fois, non recommandé
      $sformat(str_sformat, "pendant", "4", "ans !") ;
      $display("$sformat test d'erreur : %s", str_sformat);
   end

En ignorant les espaces dans les informations imprimées, la sortie de débogage est la suivante :

À partir de cela, nous pouvons voir que $sformat et $swrite peuvent être utilisés de la même manière. Par exemple, $sformat peut écrire une chaîne dans un format spécifié, ou écrire une chaîne sans variables une seule fois. Dans ce cas, $sformat équivaut à ne pas spécifier le type de variable dans le deuxième paramètre, donc le troisième paramètre doit être omis.

$swrite peut également écrire plusieurs chaînes sans variables en une seule fois, alors que $sformat ne permet pas un tel appel.

Il est également recommandé de spécifier le type de variable lors de l'utilisation de $swrite pour écrire des chaînes contenant des variables ; sinon, le résultat peut être imprévisible.

Lecture de fichier

Tâche systèmeFormat d'appel et description 
Lire le fichier caractère par caractèrec = $fgetc( fd ) ; 
 Sortir les données de fd vers la variable c au format caractère ; c doit avoir une largeur d'au moins 8 bits.
Lorsqu'une erreur de lecture se produit, c est égal à EOF(-1) ; vous pouvez utiliser $ferror pour vérifier le type d'erreur.
 
Écrire un caractère dans le tamponcode = $ungetc(c, fd ) ; 
 Écrire le caractère c dans le tampon du fichier fd.
La valeur de c est renvoyée lors du prochain appel à $fgetc ; le contenu du fichier fd lui-même ne change pas.
Lors d'une écriture normale dans le tampon, le code de valeur de retour est 0 ; lorsqu'une erreur se produit, le code de valeur de retour est EOF.
 
Lire un fichier ligne par lignecode = $fgets(str, fd) 
 Lire des caractères en continu jusqu'à ce que la variable str soit remplie, ou qu'une ligne soit lue complètement, ou que la fin du fichier soit atteinte.
Lors d'une lecture normale, le code de valeur de retour est le nombre de lignes (fois) lues ; lorsqu'une erreur se produit, le code est 0.
 
Lire un fichier selon un formatcode = $fscanf(fd, format, args) ; 
 Lire les données du fichier fd dans la variable args selon le format format.
Pour le format, reportez-vous à la description du format de $display.
La condition d'arrêt pour une lecture est un espace ou un saut de ligne.
Lorsqu'une erreur de lecture se produit, le code de valeur de retour est 0.
 
Lire une chaîne selon un formatcode = $sscanf(str, format, args) ; 
 Lire la variable de type chaîne str dans la variable args selon le format format.
dans la variable data_get, le contenu de data_get sera anormal.
 
Lire le fichier en binaire.code = $fread(store, fd, start, count) ; 
 Lire les données du fichier fd dans un tableau ou dans la variable de registre store au format de flux de données binaires.
start est l'adresse de début du fichier, et count est la longueur de lecture.
Si start/count ne sont pas spécifiés, toutes les données seront remplies dans la variable store.
Si store est de type registre, les paramètres start/count sont invalides. La lecture s'arrête après que la variable store a été remplie une fois avec des données.
 
En utilisant le fichier DATA_RD.HEX de la simulation "file write" comme fichier de référence pour la lecture, à titre d'exemple. Le contenu du fichier est le suivant.
c0dec0de
5555aaaa
12345678
aaaa5555
New data1: 80000003
New data2: 00000000
New data3: 00000000

Exemples d'appels de $fgetc et $ungetc

Exemple

   //(4.1) lire un caractère
   entier      i ;
   reg [31:0]   char_buf ;
   initial begin
      #30 ;
      fd = $fopen("DATA_RD.HEX", "r");
      $write("Read char: ");
      err = $ferror(fd, str);
      if (!err) begin
         for (i=0; i<13; i++) begin
            char_buf[7:0] = $fgetc(fd) ;  //Lire caractère par caractère
            $write("%c", char_buf[7:0]) ; //Afficher les caractères un par un sans saut de ligne
         end
         $write(".\n") ;
      end

      $ungetc("1", fd) ;            //Écrire dans le tampon du fichier 3 fois consécutivement
      $ungetc("2", fd) ;
      $ungetc("3", fd) ;
      char_buf[7:0]   = $fgetc(fd) ;  //lire 3
      char_buf[15:8]  = $fgetc(fd) ;  //lire 2
      char_buf[23:16] = $fgetc(fd) ;  //lire 1,fin du tampon de lecture
      char_buf[31:24] = $fgetc(fd) ;  //lire a
      $display("Lire le caractère après $ungetc : %s", char_buf);
      $fclose(fd);
   end

Les résultats de la simulation sont les suivants.

Comme le montre la figure, les 13 caractères lus par $fgetc sont corrects, et les caractères lus comprennent des caractères de saut de ligne.

Une fois que $ungetc a écrit des données de caractères dans le tampon de fichier, $fgetc peut ensuite être utilisé pour lire les données de caractères dans le tampon de fichier. La lecture/écriture suit le principe premier entré, dernier sorti (FILO, First in Last out), ce qui équivaut à empiler sur une pile. Lorsque les données de caractères "123" sont écrites en premier, les données lues sont "321".

Une fois que le tampon de fichier a été entièrement lu, lorsque la lecture des données de caractères est effectuée à nouveau, les données lues suivent toujours la position de la dernière lecture de fichier, c'est-à-dire le caractère "a" dans "a123" dans le journal.

Pendant ce processus, le contenu du fichier DATA_RD.HEX n'a jamais changé.

Exemple d'appel de $fgets

Exemple

   //(4.2) lire la ligne
   integer      code ;
   reg [99:0]   line_buf [9:0] ;
   initial begin
      #31 ;
      fd = $fopen("DATA_RD.HEX", "r");
      err = $ferror(fd, str);
      if (!err) begin
         for (i=0; i<6; i++) begin  //Lire ligne par ligne au format chaîne
            code = $fgets(line_buf[i], fd) ;  //Contient "\n" à la fin, donc 2 lignes seront imprimées
            $display("Obtenir les données de ligne%d: %s", i, line_buf[i]) ;
         end
      end
      //L'affichage hexadécimal montrera les caractères de code ASCII correspondants
      $display("Afficher les données de ligne en hexadécimal%d: %h", 2, line_buf[2]) ;
      $display("Afficher les données de ligne en hexadécimal%d: %h", 4, line_buf[4]) ;
      $fclose(fd) ;
   end

Les résultats de la simulation sont les suivants.

Les 4 premières lignes de données sont lues et affichées en tant que type chaîne, et les résultats sont normaux.

Lors de la lecture de la 5ème ligne du fichier, en raison de la limite de largeur de 100 bits de la variable line_buf, le contenu du fichier "New data1: 80000003 " doit être lu en 2 opérations distinctes.

Parce que chaque ligne se termine par un caractère de nouvelle ligne "\n", une ligne vide supplémentaire sera imprimée lors de l'utilisation de la fonction $display.

Lors de la lecture en tant que type chaîne et de l'affichage des données en hexadécimal, le contenu de données correspondant du fichier ne peut pas être affiché de manière intuitive. Par exemple, la deuxième ligne n'affiche pas "12345678," mais plutôt son code ASCII correspondant. Par conséquent, la tâche $fgets lit selon le type chaîne ; cela nécessite une attention particulière.

Exemples d'appels à $fscanf et $sscanf

Exemple

   //(4.3) $fscanf/$sscanf
   reg [31:0]   data_buf [9:0] ;
   reg [63:0]   string_buf [9:0] ;
   reg [31:0]   data_get ;
   reg [63:0]   data_test ;
   initial begin
      #32 ;
      fd = $fopen("DATA_RD.HEX", "r");
      err = $ferror(fd, str);
      if (!err) begin
         for (i=0; i<4; i++) begin
            //Lire et afficher les 4 premières lignes de données en hexadécimal
            code = $fscanf(fd, "%h", data_buf[i]);
            $display("$fscanf a lu les données%d: %h", i, data_buf[i]) ;
         end
         for (i=4; i<6; i++) begin
            //Lire et afficher les 2 dernières lignes de données en tant que type chaîne
            code = $fscanf(fd, "%s", string_buf[i]);
            $display("$fscanf a lu les données%d: %s", i, string_buf[i]) ;
         end
      end

      //(1) $sscanf la variable source data_test est de type chaîne
      data_test = "fedcba98" ;
      code = $sscanf(data_test, "%h", data_get);
      $display("$sscanf a lu les données0: %h", data_get) ;
      //(2) $sscanf: d'abord convertir la variable source data_test en une variable de type chaîne
      code = $sformat(data_test, "%h", data_buf[2]);
      code = $sscanf(data_test, "%h", data_get);
      //Il n'est pas recommandé de saisir directement une variable hexadécimale
      //code = $sscanf(data_buf[2], "%h", data_get);
      $display("$sscanf a lu les données0: %h", data_get) ;
      $fclose(fd) ;
   end

Les résultats de la simulation sont les suivants.

L'utilisation de $fscanf pour lire et afficher les 4 premières lignes du fichier en hexadécimal et les 2 dernières lignes en tant que type chaîne, tous les résultats sont normaux.

Lors de l'utilisation de $sscanf pour lire le contenu d'un registre source puis le déplacer vers un registre de destination, le contenu du registre source doit être une donnée de type chaîne.

Par exemple, lors de l'utilisation de $sscanf pour déplacer les données hexadécimales data_buf

Si $sscanf est utilisé directement pour déplacer les données data_buf au format hexadécimal

Juste une astuce secrète : les registres peuvent être directement assignés entre eux !!!

Exemple d'appel de $fread

Exemple

   //(4.4) $fread
   reg [71:0]   bin_buf [3:0] ; //Chaque ligne contient 8 éléments de données de type mot et 1 caractère de retour à la ligne
   reg [143:0]  bin_reg ;
   initial begin
      #40 ;
      fd = $fopen("DATA_RD.HEX", "r");
      err = $ferror(fd, str);
      if (!err) begin
         code = $fread(bin_buf, fd, 0, 4); //Lecture de type tableau, lire 4 fois
         $display("$fread read data %h", bin_buf[0]) ;//Affichage hexadécimal
         $display("$fread read data %h", bin_buf[1]) ;
         $display("$fread read data %s", bin_buf[2]) ;//Affichage de chaîne
         $display("$fread read data %s", bin_buf[3]) ;
      end

      fd = $fopen("DATA_RD.HEX", "r");
      code = $fread(bin_reg, fd); //Lecture d'un seul registre
      $display("$fread read data %h", bin_reg) ;
      $fclose(fd) ;
   end

Les résultats de la simulation sont les suivants.

Lorsque $fread lit un fichier en binaire, l'adresse de début et la longueur de lecture sont tous deux des paramètres pour définir des variables de type tableau.

Si le type de variable qui stocke les données est un type reg non tableau, une seule lecture sera effectuée jusqu'à ce que la variable de type reg soit entièrement remplie.

Positionnement dans le fichier

Tâches systèmeFormat d’appelDescription de la tâche
Obtenir la position dans le fichierpos = $ftell( fd ) ;Renvoie le décalage de la position actuelle du fichier par rapport au début du fichier ; l'adresse initiale est 0.
Le décalage est mesuré en octets comme une unité (8 bits).
Utilisé avec $fseek.
Repositionnementcode = $fseek(fd, offset, type) ;Définit la position de la prochaine entrée ou sortie du fichier.
offset est la valeur de décalage définie.
type est le type d'opération du décalage.
--- 0 : Définit la position à l'adresse de décalage.
--- 1 : Définit la position à la position actuelle plus le décalage.
--- 2 : Définit la position à la fin du fichier plus le décalage. Des nombres négatifs sont souvent utilisés pour représenter un décalage vers l'arrière depuis la fin du fichier.
Repositionnement sans décalagecode = $rewind( fd ) ;Équivalent à $fseek( fd, 0, 0);
Déterminer la fin du fichiercode = $feof(fd) ;Déterminer si la fin du fichier a été atteinte.
Renvoie 1 lorsque la fin du fichier est détectée ; sinon, renvoie 0.

Le contenu du fichier DATA_RD.HEX peut être représenté comme suit.

Avec le caractère de nouvelle ligne "\n" comme terminateur, la taille du fichier est : 4x9 + 3x20 = 96 octets.

Le code de test de positionnement dans le fichier est le suivant :

Exemple

   // position dans le fichier
   reg [31:0]   data4 ;      //La longueur de la variable de registre est de 4 octets
   reg [199:0]  str_long ;
   integer      pos ;
   initial begin
      #40 ;
      fd = $fopen("DATA_RD.HEX", "r");
      err = $ferror(fd, str);
      if (!err) begin
         //première lecture
         code = $fscanf(fd, "%h", data4);//Commencer la lecture à partir de la position 0
         pos  = $ftell(fd);      //Après lecture de 8 octets, la position est 8, les coordonnées sont (0,8)
         $display("Position après lecture : %d", pos) ;
         $display("Données de la 1re lecture : %h", data4) ;

         //type = 0
         code = $fseek(fd, 4, 0) ; //Commencer la lecture à partir de la position 4, coordonnées (0,4)
         code = $fscanf(fd, "%h", data4); //Arrêter lorsqu'un caractère de nouvelle ligne est lu
         pos  = $ftell(fd);      //Après lecture de 4 octets, la position est 8, les coordonnées sont (0,8)
         $display("type 0 : position actuelle : %d", pos) ;
         $display("type 0 : données lues : %h", data4) ;
         //type = 1
         code = $fseek(fd, 4, 1) ; //Commencer la lecture à partir de la position 4+9=12, aux coordonnées (1,3)
         code = $fscanf(fd, "%h", data4); //Arrêter lorsqu'un caractère de nouvelle ligne est lu
         pos  = $ftell(fd);      //Après lecture de 5 octets, la position est 17, les coordonnées sont (1,8)
         $display("type 1 : position actuelle : %d", pos) ;
         $display("type 1 : données lues : %h", data4) ;
         //type = 2
         code = $fseek(fd, -(96-31), 2) ; //Commencer la lecture à partir de la position 31, coordonnées (3,4)
         code = $fscanf(fd, "%h", data4);
         pos  = $ftell(fd);      //Après lecture de 4 octets, la position est 35, les coordonnées sont (3,8)
         $display("type 2 : position actuelle : %d", pos) ;
         $display("type 2 : données lues : %h", data4) ;

         //lecture après rembobinage
         code   = $rewind(fd) ;//Réinitialiser la position du pointeur de fichier au début du fichier
         pos    = $ftell(fd);  //La position est 0 à ce stade
         $display("Position après $rewind : %d", pos) ;
         //lire tout le contenu du fichier
         while (!$feof(fd)) begin
            code   = $fgets(str_long, fd);
            $write("Lu : %s", str_long) ;
         end
         $fclose(fd) ;
      end
   end

Les résultats de la simulation sont les suivants.

Comme on peut le voir sur la figure, une ligne de données supplémentaire est imprimée à la fin du journal. Cela est dû au fait qu'il reste une ligne vide à la fin du fichier DATA_RD.TXT (le résultat d'une opération de retour à la ligne). La tâche système $feof ne considère pas cette ligne vide comme la fin du fichier, donc la valeur de retour est toujours 0. Cependant, cette ligne ne contient en réalité aucune donnée, donc les données lues sont incontrôlables.

Pour éliminer l'influence du caractère de retour à la ligne dans la dernière ligne de données du fichier, la dernière tâche système d'écriture de fichier $fdisplay dans l'exemple « écriture de fichier » peut être remplacée par $write.

Le reste du journal, combiné aux commentaires du code, montre que la simulation est correcte, donc aucune explication unifiée n'est donnée ici.

Chargement de la mémoire

Tâches systèmeFormat d'appel et description 
Charger un fichier hexadécimal$readmemh("fname", mem, start_addr, finish_addr) 
 fname est le nom du fichier de données.
mem est une variable de type tableau/mémoire.
start_addr et finish_addr sont respectivement l'adresse de début et l'adresse de fin.
start_addr et finish_addr peuvent être omis. Dans ce cas, la condition d'arrêt du chargement des données est que la variable mémoire mem soit entièrement remplie, ou que le fichier ait été entièrement lu.
Le contenu du fichier ne doit contenir que des caractères d'espacement (ou des caractères de saut de ligne/espace), des données binaires ou hexadécimales.
Les commentaires sont marqués par "//". Il est recommandé d'utiliser des caractères de saut de ligne pour séparer les données.
 
Charger un fichier binaire$readmemb("fname", mem, start_addr, finish_addr) 
 Le format d'utilisation est le même que celui de $readmemb. 

Le contenu du fichier DATA_WITHNOTE.HEX est le suivant. Chargez le contenu de ce fichier dans une variable mémoire.

Le code d'exemple est le suivant :

Exemple

   //6 charger mem
   reg [31:0]   mem_load [3:0] ;
   initial begin
      #50 ;
      $readmemh("./DATA_WITHNOTE.HEX", mem_load);
      $display("Lecture mémoire1 : %h", mem_load[0]) ;
      $display("Lecture mémoire2 : %h", mem_load[1]) ;
      $display("Lecture mémoire3 : %h", mem_load[2]) ;
      $display("Lecture mémoire4 : %h", mem_load[3]) ;
   end

Les résultats de simulation sont les suivants :

Télécharger le code source de ce chapitre

Téléchargement