SV语言——1.数据类型(变量类型、数组、队列、结构体、枚举类型、字符串)

一、变量类型——四值变量与二值变量

变量(信号)类型分为:四值变量和二值变量

四值变量:(0、1、x、z)四种状态

  • wire——主要用在assign语句中,起连接作用,类似金属线;

  • reg——主要用在initial和always语句中,对线路建模;

  • logic——logic是对reg类型的增强,可以被连续赋值语句驱动,可用在assign、initial、always语句中,但不能多驱动。(SV增补)

二值变量:(0、1)两种状态

  • bit——用户自定义位宽大小,无符号变量;
  • byte——8位宽,有符号变量,取值范围:-128~127
  • shortint——16位宽,有符号变量,取值范围:-215~215-1;
  • int——32位宽,有符号变量,取值范围:-231~231-1;
  • longint——64位宽,有符号变量,取值范围:-263~263-1;

有符号变量与无符号变量之间的转化示例:

byte b8; «等价» bit signed [7:0] b8;

四值变量与二值变量的特性:

  • 四值变量的默认初始值为x,二值变量的默认初始值为0
  • 将四值变量赋值给二值变量,x和z状态会转变为0;
  • 系统函数$inunknown(变量名)可以检查表达式中是否存在x或z
    在这里插入图片描述

二、固定数组——非压缩数组与压缩数组

非压缩数组和压缩数组又称非填充数组和填充数组

2.1.非压缩数组

  • 分为一维数组和多维数组;
  • 超出数组边界的写操作被忽略
  • 初始化可以直接赋值,也可以通过for循环或者foreach循环进行初始化;
  • 系统函数$size(数组名)可以返回数组大小;
  • byte、shortint、int型变量都被存放在32位的存储空间中;(浪费存储空间)
  • longint型变量存储在64位空间;

一位数组如下示例:

在这里插入图片描述
在这里插入图片描述
多维数组声明的示例:
在这里插入图片描述
在这里插入图片描述

2.2.压缩数组

  • 将一个数组当成一个值,即一个存储空间,连续存储;

示例如下:

bit [3:0][7:0] bytes;       //数组的维度定义在定量的左侧——压缩数组
bytes = 32'habcd_efab;
$display(bytes,
         bytes[3],
         bytes[3][7]);

   
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
除了非压缩数组和压缩数组之外,还有混合数组,即将非压缩数组与压缩数组混用。如下:
bit [3:0][7:0] p_array [0:2]; 即为一个混合数组

三、动态数组

  • 声明时使用[ ]进行动态数组声明;
  • 在仿真过程中进行分配内存空间和设置数组元素个数;
  • 使用new[]来分配内存空间,传递数组元素的个数;
  • 通过数组名称可以实现整个数组的赋值
  • $size系统函数返回数组元素个数;
  • 动态数组和固定数组之间可以进行相互赋值,但需要满足:(数据类型相同,元素数目相同);
    在这里插入图片描述
    在这里插入图片描述

四、队列

  • 声明时使用[$]进行动态数组声明;
  • 能够迅速分配额外的空间和额外的元素
  • 不需要new[]进行分配空间
  • 支持push(数据入队——写)和pop(数据出对——读)操作;push时自动增补空间,pop后空间不消失;
  • 具有排序和搜索的功能;
  • 支持add和remove元素操作;
    -在这里插入图片描述
  • function int size( ):返回队列中成员数目。如果队列是空的,返回0 。 (对于上述队列 q = `{ };语句即清空队列;)
  • function void insert(int index, queue_type item):在指定的索引位置插入索引成员;
  • function void delete( int index):删除指定索引位置的成员;
  • function queue_type pop_front():删除并返回队列的第一个成员;
  • function queue_type pop_back():删除并返回队列的最后一个成员;
  • function void push_front(queue_type item):在队列的前段插入指定的成员;
  • function void push_back(queue_type item):在队列的后端插入指定的成员;

五、联合数组

  • 声明时使用[*]进行动态数组声明, *为通配符,指代数据变量类型;
  • 动态分配非连续元素,内存空间不连续
  • 联合数组一般较少运用;

六、数组方法

6.1.数组运算方法

  • 求和sum、求积product、与and、或or、异或xor
  • a.sum——单bit数组的求和返回单bit的数值;
  • 求最大值max,求最小值min,唯一化unique;
    -在这里插入图片描述

6.2.数组排序方法

  • 翻转:reverse
  • 乱序:shuffle
  • 升序排列:sort
  • 降序排列:rsort
    在这里插入图片描述

6.3.数组定位方法

  • 查找元素:find
  • 查找第一个元素:find_first
  • 查找第一个元素的索引:find_first_with_index
    在这里插入图片描述
    在这里插入图片描述

七、结构体

  • 结构体相当于是对一组数据类型的封装,是一组变量的集合,可以作为一个整体进行操作;
  • 一般使用结构体的名字对其中的变量进行操作
  • 结构体默认情况下是非填充的,当然也可以使用关键字packed将其声明为填充型的;
  • 可以使用关键词typedef来定义结构体,实现对同一个结构体的多次例化增强结构体的重用性;

在这里插入图片描述
使用关键词typedef来定义结构体:
在这里插入图片描述

八、枚举类型

  • 抽象变量代表一个数值序列,也可以自定义每一个变量的数值,所有的数值必须唯一
    在这里插入图片描述

  • 枚举类型中的各个变量默认类型为int型
    在这里插入图片描述

  • 允许显示指定各个变量的基础类型,如bit、logic等;
    在这里插入图片描述

  • 使用方法同结构体类似,也可以通过typedef关键字进行定义
    在这里插入图片描述
    注意$cast()强制类型转换的使用方法

九、字符串变量

  • 字符串类型(string)是一个大小可变、动态分配的字节数组。字符串文本为一个具有宽度为8的整数倍的压缩数组
  • 在未赋值的情况下,string类型的变量初始值为空字符 “ ”
  • 可以使用系统函数$psprintf()生成字符串;
  • 字符串类型变量具有内建的操作符和函数,len(), getc(), putc(),substr()等;
    在这里插入图片描述
                                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/weixin_46022434/article/details/105387646&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-ff98e99283.css" rel="stylesheet">
                            </div>