ARM技术论坛
直播中

訾存贵

7年用户 920经验值
私信 关注
[经验]

浅析System Verilog中的整数数据类型

Data Types

Verilog提供了reg和wire数据类型,但是对于功能验证来说远远不够,所以SystemVerilog提供了很多更加丰富的数据类型,下面将一一介绍。

我们先来考古下,一开始Verilog中的“reg”是用来建模时序逻辑(触发器或者锁存器)的,后来对这个概念进行了扩展:

reg就是一个变量,也可以用来建模组合逻辑。

Systemverilog进一步进行了扩展,引入了logic变量,从此大一统。

另外,追随潮流。SystemVerilog还支持了面向对象的特性,以支撑功能验证环境的模块化和可重用需求。

Integer Data Types

整数数据类型可以不同维度进行划分:

  1. 2-state vs. 4-state类型(4种状态是“0”“1”“x”和“z”;2种状态是“0”和“1”)
  2. signed vs. unsigned类型

image.png

Integer, int, longint, shortint, logic, byte, reg

  1. int、longint和shortint是2-state signed整数数据类型
  2. “integer”是4-state signed整数数据类型
  3. “reg”和“logic”是 4-state unsigned的整数数据类型

下面是一个关于整数数据类型的示例:

integer a; //4 state - 32 bit signed
 int b; //2 state - 32 bit signed
 shortint c; //2 state - 16 bit signed
 longint d; //2 state - 64 bit signed
 logic [7:0] A1; //4-state - unsigned ‘logic’
 logic signed [7:0] sl1; //4-state - signed ‘logic’
 byte bl1; //2-state signed ‘byte’
 reg [7:0] r1; //4-state - unsigned ‘reg’
 initial
     begin
         a = 'h xxzz_ffff; //integer - 4 state - 32 bit signed
         b = -1; //int - 2 state - 32 bit signed
         c = 'h fxfx; //shortint - 2 state - 16 bit signed
         d = 'h ffff_xxxx_ffff_zzzz; 
         //longint - 2 state - 64 bit signed
         A1 = -1 ; //signed assignment to unsigned 'logic’
         sl1 = -1; //signed assignment to signed 'logic'
         bl1 = -1; //signed byte
         r1 = 8'b xzxz_0101; //'reg' - unsigned 4-state 
     end
 initial
     begin #10;
         $display("a = %h b = %h c = %h d = %h", a, b, c, d);
         $display("A1 = %0d sl1=%0d bl1 = %0d r1 = %b",A1,sl1,bl1,r1);
         #10 $fnish(2);
     end 
 endmodule

在本例中,

  1. 将a、b、c和d分别定义为integer、int、shortint和longint类型。
  2. 将“A1”定义为8-bit unsigned logic类型。
  3. 将“sl1”定义为“signed logic”类型
  4. 将“bl1”定义为“signed byte”类型
  5. 将“r1”定义为8-bit “unsigned reg ”类型

在testbench中,我们为每个变量赋值不同的数字。其中一些赋值中有“x”,以显示2-state vs. 4-state变量如何处理“x”。

我们还为一些变量赋值正负值,看看signed vs. unsigned 变量的区别:

仿真log:

a = xxzzffff 
b = ffffffff 
c = f0f0 
d = ffff0000ffff0000
A1 = 255 
sl1= -1 
bl1 = -1 
r1 = xzxz0101

V C S S i m u l a t i o n R e p o r t
  1. 赋值a='hxxzz_ffff,其中" a "是unsigned 4-state的整数类型(integer)。因此,仿真日志显示“a”保留“x”为“x”,“z”为“z”。
  2. 赋值b =−1,其中“b”是signed 2-state类型(int)。由于我们将“b”显示为十六进制值,因此“b”仿真log打印为“ffffffff”,相当于十进制−1。也就是说,因为b是有符号的,它的有符号赋值依然保持为有符号。
  3. 赋值c = ' h fxfx,其中" c "是一个2-state signed类型(shortint )。因此,仿真显式“c”的值是“f0f0”。因为“x”被转换为“0”,因为在2-state变量中没有“x”状态。
  4. 赋值d = ' h ffff_xxxx_ffff_zzzz,其中“d”是一个2-state signed类型(longint )。将“x”转换为“0”,将“z”转换为“0”。因此仿真显示值为“ffff0000ffff0000”。
  5. 赋值A1 =−1,其中“A1”是unsigned logic类型。注意,“A1”是无符号的,但是我们给它赋了一个负值。因此,它将把-1转换为255,仿真log显示A1 = 255。
  6. 赋值sl1 =−1,其中“sl1”是signed logic 类型。因此,“- 1”的赋值保持为“- 1”。
  7. 赋值bl1 =−1,其中bl1是2-state signed数据类型(byte)。因此,被赋值的负值也被保持。
  8. 赋值r1 = 8'b xzxz_0101,其中r1是unsigned 4-state类型“reg”。因为它是一个4-state类型,它将保留" x "和" z "。

unsigned 4-state “logic” 和unsigned 4-state “reg”是等价的,它们之间没有区别。“reg”被保留是出于历史遗留的原因。

此外,还可以显式地将有符号的数字赋值给变量。例如,1 'sb1是有符号数赋值,而1 ' b1是无符号赋值。

logic [7:0] L1 ;//unsigned logic type
L1 = 4’sb1001; //= 8’b11111001 //Sign extension          
L1 = 1’sb1; //= 8’b1111_1111 //Sign extensionL1 = 8’sb1; //= 8’b0000_0001 //NO sign extension because of //explicit width being same as vector declaration
L1 = 8’sbX; //=8’bxxxx_xxxx

原作者:验证哥布林

更多回帖

发帖
×
20
完善资料,
赚取积分