提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
本文主要针对以上内容学习,进行思考与总结。
1.溢出的概念
主要针对有符号数的加减,当数据的值太大而无法使用可用的数据格式表示时,就会溢出。如果大于这个范围,就是上溢出;如果小于这个范围,就是下溢出。
2.溢出有哪几种类型
2种。underflow、overflow。
- 在SystemVerilog中,下溢(underflow)现象通常发生在有符号数的运算中,当一个数变得比它能表示的最小值还要小时,就会发生下溢。在有符号数的表示中,每个类型都有一个最小值和最大值,例如,一个8位的有符号整数可以表示的范围是-128到127。
当下溢发生时,由于数值已经超出了该类型能表示的最小范围,SystemVerilog会按照特定的规则来处理这种情况。通常,对于有符号数,下溢会导致该数变为该类型能表示的最大值。这是因为计算机中的数值表示是基于二进制补码(two’s complement)的,当下溢发生时,二进制表示的位数会进行翻转,并加上1,从而得到该类型的最大值。
为了更具体地说明下溢现象,我们可以看一个例子:
假设我们有一个8位的有符号整数A,其初始值为-128(二进制表示为1000 0000)。如果我们尝试对A进行减1操作(即A = A - 1;),由于-128已经是8位有符号整数的最小值,因此这个操作会导致下溢。
在下溢发生后,A的二进制表示会变为0111 1111,这是8位有符号整数的最大值127的二进制表示。因此,尽管我们对A进行了减1操作,但A的值却从-128变为了127。
需要注意的是,下溢现象通常发生在有符号数的运算中。对于无符号数来说,由于其没有负数表示,因此不会发生下溢现象。相反,如果无符号数变得比它能表示的最大值还要大,就会发生上溢(overflow),此时该数会变为该类型能表示的最小值(即0)。 - 在SystemVerilog中,上溢(overflow)现象发生在数的运算过程中,当一个数变得比它能表示的最大值还要大时,就会导致上溢。这种情况通常发生在有符号数或无符号数的运算中。
对于有符号数来说,上溢会导致该数变为该类型能表示的最小值。这是因为在计算机中,有符号数通常采用二进制补码(two’s complement)表示。当一个有符号数超过其能表示的最大值时,它的二进制表示会进行翻转(即所有位都取反),并加上1,从而得到该类型的最小值。
对于无符号数来说,上溢也会导致类似的结果,但处理方式略有不同。由于无符号数没有负数表示,因此当它们超过能表示的最大值时,会回绕(wrap around)到该类型能表示的最小值(即0)。这是因为在无符号数的二进制表示中,最高位(即最左边的位)不是符号位,而是数值位的一部分。因此,当最高位溢出时,它会从0变为1(或反之),而其他位则保持不变(或进行进位),从而导致整个数值回绕到最小值。
为了更具体地说明上溢现象,我们可以看一个例子:
假设我们有一个8位的无符号整数B,其初始值为255(二进制表示为1111 1111)。如果我们尝试对B进行加1操作(即B = B + 1;),由于255已经是8位无符号整数的最大值,因此这个操作会导致上溢。
在上溢发生后,B的二进制表示会变为0000 0000,这是8位无符号整数的最小值0的二进制表示。因此,尽管我们对B进行了加1操作,但B的值却从255变为了0。
3.溢出之后会有什么影响?
- 数据错误或者不准确
- 系统行为异常
- 信号失真
- 性能下降
- 可靠性问题
4.溢出发生在什么情况下?
- 模拟-数字转换
- 算法运算加减
5.处理方式
- 回卷。当数字扩展超过了范围的顶部,它就回卷到范围的底部。反之亦然。一旦出现回卷,信号将发生明显错误。
- 饱和。当数字扩展超过范围时,将其饱和到最大范围值。例如,8位有符号二进制的范围为-128~127,当表示的数为132时,不会回卷到-124,而是饱和到127,这样信号会发生失真。
- 选择合适的数据类型