SystemVerilog运算相关的问题
前言:在Verilog/SystemVerilog中,我们常用的是整数(bit、int、longint),然而有时也会用到小数,小数可以用(real)来声明,对小数的处理大致分为三种:
- 四舍五入
- 向上取整
- 向下取整
那么这三种如何实现呢?本文将给出一些例子:
一、四舍五入
- 如果除数和被除数均为整数,可以通过乘以1.0来实现
bit [7:0] resync_times;
bit [7:0] resync_period;
bit [12:0] sync_period;
bit [13:0] sync_length;
bit [63:0] sync_length_tmp;
$display("164 * 8 * 1.0 / 28 = %0d", 164 * 8 * 1.0 / 28);
二、向上取整
- 通过系统函数$ceil即可实现
sync_length = $ceil(real'( (resync_period + sync_period) * resync_times * 2 / 1.83 / 3 ) );
- Note: 特别注意,计算过程中不能出现溢出的情况,例如:当resync_times=4,resync_period=60,sync_period=3750时,(resync_period + sync_period) * resync_times * 2 = 30480,15bit数,此时计算溢出。
- 所以此处该分步计算,引入中间变量sync_length_tmp
sync_length_tmp = (resync_period + sync_period) * resync_times * 2;
sync_length_tmp = $ceil(real'(sync_length_tmp / 1.83 / 3 ));
sync_length = sync_length_tmp;
三、向下取整
- 通过系统函数$floor实现
sync_length = $floor(real'( (resync_period + sync_period) * resync_times * 2 / 1.83 / 3 ) );
四、特別說明:
- $ceil和$floor只參數接受int 和real類型,不接受bit類型或int unsigned;
- 對於int 類型,它代表有符號整數,其取值範圍是-32'h7fffffff ~ 32'h7ffffffe,不是0~ffffffff;
No. Data Type Desrciption 1 bit 雙狀態,單比特 2 int unsigned 雙狀態,32比特無符號整數 3 int 雙狀態,32比特有符號整數 4 byte 雙狀態,8比特有符號整數 5 shortint 雙狀態,16比特有符號整數 6 longint 雙狀態,64比特有符號整數 7 integer 四狀態,32比特有符號整數 8 time 四狀態,64比特無符號整數 9 real 雙狀態,雙精度浮點數 10 byte unsigned 雙狀態,8比特無符號整數