量子化モード - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
正の無限大への丸め AP_RND
0 への丸め AP_RND_ZERO
負の無限大への丸め AP_RND_MIN_INF
無限大への丸め AP_RND_INF
収束丸め AP_RND_CONV
切り捨て AP_TRN
0 への切り捨て AP_TRN_ZERO

AP_RND

  • 値を特定の ap_[u]fixed 型で表現可能な最も近い値に丸めます。
    ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.5
    ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.0

AP_RND_ZERO

  • 値を表示可能な最も近い値に丸めます。
  • 0 の方向へ丸めます。
    • 正の値の場合は、冗長ビットを削除します。
    • 負の値の場合は、表示可能な最も近い値になるよう下位ビットを追加します。
    ap_fixed<3, 2, AP_RND_ZERO, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.0
    ap_fixed<3, 2, AP_RND_ZERO, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.0

AP_RND_MIN_INF

  • 値を表示可能な最も近い値に丸めます。
  • 負の無限大の方向へ丸めます。
    • 正の値の場合は、冗長ビットを削除します。
    • 負の値の場合は、下位ビットを追加します。
    ap_fixed<3, 2, AP_RND_MIN_INF, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.0
    ap_fixed<3, 2, AP_RND_MIN_INF, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.5

AP_RND_INF

  • 値を表示可能な最も近い値に丸めます。
  • 丸めは LSB によって異なります。
    • 正の値では、LSB が設定されている場合は正の無限大の方向へ丸めます。それ以外の場合は負の無限大の方向へ丸めます。
    • 負の値では、LSB が設定されている場合は負の無限大の方向へ丸めます。それ以外の場合は正の無限大の方向へ丸めます。
    ap_fixed<3, 2, AP_RND_INF, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.5
    ap_fixed<3, 2, AP_RND_INF, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.5

AP_RND_CONV

  • 表現可能な最も近い値に丸めます。最も近い値が 2 つある場合は、偶数 (丸め後の LSB が 0) に丸めます。
  • 最も近い値が 2 つある状況は、値が 2 つの表現可能な値の中点であり、丸め後の LSB に続くビットが 1 で、その下のビットがすべて 0 である場合です。
    // For the following examples, bit3 of the 8-bit value becomes the
    // LSB of the final 5-bit value (after rounding).
    // Notes: 
    //   * bit7 of the 8-bit value is the MSB (sign bit)
    //   * the 3 LSBs of the 8-bit value (bit2, bit1, bit0) are treated as
    //     guard, round and sticky bits.
    //   * See http://pages.cs.wisc.edu/~david/courses/cs552/S12/handouts/guardbits.pdf
    
    ap_fixed<8,3> p1 = 1.59375; // p1 = 001.10011
    ap_fixed<5,3,AP_RND_CONV> rconv1 = p1; // rconv1 = 1.5 (001.10)
    
    ap_fixed<8,3> p2 = 1.625; // p2 = 001.10100 => tie with bit3 (LSB-to-be) = 0
    ap_fixed<5,3,AP_RND_CONV> rconv2 = p2; // rconv2 = 1.5 (001.10) => lsb is already zero, just truncate
    
    ap_fixed<8,3> p3 = 1.375; // p3 = 001.01100 => tie with bit3 (LSB-to-be) = 1
    ap_fixed<5,3,AP_RND_CONV> rconv3 = p3; // rconv3 = 1.5 (001.10) => lsb is made zero by rounding up
    
    ap_fixed<8,3> p3 = 1.65625; // p3 = 001.10101
    ap_fixed<5,3,AP_RND_CONV> rconv3 = p3; // rconv3 = 1.75 (001.11) => round up
    

AP_TRN

  • 値を常に負の無限大の方向へ丸めます。
    ap_fixed<3, 2, AP_TRN, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.0
    ap_fixed<3, 2, AP_TRN, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.5

AP_TRN_ZERO

値を次のように丸めます。

  • 正の値の場合、AP_TRN モードと同じ丸めになります。
  • 負の値の場合、ゼロの方向へ丸めます。
    ap_fixed<3, 2, AP_TRN_ZERO, AP_SAT> UAPFixed4 = 1.25; // Yields: 1.0
    ap_fixed<3, 2, AP_TRN_ZERO, AP_SAT> UAPFixed4 = -1.25; // Yields: -1.0