Floating

注意:SpinalHDL定点数只是部分支持并部分经过测试的, 如果你发现它有任何bug, 或者你认为有些函数丢失了, 请创建一个Github issue。并且, 请不要在代码中用未在doc中指出的特征。

一、描述(Description)

Floating类型对应于IEEE-754编码规则。第二种叫做RecFloating的类型能通过对浮点数的重编码简化一些IEEE-754浮点数的边缘案例。

它由1 bit符号位, 指数区域和底数区域组成。不同区域的宽度定义在IEEE-754或者de-facto标准中。

使用浮点数时需要先进行如下操作:

import spinal.lib.experimental.math._

IEEE-754浮点格式(IEEE-754 floating format)

数字会根据IEEE-754编码:https://en.wikipedia.org/wiki/IEEE_754

浮点形式重编码(Recoded floating format)

因为IEEE-754在非正规(denormalized)数字和特殊值的时候有一些不方便的地方, Berkeley提出了另一种浮点数值的编码方式。

为了能将非正规的数值规范(normalized)地处理, 底数经过了一些修改。

指数部分比IEEE-754多1 bit。

符号位没有改变。

例子可以在这里看到:https://github.com/ucb-bar/berkeley-hardfloat/blob/master/README.md

零(Zero)

指数字段的三个前导零被设置为0来代表0的编码。

非正规数值(Denormalized values)

非正规的数值也会编码成一般的浮点数, 底数被移位使第一位隐藏, 指数编码为107(十进制)加bit值是1的最高位的序号。

规范数值(Normalized values)

重编码的底数和IEEE-754标准的底数完全一致, 指数编码为130(十进制)加最初的指数值。

无穷大(Infinity)

重编码的底数值不用关心, 重编码的指数值的最高3 bits值是6(十进制), 剩余部分不用关心。

NaN

重编码的规范化底数部分与IEEE-754一致, 重编码的指数部分最高3 bits是7(十进制), 剩余部分不用关心。

二、声明(Declaration)

声明浮点数的语句如下所示:

IEEE-754数字(IEEE-754 Number)

语法 描述
Floating(exponentSize: Int, mantissaSize: Int) 带有标准指数和底数长度的IEEE-754浮点数
Floating16() 半精度IEEE-754浮点数
Floating32() 单精度IEEE-754浮点数
Floating64() 双精度IEEE-754浮点数
Floating128() 四精度IEEE-754浮点数
语法 描述
RecFloating(exponentSize: Int, mantissaSize: Int) 带有标准指数和底数长度的IEEE-754浮点数
RecFloating16() 重编码半精度浮点数
RecFloating32() 重编码单精度浮点数
RecFloating64() 重编码双精度浮点数
RecFloating128() 重编码四精度浮点数

三、操作符(Operators)

以下所FloatingRecFloating类型所支持的操作符:

类型转换(Type cast) ##有问题, 前后不一##

操作符 描述 返回类型
x.asBits 二进制转换为Bits Bits(w(x) bits)
x.asBools 转换为Bool数组 Vec(Bool, width(x))
x.toUInt(size: Int) 返回对应的UInt(自带truncation) UInt
x.toSInt(size: Int) 返回对应的SInt(自带truncation) SInt
x.fromUInt 返回对应的UFix(自带truncation) UFix
x.fromUInt 返回对应的SFix(自带truncation) SFix