9 / 24 · Concetto
Memorizza l'intera transazione ai confini della pipeline
Suddividi l'aritmetica di somma e scalatura mantenendo allineati valid, tag e larghezze.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Un confine tra registri trasporta significato oltre ai bit
Suddividi f(a,b)=3(a+b) in due stadi. Il primo stadio memorizza la somma a nove bit di due operandi senza segno a otto bit. Il secondo forma un valore scalato a undici bit e ne memorizza gli otto bit meno significativi. Il massimo risultato esteso è 1530. Ridurre la somma intermedia conserva, in questa espressione intera, il valore finale modulo 256, ma perde informazioni necessarie per segnalare l'overflow o per confronti successivi. Mantieni esplicita la larghezza intermedia.
Ogni stadio memorizza valid e tag insieme ai dati. Valid a zero indica una bolla. I vecchi bit dei dati possono rimanere in uno stadio vuoto, ma non devono contare come transazione. Un tag richiede lo stesso ritardo attraverso i registri del suo valore. Due registri dati con un solo registro tag associano l'identità della transazione B al risultato della transazione A.
Questo nucleo presume assenza di stalli e porte sempre pronte. Estendi s1 e dimensiona la costante prima della moltiplicazione. Il secondo stadio legge s1 e t1 precedenti; il nuovo ingresso non può attraversare entrambi i registri in un solo fronte.
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
v1 <= in_valid;
v2 <= v1;
if (in_valid) begin
s1 <= {1'b0, a} + {1'b0, b};
t1 <= in_tag;
end
if (v1) begin
s2 <= scaled[7:0];
t2 <= t1;
end
end
endAccetta A=(1,2) al fronte 0: subito dopo s1=3. Accetta B=(250,10) al fronte 1: s1 diventa 260 mentre s2 memorizza il risultato 9 di A. A è valida dopo il fronte 1 e può essere trasferita al fronte 2. B produce in seguito 780 modulo 256, cioè 12.
Fai avanzare anche le bolle attraverso i registri valid. Mantenere il vecchio v1=1 in assenza di un ingresso può duplicare una transazione. Il reset azzera lo stato valid affinché dati obsoleti non possano diventare un nuovo risultato. A ogni confine, elenca tutti i campi associati: operazione, tag, eccezione, indirizzo o indicatore di fine pacchetto. Verifica che questi campi restino parte di una stessa transazione lungo tutta la pipeline.
Prova tu
A=(1,2,tag=10) e B=(250,10,tag=11) vengono accettate consecutivamente. Se si usa t2<=in_tag, quale tag accompagna il risultato di A? Indica il collegamento corretto.
Leggi la spiegazione
Al fronte 1, s2 calcola la vecchia transazione A mentre in_tag corrente è 11, quindi il risultato 9 riceve il tag 11. Usa t2<=t1 per acquisire il vecchio tag 10 di A nel primo stadio.