警告
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() |
重新编码的四精度浮点数 |
运算符
以下运算符可用于 Floating
和 RecFloating
类型:
类型转换
运算符 |
描述 |
返回类型 |
---|---|---|
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 |