Techniques de Simulation Verilog pour une Vérification RTL Fiable
Verilog est un langage de description matériel et il n'y a aucune exigence pour les concepteurs de simuler leurs conceptions RTL pour pouvoir les convertir en portes logiques. Alors quel est le besoin de simuler ?
La simulation est une technique d'application de différents stimuli d'entrée à la conception à différents moments pour vérifier si le code RTL se comporte de la manière prévue. Essentiellement, la simulation est une technique bien suivie pour vérifier la robustesse de la conception. C'est aussi similaire à la façon dont une puce fabriquée sera utilisée dans le monde réel et comment elle réagit à différentes entrées.
Par exemple, la conception ci-dessus représente un détecteur de front montant avec les entrées horloge et signal qui sont évaluées à intervalles périodiques pour trouver la sortie pe comme montré. La simulation nous permet de visualiser le diagramme de timing des signaux liés pour comprendre comment la description de conception en Verilog se comporte réellement.
Il y a plusieurs entreprises EDA qui développent des simulateurs capables de déterminer les sorties pour diverses entrées de la conception. Verilog est défini en termes d'un modèle d'exécution à événements discrets et différents simulateurs sont libres d'utiliser différents algorithmes pour fournir à l'utilisateur un ensemble cohérent de résultats. Le code Verilog est divisé en plusieurs processus et threads et peut être évalué à différents moments au cours d'une simulation, ce qui sera abordé plus tard.
Exemple
Le banc de test appelé tb est un conteneur pour contenir un module de conception. Cependant, dans cet exemple nous n'avons pas utilisé d'instances de conception. Il y a deux variables ou signaux qui peuvent se voir assigner certaines valeurs à des moments spécifiques. clk représente une horloge qui est générée dans le banc de test. Cela est fait par l'instruction always en alternant la valeur de l'horloge après chaque 5ns. Le bloc initial contient un ensemble d'instructions qui assignent différentes valeurs aux deux signaux à différents moments.
module tb;
reg clk;
reg sig;
// Génération d'horloge
// Le processus commence à 0ns et boucle après chaque 5ns
always #5 clk = ~clk;
// Bloc initial : Le processus commence à 0ns
initial begin
// Cette tâche système affichera les valeurs des signaux chaque fois qu'elles changent
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Aussi appelé stimulus, nous assignons simplement différentes valeurs aux variables
// après un certain "délai" de simulation
sig = 0;
#5 clk = 0; // Assigner clk à 0 au temps 5ns
#15 sig = 1; // Assigner sig à 1 au temps 20ns (#5 + #15)
#20 sig = 0; // Assigner sig à 0 au temps 40ns (#5 + #15 + #20)
#15 sig = 1; // Assigner sig à 1 au temps 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Assigner sig à 0 au temps 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Finir la simulation au temps 85ns
end
endmodule
Le simulateur fournit la sortie suivante après l'exécution du banc de test ci-dessus.
Journal de Simulation
ncsim> run Time = 0 clk = x sig = 0 Time = 5 clk = 0 sig = 0 Time = 10 clk = 1 sig = 0 Time = 15 clk = 0 sig = 0 Time = 20 clk = 1 sig = 1 Time = 25 clk = 0 sig = 1 Time = 30 clk = 1 sig = 1 Time = 35 clk = 0 sig = 1 Time = 40 clk = 1 sig = 0 Time = 45 clk = 0 sig = 0 Time = 50 clk = 1 sig = 0 Time = 55 clk = 0 sig = 1 Time = 60 clk = 1 sig = 1 Time = 65 clk = 0 sig = 0 Time = 70 clk = 1 sig = 0 Time = 75 clk = 0 sig = 0 Time = 80 clk = 1 sig = 0 Simulation complete via $finish(1) at time 85 NS + 0
Qu'est-ce qu'une forme d'onde de simulation ?
Les simulations nous permettent de vider les signaux de conception et de banc de test dans une forme d'onde qui peut être représentée graphiquement pour analyser et déboguer la fonctionnalité de la conception RTL. La forme d'onde montrée ci-dessous est obtenue à partir d'un outil EDA et montre la progression de chaque signal par rapport au temps et est la même que le diagramme de timing montré avant.
Chaque changement dans la valeur d'une variable ou net est appelé un événement de mise à jour. Et les processus sont sensibles aux événements de mise à jour de telle sorte que ces processus sont évalués chaque fois que l'événement de mise à jour se produit et est appelé un événement d'évaluation. À cause de la possibilité d'avoir plusieurs processus évalués arbitrairement, l'ordre des changements doit être suivi dans quelque chose appelé file d'événements.
Naturellement, ils sont ordonnés par le temps de simulation. Le placement d'un nouvel événement sur la file est appelé planification. Le temps de simulation est utilisé pour se référer à la valeur de temps maintenue par le simulateur pour modéliser le temps réel que prendrait le circuit simulé. Les valeurs de temps pour l'exemple ci-dessus sont montrées en nanosecondes ns dans le diagramme de timing.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c;
// abc est mis à jour via l'instruction assign (processus) chaque fois que a, b ou c changent -> événement de mise à jour
endmodule
Actualiser Verilog et voir un exemple !
Régions dans la File d'Événements
La file d'événements Verilog est logiquement divisée en cinq régions, et les événements peuvent être ajoutés à n'importe laquelle d'entre elles. Cependant, ils ne peuvent être retirés que de la région active.
| Événements | Description |
|---|---|
| Active | Se produisent au temps de simulation courant, et peuvent être traités dans n'importe quel ordre |
| Inactive | Se produisent au temps de simulation courant, mais sont traités après que tous les événements actifs sont faits |
| Nonblocking | Évalués à un moment précédent, mais l'affectation est faite au temps de simulation courant après que les événements actifs et inactifs sont faits |
| Monitor | Traités après que tous les événements actifs, inactifs et non-bloquants sont faits |
| Future | Se produisent à un futur temps de simulation |
Un cycle de simulation est où tous les événements actifs sont traités. La norme garantit un certain ordre de planification sauf pour quelques cas. Par exemple, les instructions à l'intérieur d'un bloc begin-end ne seront exécutées que dans l'ordre dans lequel elles apparaissent.
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin
// Les instructions sont exécutées les unes après les autres aux temps de simulation appropriés
a = 5; // Au temps 0ns, a est assigné 5
b = 2; // Dans la même étape de simulation (temps 0ns), b est assigné 2
#10 a = 7; // Quand la simulation avance à 10ns, a est assigné 7
end
endmodule
La file d'événements définit que l'affectation à b doit se produire après l'affectation à a.
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Verilog `ifdef : Compilation Conditionnelle Expliquée
- Comprendre la Sémantique d'Ordonnancement Verilog : Timing, Événements et Ordre d'Exécution
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation