Menu
CoddyTech

Bloc initial

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 47 sur 90.

Verilog possède deux blocs procéduraux : initial (s’exécute une fois) et always (s’exécute en continu). Voyons maintenant le bloc initial.

Qu’est-ce qu’un bloc initial ?

Le bloc initial s’exécute une seule fois au début de la simulation (à l’instant 0). Lorsqu’il se termine, il ne s’exécute plus.

Il est principalement utilisé dans les bancs de test pour :

  • Définir les valeurs initiales
  • Générer des signaux de test
  • Afficher des messages
  • Démarrer la simulation

Syntaxe

initial begin
  // Les instructions s’exécutent une seule fois, dans l’ordre
end

Exemple de base

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

Résultat :

Simulation started
This runs once

Utiliser un bloc initial pour les signaux de test

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

Cela modifie a aux instants 0, 10 et 20.

Initial vs Always

 initialalways
S’exécuteUne foisEn continu (indéfiniment)
À utiliser pourBancs de test, initialisationMatériel (bascules, compteurs)
Synthétisable ?Uniquement pour les valeurs de départ (FPGA)Oui (avec une liste de sensibilité)

Remarques importantes

  • Les blocs initial servent principalement à la simulation. Les outils de synthèse ne peuvent pas convertir des délais comme #10 ou des tâches comme $display en matériel
  • Utilisez initial principalement dans les bancs de test. Dans un module de conception, seuls les outils de synthèse FPGA l'utilisent, et uniquement pour définir la valeur initiale d'un registre ou d'une mémoire
  • Si le banc de test contient une horloge à fonctionnement continu (par exemple, always #5 clk = ~clk;), la simulation s'exécute indéfiniment, à moins que vous n'appeliez $finish ; avec un bloc initial uniquement, le simulateur s'arrête de lui-même lorsqu'il ne reste plus d'événements, mais l'ajout de $finish reste une bonne pratique
challenge icon

Défi

Ajoute le bloc initial manquant qui définit a à 0, puis définit a à 1 après 10 unités de temps.

Que faire :

  1. Ajoute initial begin et end
  2. Définis a = 0
  3. Attends #10
  4. Définis a = 1
  5. Ajoute $finish pour terminer la simulation

Essayez vous-même

module test;
  reg a;
  
  // TODO: Ajoutez un bloc initial ici
  // Définissez a = 0
  // Attendez #10
  // Définissez a = 1
  // Ajoutez $finish; pour terminer la simulation
  
endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne