前言
System verilog里的浮点数采用的是IEEE754标准。在system verilog里提供了一些系统函数来对“浮点小数”和“浮点小数对应的在计算机里的存储数据”做转换,例如:$bitstoreal/$bitstoshortreal等。本文将介绍他们之间的关系。
1. IEEE 754标准
1.1 64bit 双精度浮点数
在sv里,双精度浮点数是64bit,这64bit的组成是:1bit符号位,11bit阶码,52bit尾数。
1.1.1 符号位
1bit符号位:0表示正;1表示负
1.1.2 阶码
阶码是11bit,能够表示的范围是0-2047。阶码转换成小数计算时,需要减1023(IEEE754规定,为了方便计算)。阶码设置成不同的值代表的含义不同,分为下面三类:
(1)正常阶码:1-2046
(2)特殊阶码:2047
(3)特殊阶码:0
以上三类阶码的具体作用将结合尾数进行介绍。
1.1.3 尾数
尾数占据52bit,结合三类阶码分别介绍:
(1)正常情况:即阶码是1-2046
这种情况下:尾数52bit全部位于小数点后,因此默认小数点前有一位隐藏位:1
举例:尾数:00…00(52个0),实际上表示的数是1.00…00(52个0)
因此,这种情况下64bit数据转换成小数的公式就是:
1.尾数*【前面加符号位】
举例:
0 00000000001 0…00(52个0)
表示的小数就是:1.000..00*2^(1-2023)=2.225e^(-308)
仿真结果:
(2)特殊情况:阶码为2047
阶码为2047即全1的情况,如果尾数为全0,IEE754规定这是一个无穷大数INF;如果尾数非全0,IEEE754规定这是无效数NAN。
仿真结果:
(3)特殊情况:阶码是0
这种情况下:尾数没有隐藏位,小数点位于尾数第一位与第二位之间。
举例:00…00(52个0)表示的是0.00…00(小数点后51个0)
因此,这种情况下64bit数据转换成小数的公式就是:
(小数点加在第一、二位之间的尾数)*2^(-1023)【前面加符号位】
举例:
0 00000000000 0…01(51个0)
表示的小数就是:0.000..01*2^(-1023)=2^(-51-1023)=4.940656e^(-324)
仿真结果:
1.2 32bit 单精度浮点数
和双精度的转换规则一致,只是单精度浮点数的表示位宽不一样。
在sv里,单精度浮点数是32bit,这32bit的组成是:1bit符号位,8bit阶码,23bit尾数。
1.2.1 符号位
1bit符号位:0表示正;1表示负
1.2.2 阶码
阶码是8bit,能够表示的范围是0-255。阶码转换成小数计算时,需要减127(IEEE754规定,为了方便计算)。阶码设置成不同的值代表的含义不同,分为下面三类:
(1)正常阶码:1-254
(2)特殊阶码:255
(3)特殊阶码:0
以上三类阶码的具体作用将结合尾数进行介绍。
1.3 尾数
尾数占据23bit,结合三类阶码分别介绍:
(1)正常情况:即阶码是1-254
这种情况下:尾数23bit全部位于小数点后,因此默认小数点前有一位隐藏位:1。
举例:尾数:00…00(23个0),实际上表示的数是1.00…00(23个0)
因此,这种情况下32bit数据转换成小数的公式就是:
1.尾数*2^(阶码-127)【前面加符号位】
举例:
0 00000000001 0…00(23个0)
表示的小数就是:1.000..00*2^(1-127)=1.175e^(-38)
仿真结果:
(2)特殊情况:阶码为255
阶码为255即全1的情况,如果尾数为全0,IEE754规定这是一个无穷大数INF;如果尾数非全0,IEEE754规定这是无效数NAN。
仿真结果:
(3)特殊情况:阶码是0
这种情况下:尾数没有隐藏位,小数点位于尾数第一位与第二位之间。
举例:00…00(23个0)表示的是0.00…00(小数点后22个0)
因此,这种情况下32bit数据转换成小数的公式就是:
(小数点加在第一、二位之间的尾数)*2^(-127)【前面加符号位】
举例:
0 00000000000 0…01(22个0)
表示的小数就是:0.000..01*2^(-127)=2^(-22-127)=1.401e^(-45)
仿真结果:
2. system verilog里浮点数的相关系统函数
Sv提供了几个系统函数来做浮点数和计算机存储数据之间的转换。
2.1 $bitstoreal()
作用:64bit的计算机存储整数转换为双精度浮点数,前文已举例。
2.2 $bitstoshortreal()
作用:32bit的计算机存储整数转换为单精度浮点数,前文已举例。
2.3 $realtobits()
作用:浮点数转换为64bit的计算机存储整数
举例:
2.4 $shortrealtobits()
作用:浮点数转换为32bit的计算机存储整数
举例: