2.2定宽数组
相比于 Verilog1995中的一维定宽数组, System verilog提供了更加多样的数组类型,功能上也大大增强。
2.2.1定宽数组的声明和初始化
Verilog要求在声明中必须给出数组的上下界。因为几乎所有数组都使用0作为索引下界,所以 System verilog允许只给出数组宽度的便捷声明方式,跟C语言类似。
例2.4定宽数组的声明
int lo_hi[0:15];//16个整数[0] ... [15]
int c_style[16];//16个整数[0] ...[15]
可以通过在变量名后面指定维度的方式来创建多维定宽数组。例2.5创建了几个ニ维的整数数组,大小都是8行4列,最后一个元素的值被设置为1。多维数组在 Verilog2001中已经引人,但这种紧凑型声明方式却是新的。
例2.5声明并使用多维数组
int array2[0:7][0:3] ;//完整的声明
int array3[8][4]; //紧凑的声明
array2[7][3]=1; //设置最后一个元素
如果你的代码试图从一个越界的地址中读取数据,那么 System Verilog将返回数组元素类型的缺省值。也就是说,对于一个元素为四状态类型的数组,例如logic,返回的是X,而对于双状态类型例如int或bit,则返回0。这适用于所有数组类型,包括定宽数组、动态数组、关联数组和队列,也同时适用于地址中含有X或Z的情况。线网在没有驱动的时候输出是Z。
很多 System Verilog仿真器在存放数组元素时使用32比特的字边界,所以byte,shorting和int都是存放在一个字中,而longint则存放到两个字中。如例2.6所示,在非合并数组中,字的低位用来存放数据,高位则不使用。图2.1所示的字节数组 b_unpack被存放到三个字的空间里。
例2.6非合并数组的声明
bit [7:0] b_unpack[3];//非合并数组
非合并数组会在2.2.6节中介绍。仿真器通常使用两个或两个以上连续的字来存放logic和 integer等四状态类型,这会比存放双状态变量多占用一倍的空间。
2.2.2常量数组
例2.7示范了如何使用常量数组,即一个单引号加大括号来初始化数组(注意这里的单引号并不同于编译器指引或宏定义中的单引号)