赞
踩
之前写了写简单的verilog入门小例子,感觉写测试自己会比较吃力,写设计状态机啥的倒是觉得还可以,所以作为一个软件测试人,决定了解了解硬件验证,开启新篇章:system verilog。
这个数据类型类似reg和wire的改版,可以作为一个保存数据的变量,接受单驱动,且可以被连续赋值。
双状态:0/1
四状态:0/1/x/z
使用$isunkown(表达式变量)如果==1,那么表达式变量中有x或z存在。
int arr[0:15];//类verilog声明
int arr[16];//类c声明
int mularr[0:7][0:3];//8行4列数组
int mularr2[8][4];//同上
二状态类型数组:返回0
四状态类型数组:返回x
int a[4] = '{1, 2, 3, 4};//初始化赋初值
int a1[5];
a1 = '{1, 2, 3, 4, 5};//赋值
a1[0:2] = '{30, 100, 90};//前三个元素赋值
a1 = '{5{9}};//重复赋值
a1 = '{9, 8, default:1};//其他值赋默认值
int a2[3][2] = '{'{1, 2}, '{3, 4}, '{5, 6}};//多维数组赋值
for(int i = 0; i < $size(a); i++)
a[i] = 10;
或者使用foreach
foreach(a[j])
a[j] = a1[j];//foreach自动遍历所有下标元素
foreach(a2[i,j])//遍历多维数组
a2[i][j] = 10;
foreach(a2[i,])//只遍历第一个维度
foreach(a2[,j])//遍历第二个维度
$write("%3d", a2[i][j]);//打印元素
int src[4] = '{1, 2, 3, 4};
int dst[4] = '{4, 3, 2, 1};
src == dst;//判断两个数组的所有元素是否相等
src = dst;//把dst赋值给src
前面提到的数组声明方式均是非合并数组;
合并数组以下:可以看成一个整体标量,也可以拆分成小数组访问使用。
bit[3:0][7:0] bytes;//四个byte组成32bit
bytes = 32'h4444_4444;//可以组合成32bit赋值
bytes[0][1];//可以拆分查询
合并和非合并数组的混用:
bit[3:0][7:0] bytes_array[3];//包含三个合并数组的非合并数组
数组的大小可以在仿真时动态指定。
声明:
int dyn1[], dyn2[];//不指定数组大小
在程序运行的时候动态分配数组大小:
initial begin
dyn1 = new[5];//动态分配空间
dyn2 = dyn1;//可以使用其他数组复制
dyn1 = new[20](dyn1);//扩容并拷贝旧值
dyn1 = new[100];//创建新空间,旧值丢弃
dyn2.delete;//清空,删除所有元素
dyn2 = '{1, 2, 3, 4};//动态数组可以直接赋值不定量的元素
end
结合链表和动态数组的优点,可以在队列的任何地方增加和删除元素,自动扩容
声明:
int q[$];//声明队列
int q1[$] = {1, 3, 4}, q3 = {5, 4};//声明并赋值
q1.insert(1, 2);//在索引1的位置插入元素2 --》也可以:q1 = {q1[0], 2, q1[1:$]};
q1.insert(2, q3);//在索引2的位置插入元素队列q3的所有元素
q1.delete(1);//删除索引为1的元素
q1.push_front(8);//在队列最前端插入元素8
q1.push_back(0);//在队列末尾插入元素0
q1.pop_front;//弹出队列首元素,并返回改值
q1.pop_back;//弹出最后一个元素并返回最后一个元素
foreach(q1[i])
$display("%d", q[i]);//可以遍历队列
q1.delete(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。