警告

SpinalHDL 浮点小数支持正在开发中,仅部分使用/测试,如果您有任何错误,或者您认为缺少某些功能,请创建 Github issue。另外,请不要在代码中使用未归档的功能。

浮点小数

描述

Floating 类型对应于 IEEE-754 编码数字。第二种类型称为 RecFloating ,通过重新编码浮点值来帮助简化设计,简化 IEEE-754 浮点中的一些边缘情况。

它由一个符号位、一个指数字段和一个尾数字段组成。不同字段的宽度在 IEEE-754 或事实上的标准中定义。

此类型可通过以下方法导入使用:

import spinal.lib.experimental.math._

IEEE-754 浮点小数格式

这些数字被编码为 IEEE-754 浮点格式

重新编码的浮动小数格式

由于 IEEE-754 对非规范化数字和特殊值有一些怪癖,加州大学伯克利分校提出了另一种重新编码浮点小数值的方法。

通过修改尾数,以便非标准化值可以与标准化值相同地对待。

指数字段比 IEEE-754 定义的大一位。

两种编码之间的符号位保持不变。

示例可以在 这里 找到

零的编码是,指数字段的三个前导零被设置为零。

非规范化值

在浮点数表示中,非规范化数值的编码方式与规范化数值相同。尾数部分会进行位移,使得最左边的1位成为隐含的,而指数部分则由107(十进制)加上最左边1位的位置索引来计算。这样的编码确保了非规范化数值能够正确表示。

标准化值

标准化值的重新编码尾数与原始 IEEE-754 尾数完全相同。重新编码的指数被编码为 130(十进制)加上原始指数值。

无穷大

此时,重新编码的尾数值被视为无关紧要。重新编码的指数三位最高位是6(十进制),其余指数可以视为不关心。

无效数(NaN)

此时,重新编码中尾数与原始 IEEE-754 尾数完全相同。重新编码的指数三位最高位是7(十进制),其余指数可以视为不关心。

声明

声明浮点小数的语法如下:

IEEE-754 编码数

语法

描述

Floating(exponentSize: Int, mantissaSize: Int)

具有自定义指数和尾数大小的 IEEE-754 浮点值

Floating16()

IEEE-754 半精度浮点数

Floating32()

IEEE-754 单精度浮点数

Floating64()

IEEE-754 双精度浮点数

Floating128()

IEEE-754 四精度浮点数

重新编码的浮点数

语法

描述

RecFloating(exponentSize: Int, mantissaSize: Int)

使用自定义指数和尾数大小重新编码的浮点小数值

RecFloating16()

重新编码的半精度浮点数

RecFloating32()

重新编码的单精度浮点数

RecFloating64()

重新编码的双精度浮点数

RecFloating128()

重新编码的四精度浮点数

运算符

以下运算符可用于 FloatingRecFloating 类型:

类型转换

运算符

描述

返回类型

x.asBits

二进制转换为 Bits

Bits(w(x) bits)

x.asBools

转换为 Bool 数组

Vec(Bool(),width(x))

x.toUInt(size: Int)

返回对应的UInt(带截断)

UInt

x.toSInt(size: Int)

返回对应的SInt(带截断)

SInt

x.fromUInt

返回对应的Floating(带截断)

UInt

x.fromSInt

返回对应的Floating(带截断)

SInt