Systerm Verilog的数据类型相对verilog的数据类型有所不同,SV中增加了四状态类型的数据类型,四状态类型是(0、1、X、Z),二状态类型是(0、1),SV的数据类型有:bit(单比特)、int(32比特)、byte(8比特)、integer(32比特、四状态)、time(64比特、四状态)等,其中除了bit是无符号数,其余数据类型都是有符号数,这个要注意。除此之外,SV中还增加了logic类型、四状态,logic类型可以代替verilog中的reg类型,并且logic可以被连续赋值、门单元、模块驱动,但是不能在双向总线建模中使用,也不能被多个驱动。
定宽数组
Verilog中必须给出数组的上下界,SV中则不需要,如下所示:
int a [0:9] 与 int b [10]的声明都是一样的,并且为多维数组中也相同 int a [0:3][0:2] 与 int b [4][3]相同,并且当想获取超过数据界限的值时,在二状态类型的数据类型中,比如获取上面的a[10]时,该值返回为0,在四状态类型的数据类型中,比如获取上面的a[10]时,该值返回为X。
对一个定量数组进行赋值常量,即一个单引号加大括号来初始化:
int a[10] = ‘{0,5,8,9,10,9,5,6,3,10};
此外还有合并数组,可以实现对某个数值取部分值,比如32bit寄存器,可以看做是4个8bit的寄存器,这个时候可以取第一个或第二个8bit的值,这样比较方便,合并数据的结构如下所示,合并数组中的位和数组大小必须在数据类型的前面(数组大小在前,位数在后):
bit [3:0][7:0]int_con; //合并数据
bit [7:0] int_con_n[3] ; //非合并数组
上述合并数组表示4个8比特的数组组成32比特的数组,数组的大小定义为[msb:lsb],即高位在前,低位在后,其中:
int_con = 32'habcd_1234;
int_con[1] 值为 8'h12;
int_con[2][7:3] 值为 5'b1_1001;
动态数组
动态数组声明时,使用下标[ ],即数组的宽度先不给出为动态数组,使用new[ 数组长度 ]操作符来分配空间,动态数组操作如下:
int a[];
begin
a = new[10];
foreach(a[i])
a[i] = i*10;
a = new[20](a); //定义数组a长度为20,并且复制a数组为初始的10个值
end
队列
队列声明的时候下标为[$],队列元素的下标从0到$,如下面所示:
int b,a[$] = {5,6,7};
begin
a.insert(2,3); // a = {5,6,1,7}
a.delete(2); // a = {5,6,7}
a.push_front(6); // a = {6,5,6,7} 其中front为在前面加,back为在队列的尾部加
b = a.pop_back; // a = {6,5,6}其中front为弹出队列首个值,back为弹出队列尾部最后一个值
end
当队列的下标为[$:数字],即表示取队列[0:数字]长度的值,下标为[数字:$],即表示取队列[数字:最大值]长度的值。
可以将定宽数组和动态数组复制给队列。
关联数组
关联数组声明的时候下标为[数据类型],比如[int]或者[bit],如下所示:
begin
bit [31:0] a [bit[31:0]];
bit [31:0] b;
b = 1;
repeat(32)begin
a[b] = b;
b = b<<1;
end
a.first(b); //第一个元素
a.delete(b); //删除第一个元素
a.exists(b); //是否存在b元素,返回1或0(双状态)X(四状态)
数组的方法
数据的循环for和foreach使用:
int a[10],b[10];
for(int i=0,i<=$size(a),i++)
a[i] = i;
foreach(b[j])
b[j] = a[j];
多维数组使用foreach中foreach(b[i,j])循环。
$size(数组名)返回的值为数组的长度
$urandom_range($size(array)-1) //生成数组长度内的随机数
a_min = a.min(); //数组a的最小值,返回值为队列
a_max = a.max(); //数组a的最大值,返回值为队列
a_un = a.unique(); //数组a的唯一值,返回值为队列
find
int a []='{5,9,7,9,7,4,1,3,5,6},b[$];
begin
b = a.find with(item > 5); // b = {9,7,9,7,6} 返回大于5的值
b = a.find_index with(item > 5); // b = {1,2,3,4,9} 返回大于5的值索引
b = a.find _first with(item >5); // b = {9} 返回大于5的第一个值
b = a.find_first_index with(item ==5); // b = {0} 返回等于5的第一个索引
同理 a.find_last with()和a.find_last_index with()
a.sort(); //a = {1,3,4,5,5,6,7,7,9,9} 从小到大
a.rsort(); //a = {9,9,7,7,6,5,5,4,3,1} 从大到小
a.reverse()和a.shuffle()都是随机打乱顺序
以上是绿皮书第二章的部分内容总结笔记。