(完整)Systemverilog数据类型总结,推荐文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
System verilog数据类型总结
1 逻辑数据类型(logic)
可替reg和wire,但是不能有多个驱动,有多个驱动的信号还是要定义成wire型
2 双状态数据类型(只有0/1两个状态)
无符号:bit
有符号:byte
shortint
int
longint
$sunknown操作符可检查双状态数据类型位是否出现X、Z状态,若出现,返回1例If ($sunknown(iport)==1)
$display( )
3 定宽数组
1)声明:
在数组声明中允许给出数组宽度
如:int c_style[16] 等同于int c_style[15:0] //16个整数
2)多维数组
int array[8][4];
int array [7:0][3:0];//8行4列数组
array[7][3]=1 //设置最后一个元素为1
从越界地址中读数,SV返回数组元素缺省值
四状态类型,返回X;
双状态类型,返回0;
3)存放:
32比特字边界存放数组元素
4)非合并数组声明:bit[7:0] b_unpack[3]
低位存放数据
5)常量数组
声明:单引号和大括号初始化数组
例:int a[4] = '{0,1,2,1}; //4个元素初始化
int b[5];
a[0:2] = '{1,2,2}; //为前三个元素赋值
b = '{5{1}}; //5个值全为1
a= '{3,2,default:1} //为没有赋值元素,指定缺省值1, a='{3,2,1,1} 4 基本数组操作
1)遍历数组---for /foreach
foreach要指定数组名,且要用方括号中给出索引变量
initial begin
bit[31:0] arc[5],drc[5];
for(int i=0;i<$size(src);i++)
src[i]= i;
foreach (drc[j])
drc[j]=src[j]*2;
end
多维数组遍历foreach语法用[ i,j], 如int mid[2][3]='{'{1,2,3},'{3,4,5}} foreach(mid[i,j])
2)比较和复制
聚合比较和赋值(适用于整个数组而非单个元素)
比较只有等于和不等于比较
可使用?:操作符比较
$display ("src[1:4] %s dst[1:4]", src[1:4]==drc[1:4]? "==":"!==");
3)赋值src=drc //drc所有元素赋值给src
src[3]=4; //第三个元素赋值为4
4)同时使用数组下标和位下标
如指定第一个数组的第一位和第二位:
bit[31:0] src[5] = '{5{5}};
$display ("src[0],, //'b101
src[0][2:1] ); //'b10
5)合并数组
连续的比特集存放,既可以当成数组,也可以当单独数据,如32比特数据,可以看成4个8比特数据
合并的位和数组大小必须放在变量明前指定
如bit[3:0] [7:0] byte1; //四个8比特数组成32比特
byte1[2][7] //第3个字节的第8位
合并/非合并混合数组(详见SV验证测试平台编写指南P26)
和标量进行相互转换,建议使用合并数组,如以字节或字对存储单元进行操作,需要等待数组中变化,必须使用合并数组,如用@()等待触发,只能用标量或合并数组
5 动态数组
仿真过程中再分配空间或调整宽度,在声明时用空的[ ],在执行过程中使用new[]操作符分配空间,[ ] 内给定数组宽度
int dyn[],d2[];
initial begin
dyn = new[5]; //分配5个元素
foreach (dyn[j]) dyn[j]=j;//对元素进行初始化
d2=dyn //复制dyn
dyn=new[20](dyn);
dyn.delete(); //删除所有元素
想声明一个常数数组但不想统计元素个数,可以使用动态数组
bit[7:0] mask[ ] = '{3'b101,3'011};
数据类型相同,定宽数组和动态数组之间可以相互赋值
6 队列
结合链表和数组优点:1)可在队列任何地方添加,删除元素;动态数组需要分配新的数组并复制元素的值2)可通过索引实现访问元素;链表需要遍历目标元素之前的元素
声明:[$]
int j=1;
q2 [$] = {3,4} , //队列常量不需要使用’
q [$] = {0,2,5};
initial begin
q.insert(1,j); // {0,1,2,5}
q.delete(1); // {0,2,5} 删除第一个元素
q.push_front(6) //{6,0,2,5}
q.push_back(8) //{6,0,2,5,8}
q[$,2] //$放最左边,代表最小值0;$放最右边则代表最大值
7 关联数组
用来保存稀疏矩阵的元素,只为实际写入的元素分配空间
8 数组方法
数组缩减sum/product/and/or/xor 注意位宽
定位方法min/max/unique/find
数组排序re verse/sort/rsort/shuffle
9 枚举类型
10 表达式位宽可强制转换
bit [7:0] b8;
bit one= 1'b1;