Altifigence Academy

31 / 37 · Concetto

Pipeline moltiplicazione-addizione e allineamento

Suddividere ai registri mantenendo dati, valid e operandi ausiliari nella stessa transazione.

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.

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

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.

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'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.

FronteAccettatoStadio 1Registro d'uscita
E0AProdotto e c di AInvalid
E1BProdotto e c di BRisultato A, valido
E2NullaInvalidRisultato B, valido
E3NullaInvalidInvalid

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.

Il prodotto e c devono appartenere alla stessa transazione
Mostra i dati della forma d’onda
Dati della forma d’onda: ogni carattere è un intervallo; il punto mantiene lo stato precedente; p è un ciclo di clock.
SegnaleForma d’ondaValori del bus
edge2345E0 → E1 → E2 → E3
accepted234.A → B → -
product1 after234.6 → 20 → -
c1 after234.10 → 100 → -
y after2345- → 16 → 120 → -
out_valid after01.0

Quanto accelera la pipeline?

Assumiamo un modello con moltiplicazione 3.2ns, addizione 1.1ns e costo registri 0.2ns. Sono valori illustrativi.

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}

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.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.