system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

 https://www.cnblogs.com/chenbei-blog/p/4702379.html

  • 类型转换

verilog中,任何类型的任何数值都用来给任何类型赋值。verilog使用赋值语句自动将一种类型的数值转换为另一种类型。

例如,当一个wire类型赋值给一个reg类型的变量时,wire类型的数值(包括四态数值,电平强度,多驱动解析)自动转换为reg类型(有4态数值,但没有电平强度和多驱动解析)。

如果一个real类型被赋值给一个reg类型的变量,浮点数值自动截取为reg字长能够表达的整型数值。

下面这个例子里面,使用临时变量将一个浮点类型结果转换为一个64比特整型值,然后将这个整型值与另一个整型数据相加,结果赋值给一个64比特的reg变量。

1 reg [63:0] a, y, temp;
2 real r;
3 temp = r**3; // convert result to 64-bit integer
4 y = a + temp;

system verilog将verilog的自动转换进行了扩展,增加了一个类型转换操作符。类型转换操作符允许设计者在表达式的任意一个地方指定一次类型转换。类型转换操作符的语法为:

type’(expression)

注意与C的类型转换操作符不同(C中为type(expression))。

使用system verilog类型和类型转换,上述的verilog例子可以减少使用临时变量,具体如下:

1 longint a, y;
2 real r;
3 y = a + longint'(r**3);
  • 位宽转换

在verilog中,表达式的位宽由操作数、操作符和上下文决定。system verilog也遵守同样的规则,不过有所扩展。

system verilog允许一个表达式的位宽转换为一个不同的位宽,可以对一个表达式或者一个操作结果进行一个明确的位宽转换。

位宽转换操作符的语法为:

size’(expression)

一些类型转换的例子:

1 logic [15:0] a, b, c, sum; // 16 bits wide
2 logic carry; // 1 bit wide
3 sum = a + 16’(5); // cast operand
4 {carry,sum} = 17’(a + 3); // cast result
5 sum = a + 16’(b - 2) / c; // cast intermediate result

如果表达式被转换为一个更小的位宽,则表达式中左边最高位的比特被截取。如果表达式被转换为一个较大的位宽,则表达式进行左边位扩展:无符号数左边扩展0,有符号数左边扩展符号位。

这些规则与一个表达式被赋值为另一个位宽的表达式时的位宽转换规则相同。

  • 符号转换

system verilog在确定表达式结果是否有符号时,规则与verilog相同。system verilog同样允许对一个数值进行明切的符号转换。

符号转换的语法如下:

1 signed’(expression)
2 unsigned’(expression)

一些符号转换的例子如下:

1 sum = signed’(a) + signed’(a); // cast operands
2 if (unsigned'(a-b) <= 5)    // cast intermediate result
3    ......

system verilog的符号转换操作符与verilog的系统函数$signed和$unsigned功能一样。符号转换是可综合的。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog,数据类型转换是将一个数据类型转换为另一个数据类型的过程。Verilog使用赋值语句自动将一种类型的数值转换为另一种类型。在进行数据类型转换时,Verilog会根据转换的数据类型进行自动截断、扩展或调整。这种自动转换的规则在不同的情况下有所不同,如赋值、运算等。 Verilog的数据类型转换可以通过不同的方式实现,其最常见的是使用$cast函数。$cast函数用于在不同的数据类型之间进行转换。它可以将一个数据类型转换为另一个数据类型,包括基本数据类型、数组、结构体和枚举类型等。$cast函数的使用格式如下: ``` $cast(target_type, expression) ``` 其,target_type表示要转换的目标数据类型,expression表示要转换的表达式。$cast函数会将expression从原始数据类型转换为target_type,并返回转换后的值。 Verilog的数据类型转换还可以通过静态转换来完成。静态转换是指通过类型转换操作符来显式地将一种数据类型转换为另一种数据类型。在Verilog,常用的类型转换操作符包括`'类型名(表达式)`和`$signed(表达式)`等。其,`'类型名(表达式)`用于将表达式转换为指定的类型,而`$signed(表达式)`用于将表达式转换为带符号的类型。 除了上述明确的数据类型转换方式,Verilog还存在一些隐性的数据类型转换。这些隐性的数据类型转换Verilog编译器根据上下文自动进行的转换,以保证赋值的兼容性。这种隐性的数据类型转换可能会导致一些不期望的结果,特别是在枚举类型和数据流。因此,在进行数据类型转换时,需要注意类型的兼容性,以避免出现错误的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值