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)
以下所Floating
和RecFloating
类型所支持的操作符:
类型转换(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 |