Altifigence Academy

61 / 63 · Concept

Pipeline pouvant s'arrêter et contre-pression

Calculer ready par étage pour éviter pertes, doublons et recalculs pendant arrêts et mouvements simultanés.

Si le récepteur n'est pas toujours disponible

Prérequis : tampon ready/validHandshake Contrat validant le transfert lorsque valid de l'émetteur et ready du récepteur valent 1 au même front. Il définit aussi la conservation des données en attente. En savoir plus d'une place et alignement de pipelinePipeline Structure divisant le calcul en étages séparés par des registres pour traiter plusieurs entrées en recouvrement. Données, valid et commandes doivent rester alignés. En savoir plus.

Ajouter seulement out_ready à un pipeline fixe ne suffit pas. Si le dernier étage plein s'arrête, les précédents ne doivent pas être écrasés. Il faut propager vers l'entrée une contre-pressionContre-pression Le récepteur signale qu'il ne peut temporairement plus accepter de données afin d'arrêter le flux. Les données non transférées doivent être conservées pendant l'arrêt. En savoir plus.

Chaque étage contient une donnée et un valid. Le deuxième peut accepter s'il est vide ou peut transmettre son contenu actuel ; le premier suit la même règle.

r2=¬v2∨out_ready,r1=¬v1∨r2r_2=\neg v_2\lor\mathrm{out\_ready},\qquad r_1=\neg v_1\lor r_2

in_ready=r1. Même si r2=0, un premier étage vide peut accepter une donnée, utilisant mieux l'espace qu'un refus systématique dès que la sortie s'arrête.

Mettre à jour seulement les étages autorisés à avancer

L'exemple calcule y=2(x+1) pour x non signéNon signé Interprétation d'un motif de bits comme entier non négatif. Sur n bits, la plage va de 0 à 2^n−1 et peut différer de l'interprétation signée du même motif. En savoir plus sur huit bits. L'étage 1 stocke x+1 sur neuf bits ; l'étage 2 décale à gauche sur dix bits. Le maximum x=255 donne exactement 512.

SystemVerilog
module stallable_pipeline (
    input  logic       clk, rst,
    input  logic       in_valid,
    output logic       in_ready,
    input  logic [7:0] in_data,
    output logic       out_valid,
    input  logic       out_ready,
    output logic [9:0] out_data
);
    logic v1, v2, r1, r2;
    logic [8:0] d1;
    logic [9:0] d2;
    assign r2 = !v2 || out_ready;
    assign r1 = !v1 || r2;
    assign in_ready  = r1;
    assign out_valid = v2;
    assign out_data  = d2;

    always_ff @(posedge clk) begin
        if (rst) begin
            v1 <= 1'b0;
            v2 <= 1'b0;
        end else begin
            if (r2) begin
                v2 <= v1;
                if (v1) d2 <= {d1, 1'b0};
            end
            if (r1) begin
                v1 <= in_valid;
                if (in_valid) d1 <= {1'b0, in_data} + 9'd1;
            end
        end
    end
endmodule

Avec les affectations non bloquantesAffectation non bloquante Affectation <= du RTL séquentiel : le membre droit est évalué puis la mise à jour planifiée, permettant aux registres du même front de calculer à partir de l'ancien état. En savoir plus, l'étage 2 lit l'ancien d1, pas celui calculé au même front. r1=0 conserve v1,d1 ; r2=0 conserve v2,d2. Conserver valid tout en réécrivant les données serait incorrect.

Suivre deux étages pleins

Supposons A en sortie v2, B intermédiaire en v1 et C attendant en entrée.

out_readyin_readyAction au front
00A,B conservés ; C refusé
00A,B conservés ; C refusé
11A transféré, B avance, C accepté

L'émetteur conserve C et in_valid jusqu'à acceptation. S'il considère C envoyé au premier front bloqué et passe à la suite, C est perdu.

Les colonnes montrent les valeurs avant les fronts montantsFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus. Initialement A est au dernier étage, B au premier et C attend. Après transfert de A et acceptation de C à E2, la sortie vaut B avant E3.

Contre-pression lorsque les deux étages sont pleins
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
edge2345E0 → E1 → E2 → E3
out_ready0.1.
out_valid1...
out_data2..3A → B
in_valid1...
in_ready0.1.
in_data2..3C → D

Vérifier la conservation

Depuis reset, notons Nin les acceptations et Nout les transferts. Aucun transfert n'est compté au front de reset.

Nin−Nout=v1+v2,0≤Nin−Nout≤2N_{\mathrm{in}}-N_{\mathrm{out}}=v_1+v_2,\qquad 0\le N_{\mathrm{in}}-N_{\mathrm{out}}\le2

Un compte correct peut masquer A sorti deux fois et B perdu : vérifiez aussi valeurs et ordre dans une queue de référence. Faites varier indépendamment in_valid et out_ready, avec arrêts longs, débit continu et vidage par reset.

ready est aussi un chemin temporel

Une chaîne d'étages allonge les chemins inverses r2→r1. Retarder ready par un registre peut exiger une place supplémentaire pour les entrées déjà promises pendant ce retard. Ajouter une bascule sans considérer stockage et protocole n'est pas une optimisation temporelle sûre.

Essayez vous-même

Avec v1=0,v2=1,out_ready=0, une entrée in_valid=1 peut-elle être acceptée ? Et une autre au cycle suivant si out_ready reste à 0 ?

Lire l’explication

Au départ r2=0 mais r1=1 : une entrée peut remplir l'étage 1. Après le front, v1=v2=1 donne r1=r2=0, donc aucune entrée supplémentaire. Cette distinction exploite réellement les deux places.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.