(三)system verilog验证——数据类型(2)

system verilog验证——数据类型(2)

合并数组与非合并数组

对某些数据类型,希望将其作为一个整体访问,同时也可以分解为许多小单元,sv的合并数组就可以实现这个功能;
声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定;数组大小定义格式必须是[msb:lsb],而不是[size]

bit [3][7:0] b_pack;			//合并型
bit[7:0]b_unpack[3];			//非合并型

在这里插入图片描述
从上图可以得到b_unpack实际会占据3个word存储空间,但是b_pack只会占据1个word存储空间;
(注:当需要和标量进行转换时,使用合并数组会非常方便;如果需要等待数组中的变化,则必须使用合并数组)

动态数组

若在程序运行之前都不知道数组的宽度,为了防止实际的实物量远小于最大值,造成存储空间的浪费。于是system verilog提供了动态数组类型,可以在仿真时分配空间或调整宽度;
      动态数组在声明时使用空的下标[]。则数组宽度不在编译时给出,而在程序运行时指定;因为数组开始是空的,所以需要调用new[]操作符来分配空间,同时在方括号中传递数组宽度;

int a[],b[];
initial begin
    a = new[5];                         //分配5个元素
    foreach(a[j]) a[j] = j;             //对元素初始化
    b = a;                              //复制动态数组
    a = new[20](a);                     //分配20个整数值并进行复制
    a = new[100];                       //分配100个新的整数值
    a.delete();                         //删除所有元素
end

最后调用new[]分配了100个元素,但并不复制原来的值,所有原来20个值就被释放了;

队列

队列与链表类似,可以在队列中任何地方增加或删除元素,但其在性能上的损失比动态数组小得多;
队列与数组类似,可以通过索引实现对任一元素的访问,而不需要像链表去遍历目标元素之前的所有元素;
当元素增加到超过原有空间的容量时,system verilog会自动分配更多的空间,且不用想动态数组那样在性能上付出很大的代价,因为SV会随时记录闲置的空间;
(注:不要对队列使用new()函数构造)

initial begin
    q.insert(1,j);                      //{0,1,2,3}在2之前插入1
    q.insert(3,q2);                     //{0,1,2,3,4,5}在q中插入一个队列
    q.delete(1);                        //{0,2,3,4,5}删除第一个元素

    /
    q.push_front(6);                    //{6,0,2,3,4,5}
    j = q.pop_back;                     //{6,0,2,3,4}
    q.push_back(8);                     //{6,0,2,3,4,8}
    j = q.pop_front;                    //{0,2,3,4,8}

    q.delete();
end

关联数组

SV提供了关联数组的类型,用来保存稀疏矩阵的元素。意味着对一个非常大的地址空间进行寻址时,sv只为实际写入的元素分配空间;

initial begin
    bit[63:0]assoc[bit[63:0]],idx = 1;
    repeat (64)begin
        assoc[idx] = idx;
        idx = idx << 1;
    end
    if (assoc.first(idx)) begin
        begin                                               //得到第一个索引
            do
                $display("assoc[%h] = %h",idx,assoc[idx]);  
                while (assoc.next(idx));                    //得到下一个索引
        end
    end
end

这篇笔记参考《system verilog验证》绿皮书整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字ic攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值