Mots-clés : délai, délai inertiel
Le délai dans l'instruction de délai d'affectation continue est utilisé pour contrôler le délai entre le moment où un opérande change et le moment où le côté gauche de l'instruction reçoit une nouvelle valeur.
Les délais ne sont généralement pas synthétisables.
Les délais de registre peuvent également être contrôlés ; cela est expliqué dans la section de contrôle temporel.
Les délais d'affectation continue peuvent généralement être divisés en délai d'affectation ordinaire, délai implicite et délai de déclaration.
Les 3 exemples suivants sont fonctionnellement équivalents, correspondant à trois façons différentes d'écrire des délais d'affectation continue.
wire Z, A, B ;
assign #10 Z = A & B ;
//Délai implicite, lors de la déclaration d'une variable wire, effectuer une affectation continue vers celle-ci avec un certain délai.
wire A, B;
wire #10 Z = A & B;
//Délai de déclaration, lors de la déclaration d'une variable wire, un délai est spécifié. Par conséquent, toutes les affectations continues vers cette variable seront différées jusqu'au moment spécifié. Sauf en modélisation au niveau des portes, cette méthode de modélisation n'est généralement pas recommandée.
wire A, B;
wire #10 Z ;
assign Z =A & B
Délai inertiel
Dans l'exemple ci-dessus, si A ou B change, il y aura un délai de 10 unités de temps avant que Z n'obtienne une nouvelle valeur. Si, pendant ces 10 unités de temps, c'est-à-dire avant que Z n'obtienne une nouvelle valeur, A ou B change à nouveau, alors la nouvelle valeur actuelle de A ou de B sera utilisée lors du calcul de la nouvelle valeur de Z. C'est pourquoi on l'appelle délai inertiel, ce qui signifie que si la largeur d'impulsion du signal est inférieure au délai, elle n'a aucun effet sur la sortie.
Par conséquent, lors de la simulation, le délai doit être défini raisonnablement afin d'éviter que certains signaux ne puissent pas être retardés efficacement.
Effectuer une simulation de délai sur une logique de porte ET avec délai.
Exemple
input ai, bi,
output so_lose, so_get, so_normal);
assign #20 so_lose = ai & bi ;
assign #5 so_get = ai & bi ;
assign so_normal = ai & bi ;
endmodule
La référence du banc de test est la suivante :
Exemple
module test ;
reg ai, bi ;
wire so_lose, so_get, so_normal ;
initial begin
ai = 0 ;
#25 ; ai = 1 ;
#35 ; ai = 0 ; //60ns
#40 ; ai = 1 ; //100ns
#10 ; ai = 0 ; //110ns
end
initial begin
bi = 1 ;
#70 ; bi = 0 ;
#20 ; bi = 1 ;
end
time_delay_module u_wire_delay(
.ai (ai),
.bi (bi),
.so_lose (so_lose),
.so_get (so_get),
.so_normal (so_normal));
initial begin
forever begin
#100;
//$display("---gyc---%d", $time);
if ($time >= 1000) begin
$finish ;
end
end
end
endmodule
Les résultats de simulation sont les suivants :
Le signal so_normal correspond à une logique ET normale.
Comme tous les délais sont supérieurs à 5ns, le résultat du signal so_get est l'opération ET retardée de 5ns.
La première partie du signal so_lose est le résultat de l'opération ET retardée de 20ns.
Comme la deuxième durée à niveau haut du signal ai est inférieure à 20ns, le signal so_lose manquera la détection de délai de cette impulsion en raison du délai inertiel, donc la dernière partie du signal so_lose est encore à 0.

Téléchargement du code source
Téléchargement