Altifigence Academy

53 / 63 · Concetto

Virgola fissa, arrotondamento e saturazione

Definire il campo W, F e progettare ties-to-even con guard/sticky e saturazione successiva.

Prerequisiti: larghezze di somma/prodotto signed, shift aritmetico destro e overflow.

Concordare la posizione della virgola binaria

La virgola fissaVirgola fissa Rappresentazione con posizione della virgola prefissata e scala applicata a una sequenza intera. Vanno definiti insieme larghezza, segno e bit frazionari. interpreta l'intero X come x=X2−Fx=X2^{-F}. La virgola non è un bit memorizzato. Qui W include il segno e F conta i bit frazionari. Poiché la notazione Q varia nell'inclusione del segno, indicare insieme W e F chiarisce l'interfaccia.

−2W−1−F≤x≤2W−1−F−2−F-2^{W-1-F}\le x\le 2^{W-1-F}-2^{-F}

W=8, F=4 dà passo 1/16 e campo −8–7.9375. 0x18 significa qui 1.5, non l'intero 24; con F=3 significherebbe 3. Collegare fili non garantisce significati numerici coerenti: documentate la scala di ogni porta.

Prima di sommare allineate le virgole. Estendete e spostate a sinistra il valore con F minore, oppure riducete quello con F maggiore secondo una regola di arrotondamento. La somma esatta di due valori con stessi W, F richiede W+1 bit e lo stesso F. Il prodotto moltiplica gli interi raw e somma i bit frazionari.

P=XAXB,FP=FA+FBP=X_A X_B,\qquad F_P=F_A+F_B

Il prodotto completo di due numeri a otto bit/F=4 è signed a sedici bit/F=8. Per uscire a otto bit/F=4, eliminate prima quattro bit frazionari e poi controllate il campo signed. Tagliare prima il prodotto a otto bit nasconde la grandezza originale alla saturazione.

Distinguere troncamento e arrotondamento

Lo shift aritmetico di d bit dà q=⌊P/2d⌋q=\lfloor P/2^d\rfloor: anche i negativi vengono arrotondati verso il basso. Con P=−24,d=4P=-24,d=4, il quoziente esatto è −1.5 ma q=−2. Non è troncamento verso zero. Selezionare i bit alti non ha automaticamente sui negativi le stesse proprietà d'errore dei positivi.

Progettiamo l'arrotondamento al più vicino, con metà esatte all'intero pari (ties-to-even). g è il guard, bit scartato più alto; t è lo sticky, OR degli altri; l è il bit meno significativo di q conservato.

inc=g∧(t∨l),qrnd=q+inc\mathrm{inc}=g\land(t\lor l),\qquad q_{\mathrm{rnd}}=q+\mathrm{inc}

g=0 indica meno di metà: si mantiene. g=1, t=1 indica più di metà: si incrementa. g=1, t=0 è metà esatta: si incrementa solo q dispari. Vale anche per negativi, perché con quoziente floor q e resto r=P−q2dr=P-q2^d si ha sempre 0≤r<2d0\le r<2^d.

−24/16=−1.5, con q=−2 pari, arrotonda a −2; −40/16=−2.5, con q=−3 dispari, ancora a −2. Regole come «sottrarre sempre 1 ai negativi» sono errate. Senza saturazione, l'errore è al massimo mezzo LSBLSB Bit di peso minore. Vanno controllati insieme direzione di scrittura e convenzione degli indici. Approfondisci d'uscita. Ties-to-even non garantisce errore medio nullo per ogni distribuzione, ma riduce il bias delle metà sempre dirette dallo stesso lato.

Convertendo raw P=2040 da sedici bit/F=8 a otto bit/F=4, 127.5 viene prima arrotondato al pari 128 e poi limitato al massimo signed 127. Conservate la larghezza estesa fino all'ultima memorizzazione.

Prima arrotondare, poi saturare
  1. Ingresso P=2040: 16 bit · F=8
  2. Ridurre la scala: 2040 / 16 = 127.5
  3. ties-to-even: Valore raw arrotondato = 128
  4. Memorizzare dopo la saturazione: raw 127 → 7.9375

Saturare dopo l'arrotondamento

La saturazione limita al massimo i valori superiori e al minimo quelli inferiori. Diversamente dal wrap, un positivo grande non diventa negativo. Tuttavia un valore già ridotto di larghezza e soggetto a wrap non consente una saturazione corretta a posteriori.

Il modulo combinatorio completo converte signed sedici bit/F=8 in otto bit/F=4. Con d=4 fisso, guard è p[3], sticky p[2:0]. Incremento e confronto si eseguono in diciassette bit signed e solo alla fine si estraggono otto bit.

SystemVerilog
module requantize (
  input  logic signed [15:0] p,
  output logic signed [7:0] y,
  output logic saturated
);
  logic signed [16:0] wide, q, rounded;
  logic inc;
  always_comb begin
    wide = {p[15], p};
    q = wide >>> 4;
    inc = p[3] & ((|p[2:0]) | q[0]);
    rounded = q + (inc ? 17'sd1 : 17'sd0);
    saturated = 1'b0;
    if (rounded > 17'sd127) begin
      y = 8'sh7f;
      saturated = 1'b1;
    end else if (rounded < -17'sd128) begin
      y = 8'sh80;
      saturated = 1'b1;
    end else begin
      y = rounded[7:0];
    end
  end
endmodule

P=2040 dà 127.5, arrotondato 128, saturato 127, cioè 7.9375. Controllare solo q=127 prima dell'arrotondamento perde il superamento. saturated indica limitazione del campo, non la sola perdita di bit frazionari.

Un modulo generico deve distinguere d=0 senza bit scartati e d=1 senza area sticky. Nascondere un part-select invalido in una condizione può non eliminare l'errore di elaborazione.

Arrotondamento e saturazione sono politiche separate che aggiungono sommatori, confronti, MUXMultiplexer Circuito combinatorio che collega un ingresso all’uscita secondo la selezione. Va specificata la corrispondenza fra bit di selezione e ingressi. Approfondisci e ritardo. La distinzione appare anche nella documentazione AMD della virgola fissa. Decidete se mantenere precisione intermedia e convertire una sola volta alla fine dell'accumulo. Saturare a ogni passo può rompere l'associatività; arrotondare a ogni passo può accumulare piccoli errori.

Prova tu

Convertite signed sedici bit/F=8 in otto bit/F=4 per P=24,40,−24,−40,2040. Indicate q floor, guard/sticky, intero arrotondato, raw e valore reale. Cosa accade verificando la saturazione prima di arrotondare 2040?

Leggi la spiegazione

Tutti i quattro bit bassi sono 1000: guard=1, sticky=0. 24: q=1 dispari→2, raw=2, valore 0.125. 40: q=2 pari→2, raw=2,0.125. −24: q=−2 pari→−2, raw=−2,−0.125. −40: q=−3 dispari→−2, raw=−2,−0.125. 2040: q=127 dispari→128 fuori campo signed a otto bit, quindi raw=127, valore 7.9375, saturated=1. Controllando solo q=127 e aggiungendo 1 su otto bit si può ottenere 0x80=−8. Incremento e confronto devono terminare in larghezza signed estesa.

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