Simulation Verilog
Verilog est un langage de description de matériel et les concepteurs ne sont pas tenus de simuler leurs conceptions RTL pour pouvoir les convertir en portes logiques. Alors, quel est le besoin de simuler ?
La simulation est une technique consistant à appliquer différents stimulus 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. Cela ressemble également à la façon dont une puce fabriquée sera utilisée dans le monde réel et à la façon dont elle réagit aux différentes entrées.
Par exemple, la conception ci-dessus représente un détecteur de front positif avec des entrées d'horloge et de signal qui sont évaluées à intervalles périodiques pour trouver la sortie pe comme montré. La simulation nous permet de visualiser le chronogramme des signaux associés pour comprendre le comportement réel de la description de conception dans Verilog.
Il existe plusieurs sociétés EDA qui développent des simulateurs capable de déterminer les sorties pour diverses entrées de la conception. Verilog est défini en termes d'événement discret modèle d'exécution 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, qui sera abordé plus tard.
Exemple
Le testbench appelé tb est un conteneur pour contenir un module de conception. Cependant, dans cet exemple, nous n'avons utilisé aucune instance de conception. Il y a deux variables ou signaux auquel on peut attribuer certaines valeurs à des moments précis. clk représente une horloge qui est générée dans le testbench. Ceci est fait par le always
déclaration en alternant la valeur de l'horloge toutes les 5ns. Le initial
Le bloc contient un ensemble d'instructions qui attribuent des valeurs différentes aux deux signaux à des moments différents.
module tb;
reg clk;
reg sig;
// Clock generation
// Process starts at time 0ns and loops after every 5ns
always #5 clk = ~clk;
// Initial block : Process starts at time 0ns
initial begin
// This system task will print out the signal values everytime they change
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Also called stimulus, we simply assign different values to the variables
// after some simulation "delay"
sig = 0;
#5 clk = 0; // Assign clk to 0 at time 5ns
#15 sig = 1; // Assign sig to 1 at time 20ns (#5 + #15)
#20 sig = 0; // Assign sig to 0 at time 40ns (#5 + #15 + #20)
#15 sig = 1; // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Finish simulation at time 85ns
end
endmodule
Le simulateur fournit la sortie suivante après l'exécution du testbench ci-dessus.
Journal de simulationncsim> 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 transférer les signaux de conception et de banc d'essai dans une forme d'onde qui peut être représentée graphiquement pour analyser et déboguer les fonctionnalités de la conception RTL. La forme d'onde ci-dessous est obtenue à partir d'un outil EDA et montre la progression de chaque signal par rapport au temps et est identique au diagramme de synchronisation montré précédemment.
Chaque changement de valeur d'une variable ou d'un net est appelé un événement de mise à jour . Et les processus sont sensibles aux événements de mise à jour de 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 . En raison de la possibilité que plusieurs processus soient évalués arbitrairement, l'ordre des modifications doit être suivi dans quelque chose appelé file d'attente d'événements .
Naturellement, ils sont ordonnés par le temps de simulation. Le placement d'un nouvel événement dans la file d'attente est appelé planification . Le temps de simulation est utilisé pour faire référence à la valeur de temps maintenue par le simulateur pour modéliser le temps réel qu'il faudrait pour que le circuit soit simulé. Les valeurs de temps pour l'exemple ci-dessus sont affichées en nanosecondes ns
dans le chronogramme.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c; // abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule
Actualisez Verilog et voyez un exemple !
Régions dans la file d'attente des événements
La file d'attente d'événements Verilog est logiquement divisée en cinq régions et des événements peuvent être ajoutés à n'importe laquelle d'entre elles. Cependant, il ne peut être supprimé que de la région active.
Événements | Description |
---|---|
Actif | Se produisent au moment de la simulation actuelle et peuvent être traités dans n'importe quel ordre |
Inactif | Se produit au moment de la simulation en cours, mais est traité une fois que tous les événements actifs sont terminés |
Non bloquant | Évalué à un moment antérieur, mais l'affectation est effectuée dans le temps de simulation actuel après la fin des événements actifs et inactifs |
Moniteur | Traité après tous les événements actifs, inactifs et non bloquants |
Futur | Se produire à une heure de simulation future |
Un cycle de simulation est l'endroit où tous les événements actifs sont traités. La norme garantit un certain ordre de programmation à l'exception de quelques cas et. Par exemple, les instructions à l'intérieur d'un bloc début-fin 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 // Statements are executed one after the other at appropriate simulation times
a = 5; // At time 0ns, a is assigned 5
b = 2; // In the same simulation step (time 0ns), b is assigned 2
#10 a = 7; // When simulation advances to 10ns, a is assigned 7
end
endmodule
La file d'attente des événements définit cette affectation à b devrait se produire après l'affectation à a .
Verilog