当前位置:   article > 正文

【学学数字设计验证】-system verilog_中文system verilog数字系统设计

中文system verilog数字系统设计

之前写了写简单的verilog入门小例子,感觉写测试自己会比较吃力,写设计状态机啥的倒是觉得还可以,所以作为一个软件测试人,决定了解了解硬件验证,开启新篇章:system verilog。

数据类型

新增数据类型

logic

这个数据类型类似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(

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号