SV芯片验证之动态数组、队列、关联数组

这篇具有很好参考价值的文章主要介绍了SV芯片验证之动态数组、队列、关联数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

声明:本内容来自于学习路科验证发布在B站上的免费视频课程后的笔记

一、动态数组

可以重新确定大小。

1、声明时需要用[ ],表示不会在编译时为其指定大小,而是在仿真运行时来确定大小

它在一开始如果没有做初始化或者赋值,那么就为空,需要使用new[ ]来给它分配空间。 

int dyn[], d2[];

initial begin
  dyn = new[5]; //分配5个元素的空间,且因为是二值逻辑int,所以元素值默认是0.
  foreach (dyn[j]) dyn[j] = j; //使用循环初始化动态数组里的5个元素
  d2 = dyn; //将dyn这个动态数组复制给d2这个动态数组
  d2[0] = 5; //然后给d2里面的第一个元素赋值5
  $display(dyn[0], d2[0]); //将两个动态数组的第一个元素打印出来
  dyn = new[20]; //重新给dyn分配20个元素的空间,这样后,之前的五个元素就不在了。 
  dyn = new[20](dyn); //重新给dyn分配20个元素的空间的同时把原来的5个元素值拷贝到新的空间里去
  dyn = new[100]; //Allocate 100 new ints,重新分配100个元素的空间,之间的元素都消失了。

  dyn.delete(); //删除所有元素
  dyn = new[0]; //清空动态数组里的元素
  dyn = '{}; //清空动态数组里的元素
  d2 = '{1}; //给d2赋值1个值为1的元素
end

null只会与句柄(类)有关!

2、它的赋值方式与非组合型数组做类比。

此处我的理解是:默认每一个元素都是32位,那么正常来说就有128位,但结果只会截取后面的32位,也就是00000044。

vec1 = {'h11, 'h22, 'h33, 'h44}; //拼接出来的结果是vec1 = 00000044,因为编译时默认是32位的。

vec2 = {8'h11, 8'h22, 8'h33, 8'h44}; //加上位宽8,这样拼接出来的结果才是是vec2 = 11223344。

3、内建方法

1)size()可以返回动态数组的大小;

dyn.size();

2)delete()可以清空动态数组,使其大小变为0;不可以传参

dyn.delete();

dyn.delete(2); //仿真时会报错

4、动态数组在声明时就可以完成初始化

bit [7:0] mask[] = '{8'b0000_0000, 8'b0000_0001, 8'b0000_0011};

二、队列

1、特性

1)结合了数组和链表;

2)可以在队列的任何位置添加或者删除其数据成员;

3)可以通过索引来访问队列中的任何一个数据成员;

4)用[$]来声明队列,队列的索引值从0到$

q[$] = {0,1,2};

2、内建方法

1)push_back(val)、push_front(val)、pop_back()、pop_front()顺序添加或者移除且获得数据成员。

2)通过内建方法insert(position, value)来在指定位置上插入数据成员(value只能是数值,而不能是队列)。

q.insert(3,q2); //编译时会报错,不能插一个队列

将一个队列的数据插入到另一个队列中,可以用拼接的方式。 

3)通过内建方法delete()来删除队列中的所有数据成员,同时也可以传参,如:q.delete(2)

int j = 1, q2[$] = {3,4}, q[$] = {0,2,3}; //声明两个队列的同时给它们赋了初值

initial begin
  q.insert(1,j); //{0,1,2,3},在索引值为1的前面插入j的值。
  q.delete(1); //{0,2,3},将数据为1的元素删除

  q.push_front(6); //{6,0,2,3} 在队列最前面插入数据6
  j = q.pop_back(); //{6,0,2} 将队列的最后一个数据3移除并赋值给j。()可加可不加
  q.push_back(8); //{6,0,2,8} 在队列的最后插入数据8
  j = q.pop_front(); //{0,2,8} 将队列的最前面一个数据6移除并赋值给j
  
  foreach (q[i])
    $display(q[i]); //打印整个队列里的数据成员
  q.delete();  //{} 删除队列里的所有数据成员
end
int j = 1, q2[$] = {3,4}, q[$] = {0,2,5};

initial begin
  q = {q[0], j, q[1:$]}; //{0,1,2,5},将{0},{1},{2,5}拼接起来
  q = {q[0:2], q2, q[3:$]}; //{0,1,2,3,4,5},将队列q2插入到队列q中
  q.insert(3,q2); //编译时会报错,不能插一个队列
  q = {q[0], q[2:$]}; //{0,2,3,4,5}, 删除成员1

  q = {6,q}; //{6,0,2,3,4,5}, 插入到最前面
  j = q[$]; //j = 5 
  q = q[0:$-1]; //{6,0,2,3,4}
  q = {q,8}; //{6,0,2,3,4,8},插入到最后面
  j = q[0]; //j = 6
  q = q[1:$];

  q = {}; //删除所有元素成员
end

三、关联数组associated array

又被叫做HASH/字典dictory

目的是为了更灵活地存放散列的数据成员,散列的索引值index的类型可以是除去整型以外的任何类型,如字符串、句柄,而且散列存储的数据成员也可以是任意类型的

通过内建方法delete()来删除关联数组中的所有数据成员,同时也可以传参,如:assoc.delete(2)

四、数组的方法

1、把一个数组缩减成一个值

  • sum,对数组中的所有元素求和。
  • product,对数组中的所有元素求积;
  • and,对数组中的所有元素求与;
  • or(或), xor(异或)...

byte b[$] = {2, 3, 4, 5};

int w;

w = b.sum(); // 2+3+4+5 = 14
w = b.product(); //2*3*4*5 = 120
w = b.and(); //2&3&4&5 = 0000_0000(写成二进制数后再相与,比如 2 = 0000_0010)

2、对于非组合型数组,使用定位方法

它的返回值都是一个队列而不是数组里的元素成员(数值)

int f[6] = '{1,6,2,6,8,6};

int d[ ] = '{2,4,6,8,10};

int q[$] = {1,3,5,7};

int tq[$]; //临时队列用于存放数据

tq = q.min(); //{1}

tq = d.max(); //{10}

tq = f.unique(); //{1,6,2,8}

3、find with方法查找满足条件的数据成员

int d[ ] = '{9,1,8,3,4,4}, tq[$];

tq = d.find with (item>3); //{9,8,4,4}, 找到大于3的所有元素

tq = d.find_index with (item>3); //{0,2,4,5},找出元素值大于3的索引值

tq = d.find_first with (item>99); //{},找出元素值大于99的第一个元素

tq = d.find_first_index with (item == 8); //{2},找出元素值等于8的索引值

tq = d.find_last with (item == 4); //{4} 找到最后一个元素值等于4

tq = d.find_last_index with (item ==4); //{5},找到最后一个元素值等于4的索引值

4、通过排序改变数组中元素的顺序

int d[] = '{9,1,8,3,4,4};

d.reverse(); //'{4,4,3,8,1,9}

d.sort(); //'{1,3,4,4,8,9}

d.rsort(); //'{9,8,4,4,3,1}

d.shuffle(); //'{9,4,3,8,1,4}

动态数组、队列、关联数组具有内建方法size(),定长数组不具有。文章来源地址https://www.toymoban.com/news/detail-595099.html

到了这里,关于SV芯片验证之动态数组、队列、关联数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SV中的clocking时钟块

    采样时发生竞争 (delta cycle的存在),会导致采样数据错误。为了避免在RTL仿真中发生信号竞争的问题,建议通过非阻塞赋值或者特定的信号延迟来解决同步问题。这里我们介绍使用 clocking时钟块 来决定信号的驱动和采样的方式。 在RTL仿真时,由于无法确定具体电路的延迟

    2024年02月15日
    浏览(28)
  • 【SystemVerilog 之数据类型】~ 数据类型、Logic 类型、数组(定宽数组、动态数组、队列、关联数组、链表)

    四值变量 :(0、1、x、z)四种状态 四值逻辑类型 :integer、logic、reg、net-type(如 wire、tri)、time(64bit的无符号整数); SV 并不太常用变量类型是 wire(assign 语句中)还是 reg(initial 和 always 语句中)。logic 用的比较多。可以被连续赋值语句驱动,可用在 assign、initial、always 语句

    2024年01月22日
    浏览(30)
  • (十二)SV的断言

    断言又被称为监视器或者检验器,在设计验证流程中被广泛使用, 用于描述设计的属(property),可以完美地描述时序相关的状况,用于描述设计期望的行为,从而检验设计实际行为是否与设计意图相符 ,如果允许的设计属性不符合我们的期望,则断言失败;如果被禁止的设计

    2024年02月09日
    浏览(30)
  • SV学习——数据类型(1)

    SV中引入新的数据类型logic,SV作为侧重于验证的语言,并不十分关切logic对应的逻辑应该被综合位寄存器还是线网,因为logic被使用的场景如果是验证环境,那么它只会作为单纯的变量进行赋值操作。 引入的一个新的四态数据类型logic,可以代替reg;但是不能用在双总线和多驱

    2024年01月21日
    浏览(30)
  • sv,verilog

    在 Verilog 中,敏感列表(Sensitive List)指的是在 always 语句块中使用时钟信号的列表。敏感列表用于指定 always 块所监控的输入信号,在这些信号状态发生变化时, always 块会被触发执行。 在 Verilog 中, always 块有两种敏感列表: 电平敏感列表(Level-Sensitive List):较早的 Ver

    2024年02月04日
    浏览(30)
  • SV重要知识点

    1、#、wait、@三者的区别: 1)关于‘#’ a. 后面可以添加单位时间的耗时语句 b. 后面添加()可以传递参数 2)wait跟@的区别是: @是边沿敏感触发,而wait是电平敏感触发 wait只等待一次,@每时每刻都在等待(不在always限制下) 如何打印各种类型的变量? 结构体指针:%p 八、

    2023年04月12日
    浏览(33)
  • SV-298XT IP网络广播板 SV-298XT-共公广播音频模块IP网络广播板

    SV-298XT IP网络广播板 SV-298XT-共公广播音频模块IP网络广播板 SV-298XT网络广播模块是一款全数字网络型广播模组,核心部分采用了成熟的私有协议解决方案,性能稳定可靠。支持TCP、UDP、组播协议能针对当前服务器中不同的广播任务设置不同的广播传输方式。以太网传输可实现

    2024年01月15日
    浏览(33)
  • SV学习——数据类型(第二章)

    verilog有1995和2001版本,而SV是verilog的延伸,SV发布的时候直接就是3.0,之后可能不再存在verilog,而是统一用SV。SV是完全兼容verilog的。verilog文件以.v结尾,SV文件以.sv结尾。语法是全部兼容的,SV是verilog的扩展和延伸。 verilog中有reg和wire两种数据类型,都是四值逻辑 0,1,x,

    2024年02月10日
    浏览(67)
  • Soem配置汇川SV660N

    本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star​​​​​​​ 目录 1. ETherCAT 状态机 2. SOEM配置过程 2.1 IP初始态转预运行 2.2 预运行转安全运行 2.3 安全运行转运行 2.4 运行状态 EtherCAT 设备必须支持4 种状态,负责协调主

    2024年02月04日
    浏览(34)
  • 【system verilog】SV Assertion 断言

    SystemVerilog Assertion(SVA)–断言 一言以蔽之:断言是设计属性的描述。 如果一个在模拟中被检查的属性(property)不像我们期望的那样表现,那么这个断言失败。 如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。 一系列的属性可以从设计的功能描述中推

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包