当前位置:   article > 正文

System Verilog 中小数的计算、四舍五入的实现_verilog中real能表示小数点后几位

verilog中real能表示小数点后几位

目录

system verilog 中四舍五入问题:

1、real类型数据:

2、int / bit类型数据:

SV中小数的计算:


system verilog 中四舍五入问题:

1、real类型数据:

SV中小数用real类型来表示,IEEE中说明,real类型相当于C中的double类型,shortreal相当于C中的single类型,real的取值范围是3.4E-38 ~3.4E+38 。

real类型的小数想要进行四舍五入,可以扩大一定的倍数后int取整,然后再转换为real类型,再缩小相同的倍数。例:

  1. real check_a;
  2. real check_b;
  3. check_a = 3.0853;
  4. check_b = (real'(int'(check_a*100)))/100; //保留两位小数
  5. check_c = (real'(int'(check_a*1000)))/1000; //保留三位小数
  6. $display("check_b = %0f",check_b);
  7. $display("check_c = %0f",check_c);
  8. 打印结果:
  9. check_a = 3.090000;
  10. check_b = 3.085000;

2、int / bit类型数据:

(1)直接赋值小数,会进行四舍五入取整;

(2)计算过程中,如果有小数,会把小数部分直接截掉,不进行四舍五入;

(3)计算过程中,如果等号右侧表达式中各项乘以1.0,就不会直接截掉小数,会把数据进行四舍五入取整。

  1. int/bit [7:0] check_a;
  2. int/bit [7:0] check_b;
  3. int/bit [7:0] check_c;
  4. int/bit [7:0] check_d;
  5. check_a = 3.99;
  6. check_b = 3.5;
  7. check_c = 3.093;
  8. check_d = check_a + check_b + check_c; // 4+4+3
  9. $display("check_a = %0f",check_a);
  10. $display("check_b = %0f",check_b);
  11. $display("check_c = %0f",check_c);
  12. $display("check_d = %0f",check_d);
  13. 打印结果:
  14. check_a = 4.000000;
  15. check_b = 4.000000;
  16. check_c = 3.000000;
  17. check_d = 11.000000;
  18. -----------------------------------
  19. int/bit [7:0] check_e;
  20. int/bit [7:0] check_f;
  21. check_e = 7/4 + 7/4; //相当于1+1 而不是1.75 + 1.75
  22. check_e = 1.0*7/4 + 1.0*7/4; //相当于2+2
  23. $display("check_e = %0f",check_e);
  24. $display("check_f = %0f",check_f);
  25. 打印结果:
  26. check_e = 2.000000;
  27. check_f = 4.000000;

计算时如果想要四舍五入,可以在表达式的最左侧乘以1.0,,乘在右侧无效。

例:

  1. int check_c;
  2. check_c = 1.0*6/4;
  3. $display("check_c = %0f",check_c);
  4. check_c = (6/4)*1.0; //乘在右侧无法四舍五入
  5. $display("check_c = %0f",check_c);
  6. 打印结果:
  7. check_c = 2.000000;
  8. check_c = 1.000000;

SV中小数的计算:

如果是real类型的数据,直接计算就可以;

如果是int类型的数据,想让小数参与运算,可以将数据按一定的倍数增大计算完后再缩小相同的倍数,缩回原来的倍数后如果结果有小数会被直接截掉取整,不会进行四舍五入。 

如果0.2 x 8= 1.6,那么verilog是取1.6中的整数进行计算,误差就是(1.6-1)/1.6 = 0.375 左右;

如果0.2 x 16= 3.2,那么verilog是用3进行计算,误差范围是0.2/3.2 = 0.0625;

相比之下增大倍数越大同倍数减少时误差范围越来越小,但是不需要夸张的增加放大倍数,通过实际情况,在合理的误差范围内就可以了。

例:

  1. int check_a;
  2. int check_b;
  3. check_a = 7/4 + 7/4; //1+1
  4. check_b = (100*7/4 + 100*7/4)/100; //350/100=3.5 截掉小数
  5. $display("check_a = %0f",check_a);
  6. $display("check_b = %0f",check_b);
  7. 打印结果:
  8. check_c = 2.000000;
  9. check_c = 3.000000;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/522366
推荐阅读
相关标签
  

闽ICP备14008679号