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

  • 类型转换

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

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

若是一个real类型被赋值给一个reg类型的变量,浮点数值自动截取为reg字长可以表达的整型数值。函数

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

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))。code

使用system verilog类型和类型转换,上述的verilog例子能够减小使用临时变量,具体以下:blog

1 longint a, y;
2 real r; 3 y = a + longint'(r**3);

 

  • 位宽转换

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

system verilog容许一个表达式的位宽转换为一个不一样的位宽,能够对一个表达式或者一个操做结果进行一个明确的位宽转换。io

位宽转换操做符的语法为:ast

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功能同样。符号转换是可综合的。

相关文章
相关标签/搜索