第二章数据类型
和Verilog相比,System Verilog提供了很多改进的数据结构,虽然其中的部分结构最初是为设计者创建的,但对于测试者也同样有用,本章将介绍这些对验证很有用的数据结构。
System Verilog引进了一些新的数据类型,它们具有如下优点。 1) 双状态数据类型:更好的性能,更低的内存消耗。
2) 队列、动态和关联数组:减少内存消耗,自带搜索和分类功能。 3) 类和结构:支持抽象数据结构。
4) 联合和合并结构:允许对同一数据有多种视图(view)。 5) 字符串:支持内建的字符序列。
6) 枚举类型:方便代码编写,增加可读性。
2.1内建数据类型
Verilog-1995有两种基本的数据类型:变量和线网(net)。它们各自都可以有4个取值:0,1,Z和X。RTL代码使用变量来存放组合和时序值。变量可以是单bit或多bit的无符号数(reg[7:0]m),32bits的有符号数(integer),64bits的无符号数(time)或浮点数(real)。若干变量可以被遗弃存放到定宽的数组里。所有的存储都是静态的,意味着所有的变量在整个仿真过程中都是存活的,子程序(routine)不能通过堆栈来保存形式参数和局部变量。线网可以用来连接设计当中的不同部分,例如门和模块实例。大多数设计者使用标量或矢量wire来连接各个设计模块的端口。
System Verilog增加了很多新的数据类型以便同时帮助设计和验证工程师。
2.1.1 逻辑(logic)类型
在Verilog中,初学者经常分不清reg和wire。应该使用哪一个来驱动端口?怎么连接不同的模块?System Verilog对经典的reg数据类型进行了改进,使它除了作为一个变量以外还可以被连续赋值、门单元和模块所驱动。为了区别reg类型,这种改进的数据类型叫做logic。任何使用wire的地方均可使用logic,但要求logic不能有多个结构性的驱动,例如在对双向总线建模的时候。此时需要使用wire类型,例如wire,System Verilog会对多个数据来源进行解析后确定终值。例2.1展示了logic类型在System Verilog中的使用。
2.1.2 双状态数据类型
相比四状态数据类型,System Verilog引入的双状态数据类型有益于提高仿真器的性能并减少内存使用量。最简单的双状态数据类型是bit,是无符号的。另四种带符号的双状态的数据类型是byte,shortint,int和longint,如例2.2所示。
把双状态变量连接到被测设计,如果被测设计试图产生X或Z,这些值会被转换成双状态值,而测试代码可能永远无法察觉。这些值被转换成了0还是1不重要,重要的是要随时检查未知的值得传播。使用($isunknown)操作符,可以在表达式的任意位置出现X或Z时返回1,如例2.3所示。
使用格式符%0t和参数$time可以打印出当前的仿真时间,打印的格式再$timeformat()子程序中指定。3.7节有关于时间值的详细介绍。
2.2 定宽数组
相比于Verilog-1995中的一维定宽数组,System Verilog提供了更加多样的数组类型,功能也大大增强了。
2.2.1 定宽数组的声明和初始化
Verilog要求在声明中必须给出数组上下界限,因为几乎所有数组都使用0作为索引下届,所以System Verilog允许只给出数组宽度的便捷声明方式,跟C语言类似。
可以通过在变量名后面指定维度的方式来创建多维定宽数组,例2.5创建了几个二维的整数数组,大小都是8行4列,最后一个元素的值被设置为1.多维数组在Verilog-2001中已经引入,但这种紧凑型声明方式却是新的。
如果代码试图从一个越界的地址中读取数据,那么System Verilog将返回数组元素类型的缺省值。即对于一个元素为4状态类型的数组。例如logic,返回的是X,而对于双状态类型如int或bit则返回0。这适用于所有数组类型,包括定宽数组、动态数组、关联数组和队列,同时适用于地址中含有X或Z的情况。wire在没有驱动的时候输出是Z。
很多System Verilog仿真器在存放数组元素时候使用32bit的字边界,所以byte,shortint和int都是存放在一个字中,而longint则存放到两个字中。
如例2.7所示,在非合并数组中,字的低位用于存放数据,高位则不使用。图2.1所示的字节数组b_unpack被存到三个字的空间里。如图2.1所示。