sv基础-数据类型(一)

前言

system verilog 对比verilog 增加了大量的数据类型,目标就是让更多会c c++的人员可以来做设计或者验证。

正文

数据类型分类

数据类型主要可以通过四值类型和二值类型
四值类型:输入输出的值可以为四种情况 0、1·、 x、z(没有人驱动的输出就是x,无人驱动输出为z)
二值类型: 输入输出的值可以为两种情况 0 、1
对比verilog 的两种数据类型:寄存器类型reg 和线网类型wire ,sv 引入了相当多的数据类型,
数值类型 | 数据类型 |default 值
-------- | -----
二值数据 | integer logic reg wire tri | 0
四值类型| byte shortint int longint bit | x

有无符号位 数据类型
有符号 integer shortint longint int byte
无符号 bit logic reg wire tri

数据转换

数据类型使用需要的注意点:
数据赋值:不同的数据类型转换需要注意,无符号想有符号转换时先扩展符号位在进行赋值。尽量避免不同的数据类型之间数据进行操作,稍不注意就容易出错。

数据类型转换:type’(expression)

例如:
bit [2:0] a;
integer b;
b = integer’ (a);

位宽转换: size’(expression)

例如:

logic [15:0] a;
logic [16:0] b;
//扩展到相同位宽之后进行加计算
b = a + 16’(3);

符号转换 :signed’(expression) unsigned’(expression)

logic a;
int sum;
sum = signed’(a) + signed’(a);

数组

数组是sv 中新增的一个数据类型,更有利于数据保存处理。

声明方法

一维数据
int a [0:15]//16个cell
int a[16] //同样是16个cell
多维数组
int a[0:7][0:6]
int a[8][7]

初始化方法

int a[2] = '{0,1};//初始化两个cell a[0] =0,a[1] =1
int a[2] = '{0};//仅初始化第一个cell
int a[2] = '{2{0}};//初始化两个cell相同之0,a[0] =0,a[1] =0
int a[2] = '{1,default:0};//初始化第一个cell 为1,后面的都设置为0

基本操作方法

  1. for 循环方法
    bit a[5];
    for(int i =0;i<$size(a);i++)
    a[i] = i;
  2. foreach 方法:自动循环所有cell
    foreach(a[i])
    a[i] = i;

动态数组

声明方法

int a[]
a = new[5] //分配5个cell

初始化方法

与静态数组相同

销毁方法

int a[]
a = new[5] //分配5个cell
a = new[6] //重新分配6个cell ,前面的就回收了
另一种方法:
a.delete()

队列

队列可以在在任何cell中间添加和删除cell。

声明和初始化方法

int a[$] ={3,4}

操作方法

int b=1;
a.insert(1,b);//在第1个元素后添加1
a.delete(1,b);//删除第一个元素之后的元素也就是a[1]
a.push_front(1);//重队列的头插入数据1结果{1,3,4}
a.push_back(1);//重队列的头插入数据1 结果{3,4,1}
c = a.pop_back()//从队列的末尾开始取队列,相当于倒序,
c = a.pop_front()//从队列的头开始取队列,相当于复制读取。
a.delete();//删除队列

关联数组

数组都是紧凑排列的,为了实现散列表的数组方式这里给出了一个关联数组的数据结构。

声明方法

通过方括号中放置数据类型实现 int a[bit] : int为存储数据类型,bit为寻址的类型.

初始化方法

'{};在大括号内写入cell和值,中间使用:
a = '{0:12,3:2}; //初始化cell0 cell3

操作方法

操作方法和数组类似

  1. 遍历
    同样适用foreach
    foreach(a[i])
    $display(“a %h”,a[i])

a.first(1) //第一个cell
a.delete(1) //删除第一个cell

你可能感兴趣的:(system,verilog,systemverilog)