Altifigence Academy

31 / 37 · Concept

Pipeline multiplication-addition et alignement des données

Découper les opérations par registres et aligner données, valid et opérandes auxiliaires par transaction.

De l'expression à deux étages

Prérequis : arithmétique signée, 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, setupSetup Durée minimale de stabilité de la donnée avant le front de capture. En cas de violation, le résultat mémorisé n'est pas garanti. En savoir plus et valid.

Chaque transaction contient a,b signés sur huit bits et c signé sur seize bits, avec le résultat suivant. C'est une multiplication-addition indépendante par transaction, pas un accumulateur.

y=a×b+cy=a\times b+c

Le produit exact huit bits nécessite seize bits. Ajouter c sur seize bits puis élargir ne récupère pas le bit haut perdu : étendez d'abord les deux opérandes avec leur signe sur dix-sept bits.

Le premier étage stocke ensemble produit et c ; le second les additionne pour la même transaction. Sans retard de c, le produit précédent serait mélangé au c actuel.

SystemVerilog
module multiply_add_pipeline (
    input  logic               clk, rst, in_valid,
    input  logic signed [7:0]  a, b,
    input  logic signed [15:0] c,
    output logic               out_valid,
    output logic signed [16:0] y
);
    logic v1;
    logic signed [15:0] p1, c1;
    logic signed [16:0] p_ext, c_ext;
    assign p_ext = {p1[15], p1};
    assign c_ext = {c1[15], c1};

    always_ff @(posedge clk) begin
        if (rst) begin
            v1        <= 1'b0;
            out_valid <= 1'b0;
        end else begin
            v1        <= in_valid;
            out_valid <= v1;
            if (in_valid) begin
                p1 <= a * b;
                c1 <= c;
            end
            if (v1) y <= p_ext + c_ext;
        end
    end
endmodule

L'interface accepte une entrée par front et suppose un récepteur toujours disponible. Ne comparez pas y si out_valid=0. RéinitialiserReset Commande ramenant l'état à la valeur initiale spécifiée. Son caractère synchrone/asynchrone et sa priorité sur les autres commandes doivent être définis. En savoir plus valid distingue les données inutilisées même sans reset des registresRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus de données.

Distinguer deux étages et instant d'observation

Le tableau note l'état juste après chaque front ; A et B sont deux transactions différentes.

FrontEntrée acceptéeÉtage 1Registre de sortie
E0AProduit et c de AInvalide
E1BProduit et c de BRésultat A valide
E2AucuneInvalideRésultat B valide
E3AucuneInvalideInvalide

A est prêt après E1 ; le circuit suivant sur la même horloge le capture à E2. Entre acceptation E0 et réception E2, il y a donc deux périodes. Ne confondez pas changement du registre de sortie et réception aval.

Chaque colonne observe un front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus, entrées avant et états after après ; ce n'est pas un retard physiqueRetard de propagation Temps nécessaire après un changement d'entrée pour que la sortie se stabilise à sa valeur correcte. Équivalence logique et caractéristiques temporelles sont distinctes. En savoir plus. A=(2,3,10),B=(4,5,100). Le produit et c sont stockés ensemble, puis les anciennes valeurs s'additionnent au prochain front. Les tirets marquent les cases invalides.

Le produit et c doivent appartenir à la même transaction
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
accepted234.A → B → -
product1 après234.6 → 20 → -
c1 après234.10 → 100 → -
y après2345- → 16 → 120 → -
out_valid après01.0

Quel gain de fréquence apporte le découpage ?

Prenons un modèle hypothétique : multiplication 3.2ns, addition 1.1ns et coût du registre 0.2ns.

Tone≥3.2+1.1+0.2=4.5 nsT_{\mathrm{one}}\ge3.2+1.1+0.2=4.5\ \mathrm{ns}
Tpipe≥max⁡(3.2,1.1)+0.2=3.4 nsT_{\mathrm{pipe}}\ge\max(3.2,1.1)+0.2=3.4\ \mathrm{ns}

La limite théorique passe d'environ 222MHz à 294MHz. Deux étages ne doublent pas nécessairement le débit : le plus lent et le coût des registres fixent la période. Synthèse, placement et contraintes déterminent le résultat réel.

Vérifier par transaction

À l'acceptation, placez la référence entière a×b+c dans une queue. Quand une sortie valid est reçue, retirez et comparez l'attendu de tête. Insérez des cycles in_valid=0 pour vérifier les bulles avec les données. Faire varier fortement c entre transactions révèle efficacement un retard oublié.

Pour aller plus loin : MIT OpenCourseWare — Performance Measures

Essayez vous-même

Appliquez A=(3,−4,10) puis B=(2,5,100). Donnez la séquence correcte et l'erreur possible sur A si c n'est pas retardé.

Lire l’explication

Les résultats corrects sont A : −12+10=−2, puis B : 10+100=110. Si le produit A est au deuxième étage et c actuel vaut celui de B, 100, A donne à tort 88. Un valid bien retardé ne corrige pas des opérandes désalignés.

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