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.

//Délai ordinaire, le résultat de A&B est assigné à Z avec un délai de 10 unités de temps
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

module time_delay_module(
    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

`timescale 1ns/1ns

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