Sémantique de planification Verilog
La conception et le testbench de Verilog ont généralement de nombreuses lignes de code comprenant always
ou initial
blocs, affectations continues et autres instructions procédurales qui deviennent actives à différents moments au cours d'une simulation.
Chaque changement de valeur d'un signal dans le modèle Verilog est considéré comme un événement de mise à jour . Et des processus tels que always
et assign
les blocs sensibles à ces événements de mise à jour sont évalués dans un ordre arbitraire et sont appelés un événement d'évaluation . Étant donné que ces événements peuvent se produire à des moments différents, ils sont mieux gérés et assurés de leur bon ordre d'exécution en les planifiant dans des files d'attente d'événements qui sont classés par temps de simulation.
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
File d'attente des événements
Une étape de simulation peut être segmentée en quatre régions différentes. Une file d'attente d'événements active n'est qu'un ensemble de processus qui doivent s'exécuter à l'heure actuelle, ce qui peut entraîner la planification d'un plus grand nombre de processus dans des files d'attente d'événements actives ou autres. Les événements peuvent être ajoutés à n'importe quelle région, mais toujours supprimés de l'actif région.
- Actif les événements se produisent au moment de la simulation en cours et peuvent être traités dans n'importe quel ordre.
- Inactif les événements se produisent au moment de la simulation en cours, mais sont traités après le traitement de tous les événements actifs
- Attribution non bloquante les événements évalués précédemment seront attribués après le traitement de tous les événements actifs et inactifs.
- Surveiller les événements sont traités une fois que toutes les affectations actives, inactives et non bloquantes ont été effectuées.
Lorsque tous les événements de la file d'attente active pour le pas de temps actuel a été exécuté, le simulateur avance le temps au pas de temps suivant et exécute sa file d'attente active.
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
La simulation commence à l'heure 0 et la première instruction est programmée pour être exécutée lorsque le temps de simulation atteint 1 unité de temps à laquelle elle affecte x et y à 1. Il s'agit de la file d'attente active pour l'heure actuelle qui est de 1 unité de temps. Le simulateur planifie ensuite la prochaine instruction après 1 unité de temps supplémentaire à laquelle z est affecté de 0.
Qu'est-ce qui rend la simulation non déterministe ?
Il peut y avoir des conditions de concurrence pendant la simulation qui finissent par donner des résultats différents pour la même conception et le même banc d'essai. L'une des raisons du comportement non déterministe est que actif les événements peuvent être supprimés de la file d'attente et traités dans n'importe quel ordre.
Verilog