数值类型
简单的区分,相比于Verilog,SV引入了一个数据类型logic用来概括寄存器类型reg和线网类型wire。
bit为二值逻辑,只可以表示0、1,且bit为 无符号数。
logic为四值逻辑,可以表示0、1、X、Z,且logic也为 无符号数;X代表不确定高低态,Z代表高阻态。
四值逻辑类型:integer、logic(常用)、reg(常用)、net-type(wire、tri) 偏硬件;
二值逻辑类型:byte、shortint、int(常用)、longint、bit(常用) 偏软件;
有符号类型(最高位表征符号):byte、shortint、int、longint、interger;
无符号类型:bit、logic、reg、net-type(wire、tri);(常用)
简单理解:无符号类型,直接二进制读,有符号类型,最高位取反+1。
有符号数转化无符号数:
例:byte a = 8`b1000_0000; (有符号数)
bit [8:0] b; (无符号数)
b=a; // 8位赋给9位,8位高位扩展一位,9`b11000_0000 = `h180
动态转换:$cast(target, source); 将source转换位target类型
四值逻辑转化二值逻辑:
例:logic [3:0] a = `b111x;
bit [2:0] b ;
b=a; // 4位无符号赋给3位无符号,高位截断→11x→110,x转化二值逻辑为0。
定宽数组
一维:int array[16]; int array[15:0];
二维:int array[8] [2]; int array [7:0] [1:0]; //8为高维,2为低维
组合型数组/非组合型数组:
1. 在内存中的存储方式不一样:组合数组:在内存中连续存储,非组合数组:在内存中非连续存储。
2. 赋值方式不一样:组合数组:因为组合数组可以看成矢量,因此只要总的位宽相同,就可以进行互相赋值操作。例如八行九列的数据可以赋值给九行八列的数组,他们的数据总数都是72个。非组合数组则必须维数对齐。
3. 初始化方式不一样:组合数组:因为组合数组可以看成矢量,可以直接初始化。非组合数组:对每一维以数组的方式进行初始化,使用verilog单引号与大括号的结合:`{2`{1,2,3}}
动态数组
1. 内建方法主要有:delete()和size()两个。
2. 动态数组的声明:int a[ ] ; // 仅仅声明,不占空间大小,类似于只有句柄,没有分配空间
3. 动态数组的创建:a = new[1] ; // 给a创建一个int空间
4. 调用new[ ]时将数组名也一并传递,可以将已有数组的值复制到新数组中:b=new[20](a); // new了一个20空间的b,将a的1个值复制给了b,a不变。
联想到之前学习java时,有深拷贝和浅拷贝这个概念,简单理解,引用数据类型在拷贝时,就涉及到这个问题,核心是拷贝的是句柄还是,对象本身。此处拷贝a的值之后,对b的操作不会影响原来a的值,就应该是深拷贝。
深拷贝和浅拷贝的区别就是:拷贝的是对象,还是对象的引用,浅拷贝相当于对象的指针被你拷贝过来了,而新指针指向的还是旧对象。
关联数组
特点:
1. 关联数组可以用来保存稀疏矩阵的元素。当你对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,这种实现方法所需要的空间要小得多。
2. 其它软件语言也有类似的数据存储结构,被称为哈希(Hash)或者词典(Dictionary),可以灵活赋予键值(key)和数值(value)。简单理解就像图书馆上的书,根据地址寻找内容。
关联数组采用在方括号中放置数据类型的方式来进行声明,如:
bit [63:0] assoc[ bit[63:0] ] ; // 以64bit数据为索引,查找关联数组中的64 bit的数据
int age[string]; // 以字符串为索引,查找关联数组中的int类型数据
integer i_array[*]; // 未规定索引类型,通配
关联数组初始化时使用 : '{ }; 在大括号内填入 键值对 的信息,键值对用冒号“:”连接;
data = '{1:20, 2:21, 3:22};
关联数组使用foreach遍历:
foreach(data[i]) begin
$display(“data[%0h] is %0h”,index, data[index]);
end
队列
1. 队列的声明:q[$] = {1, 2, 3},队列元素的标号从0到$.
2. 队列不需要new [ ] 去创建空间,一开始其空间为0。
3. 队列的方法:
push_back() // 在队列的末尾推入新元素;
pop_front() // 在队列的开头推入新元素;
insert(value, position) // 在某位置前插入元素value;
delete() // 删除整个队列。