任意精度定点数据类型概述 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

定点数据类型以 2 的补码形式将数据作为整数位和小数位进行建模,格式为 ap_fixed<W,I,[Q,O,N]>,如下表所述。在以下示例中,Vitis HLS ap_fixed 类型用于定义 18 位变量,其中 6 位(包括符号位)指定为表示二进制小数点前的数值,12 位则隐含用于表示小数点后的小数值。此变量指定为有符号变量,量化模式设置为舍入到正无穷。由于未指定上溢模式,因此针对上溢使用默认卷绕模式。

#include <ap_fixed.h>
...
ap_fixed<18,6,AP_RND> t1 = 1.5; // internally represented as 0b00'0001.1000'0000'0000 (0x01800)
ap_fixed<18.6,AP_RND> t2 = -1.5; // 0b11'1110.1000'0000'0000 (0x3e800)
...
提示: ap_fixed 的整数值 (I) 指定了二进制小数点左侧的整数位数(包括符号位)。

执行计算时,如果其中所含变量具有不同位数或不同精度,那么二进制小数点将自动对齐。例如,以不同大小的定点类型变量执行除法时,商的小数部分不大于被除数的小数部分。为了保留商的小数部分,可在赋值前先将结果强制转换为新的变量宽度。

使用定点执行的 C++ 语言仿真行为与生成的硬件相匹配。这使您能够使用 C 语言层次快速仿真来分析位精度、量化和上溢行为。

定点类型适合替代需要多个时钟周期才能完成的浮点类型。除非需要浮点类型的完整范围,否则通常使用定点类型即可实现相同精度,并且硬件更小也更快。

下表中提供了 ap_fixed 类型的标识符的汇总。

表 1. 定点标识符汇总
标识符 描述
W 字宽(位)
I

用于表示整数值的位数,即,二进制小数点左侧的整数位数,包括符号位。

当 I 为负值(如以下示例所示)时,它表示隐式有符号位(对应有符号表示法)的数量,或者小数点右侧隐式零位(对应无符号表示法)的数量。例如:

ap_fixed<2, 0> a = -0.5;    // a can be -0.5,

ap_ufixed<1, 0> x = 0.5;    // 1-bit representation. x can be 0 or 0.5
ap_ufixed<1, -1> y = 0.25;  // 1-bit representation. y can be 0 or 0.25
const ap_fixed<1, -7> z = 1.0/256;  // 1-bit representation for z = 2^-8
Q 量化模式:用于规定当生成的精度大于用于存储结果的变量中的最小小数位可定义的精度时的行为。
ap_fixed 类型 描述
AP_RND 舍入到正无穷
AP_RND_ZERO 舍入到 0
AP_RND_MIN_INF 舍入到负无穷
AP_RND_INF 舍入到无穷
AP_RND_CONV 收敛舍入
AP_TRN 截位到负无穷(默认)
AP_TRN_ZERO 截位到 0
O

上溢模式:用于规定当运算结果超出用于存储结果的变量可存储的最大值(或者对于负值为最小值)时的行为。

ap_fixed 类型 描述
AP_SAT 1 饱和
AP_SAT_ZERO 1 饱和到 0
AP_SAT_SYM 1 对称饱和
AP_WRAP 卷绕(默认)
AP_WRAP_SM 符号量值卷绕
不支持 定义上溢卷绕模式中的饱和位数。
  1. 使用 AP_SAT* 模式可以提升资源利用率,因为需要额外逻辑来执行饱和,此额外成本可能额外增加高达 20% 的 LUT 利用率。
  2. 来自 hls_math 库的定点数学函数不支持 ap_[u]fixed 模板参数 Q、O 和 N,这三个参数依次分别对应于量化模式、上溢模式和饱和位数。仅当 ap_[u]fixed 变量位于赋值左侧时或者在初始化期间,量化模式和上溢模式才有效,但在变量计算期间无效。

针对 ap_[u]fixed 数据类型允许的默认最大位宽为 1024 位。此默认设置可通过在包含 ap_int.h 头文件之前定义含正整数(小于或等于 4096)的 AP_INT_MAX_W 宏来覆盖。

重要: 使用 ap_[u]fixed 时,ROM 综合耗时较长。将其更改为 int 可加速综合。例如:
static ap_fixed<32,0> a[32][depth] = 

可更改为:

static int a[32][depth] =