Altifigence Academy

9 / 24 · Concetto

Memorizza l'intera transazione ai confini della pipeline

Suddividi l'aritmetica di somma e scalatura mantenendo allineati valid, tag e larghezze.

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.

SystemVerilog
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
end

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

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