关于systemverilog里的浮点数

前言

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.尾数*2^{阶码-1023}【前面加符号位】

举例:

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的计算机存储整数

举例:

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值