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.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
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.
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.
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
endmoduleL'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.
| Front | Entrée acceptée | Étage 1 | Registre de sortie |
|---|---|---|---|
| E0 | A | Produit et c de A | Invalide |
| E1 | B | Produit et c de B | Résultat A valide |
| E2 | Aucune | Invalide | Résultat B valide |
| E3 | Aucune | Invalide | Invalide |
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.
Voir les données du chronogramme
| Signal | Forme d'onde | Valeurs du bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| accepted | 234. | A → B → - |
| product1 après | 234. | 6 → 20 → - |
| c1 après | 234. | 10 → 100 → - |
| y après | 2345 | - → 16 → 120 → - |
| out_valid après | 01.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.
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.