SystemVerilog 数据类型、数组、队列和关联数组

数值类型

简单的区分,相比于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. 在内存中的存储方式不一样:组合数组:在内存中连续存储,非组合数组:在内存中非连续存储。


组合型数组存放
非合并数组在数据存储中,一般以字(32bit)来存储数据,典型的byte/int/shortint都是存储在一个字中,longint因为超出了一个字的边界因此存储在两个字当中(64bit空间)。如果数组元素位宽不足一个字,则使用低位存放数据,高位闲置不用。

        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() // 删除整个队列。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容