31 / 37 · Concetto
Pipeline moltiplicazione-addizione e allineamento
Suddividere ai registri mantenendo dati, valid e operandi ausiliari nella stessa transazione.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Dalla formula a due stadi
Prerequisiti: aritmetica signed, nonblockingNonblocking Assegnazione RTL sequenziale con <=. Valuta il membro destro e pianifica l’aggiornamento, permettendo ai registri dello stesso fronte di usare lo stato precedente. Approfondisci, setupSetup Tempo minimo prima del fronte di acquisizione in cui i dati devono essere stabili. Una violazione rende non garantito il valore memorizzato. Approfondisci e valid.
Ogni transazione contiene a, b signed a otto bit e c signed a sedici. Il risultato seguente è un multiply-add indipendente per transazione, non un accumulatore.
Il prodotto esatto a otto bit richiede sedici bit. Sommare c su sedici bit ed estendere dopo non recupera bit già persi. Estendete prima entrambi a diciassette bit signed.
Lo stadio 1 salva insieme prodotto e c; lo stadio 2 somma valori della stessa transazione. Senza ritardare c, si mescolano prodotto precedente e c attuale.
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'interfaccia accetta a ogni fronte e assume un destinatario sempre pronto. y con out_valid=0 non si confronta. Inizializzare valid distingue dati inutilizzati anche senza resetReset Controllo che riporta allo stato iniziale specificato. Occorre definirne sincronicità e priorità rispetto agli altri controlli. Approfondisci dei registri datiRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci.
Distinguere due stadi e istanti d'osservazione
La tabella mostra accettazione al fronte e stato subito dopo. A e B sono transazioni diverse.
| Fronte | Accettato | Stadio 1 | Registro d'uscita |
|---|---|---|---|
| E0 | A | Prodotto e c di A | Invalid |
| E1 | B | Prodotto e c di B | Risultato A, valido |
| E2 | Nulla | Invalid | Risultato B, valido |
| E3 | Nulla | Invalid | Invalid |
A è pronto subito dopo E1; il circuito seguente sullo stesso clock lo campiona a E2. Da accettazione E0 a ricezione E2 passano due periodi. Non mescolate variazione del registro d'uscita e ricezione successiva nel descrivere la latenza.
Ogni colonna registra un fronte di salitaFronte di salita Passaggio del clock da 0 a 1, distinto dall’intero intervallo di livello CLK=1. Approfondisci. Gli ingressi sono quelli immediatamente precedenti; gli stati con „after“ quelli subito dopo l’aggiornamento. Le colonne indicano l’ordine dei campioni, non il ritardo fisico di propagazioneRitardo di propagazione Tempo dalla variazione d’ingresso all’assestamento corretto dell’uscita. Equivalenza logica e proprietà temporali sono distinte. Approfondisci. A=(2,3,10), B=(4,5,100). Il primo stadio salva prodotto e c insieme; il fronte seguente somma i valori precedenti. I trattini indicano invalid.
Mostra i dati della forma d’onda
| Segnale | Forma d’onda | Valori del bus |
|---|---|---|
| edge | 2345 | E0 → E1 → E2 → E3 |
| accepted | 234. | A → B → - |
| product1 after | 234. | 6 → 20 → - |
| c1 after | 234. | 10 → 100 → - |
| y after | 2345 | - → 16 → 120 → - |
| out_valid after | 01.0 |
Quanto accelera la pipeline?
Assumiamo un modello con moltiplicazione 3.2ns, addizione 1.1ns e costo registri 0.2ns. Sono valori illustrativi.
Il limite superiore di frequenza passa da circa 222MHz a 294MHz. Due stadi non raddoppiano necessariamente il throughput: periodo deciso dallo stadio più lento e dal costo dei registri. I risultati reali dipendono da sintesi, posizionamento e vincoli.
Verificare per transazioni
All'accettazione accodate a×b+c del riferimento intero. Al fronte che riceve un'uscita valida confrontate la testa. Inserite in_valid=0 e verificate che le bolle viaggino coi dati. Variare molto c tra transazioni rivela bene il ritardo mancante.
Per approfondire: MIT OpenCourseWare — Performance Measures
Prova tu
A=(3,−4,10), B=(2,5,100) sono consecutive. Quali uscite corrette e quale errore su A senza ritardo di c?
Leggi la spiegazione
A dà −12+10=−2, B 10+100=110. Se il prodotto di A incontra c=100 di B, si ottiene 88. Ritardare correttamente valid non corregge operandi disallineati.