【systemverilog】对小数的处理

本文介绍了SV/Verilog中处理小数的方法,包括四舍五入、向上取整及向下取整的具体实现,并提供了示例代码。此外还说明了系统函数$ceil和$floor的使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在sv/verilog中,我们常用的是整数(int, longint),小数可以用(real),对小数的处理大致分为三种:

1. 四舍五入

2. 向上取整

3. 向下取整

这三种如何实现呢?

1.四舍五入

       如果除数和被除数均为整数,可以通过乘以1.0来实现

         i.e.  164*8*1.0/28 =47

bit[7:0] a = 10;
bit[7:0] b1,b2;

initial begin

  b1 = a/6;
  b2 = a*1.0/6;

  $display("b1 = %0d,b2= %0d",b1,b2);
end


result : b1 = 1,b2 = 2

2. 向上取整

    通过系统函数$ceil即可实现

     $ceil(164*8/28) = 47

3. 向下取整

    通过系统函数$floor实现

    $floor(164*8/28) = 46

    164*8/28 = 46(默认条件下,即向下取整)

 

特別說明:

  • $ceil和$floor只參數接受int 和real類型,不接受bit類型或int unsigned;
  • 對於int 類型,它代表有符號整數,其取值範圍是-32'h7fffffff ~ 32'h7ffffffe,不是0~ffffffff;
data typedesrciption
bit雙狀態,單比特
int unsigned雙狀態,32比特無符號整數
int雙狀態,32比特有符號整數
byte雙狀態,8比特有符號整數
shortint雙狀態,16比特有符號整數
longint雙狀態,64比特有符號整數
integer四狀態,32比特有符號整數
time四狀態,64比特無符號整數
real雙狀態,雙精度浮點數
byte unsigned雙狀態,8比特無符號整數

 

### SystemVerilog 中的隐式类型转换规则 在 SystemVerilog 中,隐式类型转换通常发生在表达式的求值过程中或不同数据类型之间的赋值操作中。这些转换遵循一定的规则以确保程序的行为可预测并减少潜在的错误。 #### 1. **基本隐式转换规则** 当两个不同类型的操作数参与运算时,SystemVerilog 尝试将它们转换为相同的类型以便执行计算。以下是常见的隐式转换规则: - 如果其中一个操作数是实数(`real` 或 `shortreal`),另一个操作数会被转换为实数[^2]。 - 对于整型数据类型(如 `int`, `byte`, `longint` 等),如果目标类型具有更大的位宽,则源类型会扩展到位宽较大的类型[^2]。 - 当目标类型较小而发生截断时,高位部分可能会丢失,这可能导致数据精度下降[^2]。 #### 2. **逻辑类型与二进制类型的隐式转换** - `logic` 类型可以隐式地转换为 `bit` 类型,在此过程中,所有的未知状态 (`x`) 和高阻态 (`z`) 均被替换为零 (`0`) [^2]。 - 反之,从 `bit` 到 `logic` 的转换不会改变任何值,因为 `bit` 是一种特殊的两值逻辑形式[^2]。 #### 3. **符号扩展与无符号扩展** - 在涉及有符号和无符号混合的情况下,默认情况下,无符号数值优先级更高[^2]。 - 如果需要将一个较短的有符号数扩展成更长的目标类型,则会发生符号扩展;而对于无符号数来说则是简单的零填充。 #### 4. **数组索引中的隐式转换** 即使数组索引通常是整数类型,某些时候浮点数也可以作为临时替代品来访问特定位置上的元素——不过在此之前它必须先经过取整处理再转化为合适的地址偏移量。 #### 示例代码展示 下面是一些关于如何应用上述原则的例子: ```systemverilog // Example of implicit conversion between real and integer types. program automatic test; initial begin real r_val = 5.7; int i_val; // Implicitly converts the floating-point value to an integer by truncation. i_val = r_val; $display("Real Value: %f", r_val); $display("Integer after Conversion: %d", i_val); // Output will be '5' end endprogram ``` 在这个例子当中,我们看到尽管原始变量是一个带有小数部分的真实数字(`r_val=5.7`) ,但在将其分配给整型变量之后只保留了它的整数成分。 另外还有这样一个情况涉及到不同的宽度以及是否有标记属性的不同组合下的行为表现差异: ```systemverilog module example(); logic signed [7:0] a = -8'd128; // Signed byte (-128) bit unsigned [9:0] b; always_comb begin : proc_b b = a; // Sign extension occurs here due to difference in size & signess // Resulting assignment would yield '-1' as decimal equivalent (all ones pattern). end always @(posedge clk) begin if(b == 10'b1111_1111_11) ... end endmodule ``` 在这里可以看到由于两者之间存在长度差加上一个是带标志版本另外一个却是非负定版故而在复制之前进行了必要的签署延展动作从而使得最终结果呈现出全‘1’的形式即十进制意义上的最大负数值(-1). --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值