Altifigence Academy

53 / 63 · Konsep

Titik tetap, pembulatan, dan saturasi

Tentukan rentang melalui W,F dan rancang pembulatan genap guard/sticky diikuti saturasi.

Prasyarat: lebar penjumlahan/perkalian signed, geser kanan aritmetika, dan overflow.

Menetapkan posisi titik melalui kontrak

Titik tetapTitik tetap Representasi dengan posisi titik tetap yang menerapkan skala tertentu pada pola bit bilangan bulat. Lebar, tanda, dan jumlah bit pecahan harus ditetapkan bersama. menafsirkan bilangan bulat X sebagai x=X2−Fx=X2^{-F}; tidak ada bit titik yang disimpan. W di sini mencakup tanda dan F adalah jumlah bit pecahan. Konvensi Q berbeda dalam cara menghitung bit tanda pada bagian bulat, sehingga penulisan W,F dalam antarmuka lebih jelas.

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

Untuk W=8,F=4, langkahnya 1/16 dan rentangnya −8 hingga 7.9375. 0x18 berarti 1.5, bukan bilangan bulat 24; dengan F=3, nilainya 3. Menyambungkan kawat tidak menjamin skala numerik cocok: dokumentasikan skala tiap port.

Samakan posisi titik sebelum penjumlahan. Untuk F berbeda, perluas sisi F kecil secukupnya lalu geser kiri, atau kurangi sisi F besar dengan pembulatan tertentu. Penjumlahan tepat dua nilai W,F sama memerlukan W+1 bit dan F tetap. Perkalian mengalikan bilangan raw dan menjumlahkan jumlah bit pecahan.

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

Perkalian lengkap dua nilai delapan bit F=4 menghasilkan signed 16 bit F=8. Untuk kembali ke delapan bit F=4, kurangi empat bit pecahan lalu periksa rentang signed delapan bit. Memotong produk ke delapan bit dahulu menghilangkan informasi tentang besar nilai yang dibutuhkan untuk saturasi.

Pemotongan dan pembulatan

Geser kanan aritmetika d bit menghasilkan q=⌊P/2d⌋q=\lfloor P/2^d\rfloor, ke bawah termasuk untuk negatif. Untuk P=−24,d=4P=-24,d=4, hasil tepat −1.5 memberi q=−2, berbeda dari pemotongan menuju nol. Jangan menganggap pengambilan bit tinggi memiliki sifat kesalahan sama untuk kedua tanda.

Bangun pembulatan terdekat dengan pilihan bilangan genap ketika tepat di tengah. g, guard, adalah bit tertinggi yang dibuang; t, sticky, adalah OR bit terbuang lainnya; l adalah bit terendah q yang dipertahankan.

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

g=0 berarti kurang dari setengah: pertahankan. g=1,t=1 berarti lebih dari setengah: naikkan. g=1,t=0 tepat setengah: tambahkan 1 hanya jika q ganjil. Ini juga berlaku untuk nilai negatif karena hasil bagi dibulatkan ke bawah dan r=P−q2dr=P-q2^d selalu memenuhi 0≤r<2d0\le r<2^d.

Jadi −24/16=−1.5 memberi q=−2 genap, tetap −2; −40/16=−2.5 memberi q=−3 ganjil, menjadi −2. Aturan khusus “kurangi 1 untuk negatif” justru salah. Tanpa saturasi, kesalahan akhir maksimal setengah LSBLSB Bit berbobot terendah. Periksa arah penulisan dan aturan indeks bersama. Selengkapnya keluaran. Ties-to-even tidak menjamin rata-rata kesalahan nol untuk semua distribusi, tetapi mengurangi bias jika nilai tengah selalu diarahkan ke sisi sama.

Untuk raw P=2040 pada 16 bit F=8 menuju delapan bit F=4, 127.5 dibulatkan ke 128 genap, lalu dibatasi ke 127. Pertahankan lebar cukup hingga penyimpanan akhir.

Bulatkan dahulu, lalu saturasi
  1. Masukan P=2040: 16 bit · F=8
  2. Pengurangan skala: 2040 / 16 = 127.5
  3. Seri ke genap: Raw dibulatkan = 128
  4. Simpan setelah saturasi: Raw 127 → 7.9375

Saturasi setelah pembulatan

Saturasi membatasi nilai ke maksimum atau minimum jika terlampaui. Berbeda dari wrap, positif besar tidak berbalik negatif. Nilai yang sudah dipersempit dan wrap tidak lagi dapat disaturasi dengan benar.

Modul kombinasional ini mengubah signed 16 bit F=8 menjadi signed delapan bit F=4. Dengan d=4, guard=p[3] dan sticky=OR(p[2:0]). Kenaikan pembulatan dan perbandingan dilakukan pada 17 bit signed; delapan bit diambil hanya pada akhir.

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 memberi 127.5, dibulatkan ke 128 lalu disaturasi ke 127 atau 7.9375. Memeriksa q=127 sebelum pembulatan melewatkan pelampauan. saturated berarti pembatasan karena di luar rentang, bukan sekadar kehilangan bit pecahan.

Pada modul generik, d=0 tidak memiliki bit terbuang dan d=1 tidak memiliki wilayah sticky. Menyembunyikan slice tidak valid dalam if belum tentu menghindari kesalahan elaborasi.

Pembulatan dan saturasi adalah kebijakan terpisah yang menambah adder, pembanding, MUXMultiplekser Rangkaian kombinasional yang menghubungkan satu dari beberapa masukan ke keluaran menurut seleksi. Hubungan bit seleksi dan nomor masukan harus ditetapkan. Selengkapnya, serta tundaan, sebagaimana dibedakan dalam dokumentasi format titik tetap AMD. Untuk akumulasi, tentukan dahulu apakah lebar perantara dipertahankan sampai satu konversi akhir. Saturasi tiap tahap dapat merusak asosiativitas; pembulatan tiap tahap dapat mengakumulasi kesalahan kecil.

Coba sendiri

Konversikan P signed 16 bit F=8 ke delapan bit F=4. Untuk 24,40,−24,−40,2040, tentukan hasil bagi q yang dibulatkan ke bawah, guard/sticky, bilangan bulat hasil pembulatan, raw akhir, dan nilai nyata. Apa risiko memeriksa saturasi sebelum pembulatan pada 2040?

Baca penjelasan

Empat bit rendah selalu 1000: guard=1,sticky=0. P=24: q=1 ganjil→2, raw=2, nilai=0.125. P=40: q=2 genap→2, raw=2, 0.125. P=−24: q=−2 genap→−2, raw=−2, −0.125. P=−40: q=−3 ganjil→−2, raw=−2, −0.125. P=2040: q=127 ganjil→128, lalu saturasi signed delapan bit: raw=127, nilai=7.9375,saturated=1. Memeriksa q=127 lalu menambah 1 dalam delapan bit dapat wrap ke 0x80 atau −8. Selesaikan kenaikan dan perbandingan dalam signed lebar.

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.