0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中的队列

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-10-31 10:09 次阅读

队列是大小可变的有序集合,队列中元素必须是同一个类型的。队列支持对其所有元素的访问以及在队列的开始或结束处插入和删除。

第0个位置表示第一个元素,第$个位置表示队列的最后一个元素。

队列也是一个一维unpacked数组。队列可用于建模后进先出(LIFO)或先进先出(FIFO) buffer。

data_type queue_name [$ : ];

下面是队列的示例

module dq;
 // A queue of 8-bit bytes – unbounded queue
 bit[7:0] dq1[$];
 // A queue of strings – unbounded queue
 string mname[$] = { "Bob" };
 // An initialized queue – unbounded queue
 bit[15:0] dq2[$] = { 3, 2, 7, 1 };
 // A bounded queue – size = 256. Maximum index @255.
 bit q2[$:255];
 //bit q2[255:$]; // Compile ERROR – invalid syntax
 int dq2_size;
 initial
 begin
 dq1[0] = 'hff;
 dq1[1] = 'h00;
 dq1[$] = 'h01; //last entry - will override dq1[1]='h00
 $display($stime,,,"dq1=",dq1);
 dq1[1] = 'h02;
 $display($stime,,,"dq1=", dq1);
 mname[1] = "mike"; //push-in - grow the queue
 $display($stime,,, "mname=", mname);
 //displays initialized 4 entries
 $display($stime,,,"dq2=", dq2);
 dq2[4] = {16'h 1111};
 $display($stime,,,"dq2=", dq2);
 q2[0] = 1;
 q2[1] = 0;
 $display($stime,,, "q2=",q2);
 q2[3] = 1; //skipped entry '2' - so no 3rd entry
 $display($stime,,, "q2=",q2);
 dq2_size = dq2.size( );
 $display($stime,,,"dq2 size = %0d",dq2_size);
 for (int i = 0; i < dq2_size; i++) //read the 
entire queue
 $display($stime,,,"dq2[%0d] = %0h", i, dq2[i]);
 //insert a value at index 256 which is out of bound
 //dq2.insert(256,1); //You get a run-time Error
 end
 endmodule

上面的例子中声明了两种类型的队列:有界队列和
无界队列。

有界队列:
“q2[$:255];”有界的意思是最大下标
队列是有界的。在本例中,最大索引是255,这意味着它可以存储的元素是256(0到255)。如果你想在index 256插入元素,就会出现溢出,数据就会丢失。

无界队列为:

bit[7:0] dq1[$]; // A queue of 8-bit bytes – unbounded queue
string mname[$] = { "Bob" }; // A queue of strings – unbounded queue
bit[15:0] dq2[$] = { 3, 2, 7, 1 }; // An initialized queue –  unbounded queue

无界队列的大小没有上限。

仿真log:

 0 dq1='{'hff, 'h1}
 0 dq1='{'hff, 'h2}
 0 mname='{"Bob", "mike"}
 0 dq2='{'h3, 'h2, 'h7, 'h1}
 0 dq2='{'h3, 'h2, 'h7, 'h1, 'h1111}
 0 q2='{'h1, 'h0}
 0 q2='{'h1, 'h0}
 0 dq2 size = 5
 0 dq2[0] = 3
 0 dq2[1] = 2
 0 dq2[2] = 7
 0 dq2[3] = 1
 0 dq2[4] = 1111
 V C S S i m u l a t i o n R e p o r t

将值'ff'和'00" 赋给dq1的前两个元素(dq1[0]和dq1[1])。之后,赋值最后一个条目(dq1[$])为'h01。此时dq1[1]就是'h01。最后在赋值dq1[1]为'h02,实际打印:

0 dq1='{'hff, 'h1}
0 dq1='{'hff, 'h2}

push一个新值“mike”到队列“mname”

0 mname='{"Bob", "mike"}

打印初始化的队列dq2,然后push一个值16'h1111

0 dq2='{'h3, 'h2, 'h7, 'h1}
0 dq2='{'h3, 'h2, 'h7, 'h1, 'h1111}

然后,赋值q2[0] = 1, q2[1] = 0。

0 q2='{'h1, 'h0}

赋值q2[3] = 1。但请注意,由于这个时候q2[2]还不存在,所以会忽略或者报错。

0 q2='{'h1, 'h0}

然后,读取整个队列dq2。首先得到队列的大小并将其存储在dq2_size中,遍历整个队列并显示每个元素。

 0 dq2 size = 5
 0 dq2[0] = 3
 0 dq2[1] = 2
 0 dq2[2] = 7
 0 dq2[3] = 1
 0 dq2[4] = 1111

最后,在索引256处插入一个值

dq2.insert(256);

由于" dq2 "是一个最大下标为255的有界数组,试图插入索引为256的值会报错:

Error-[DT-MCWII] Method called with invalid index
testbench.sv, 45
"insert" method called with invalid index (index:256)
Please make sure that the index is positive and less than size.

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36571
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10849

原文标题:SystemVerilog中的队列

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [启芯公开课] SystemVerilog for Verification

    学快速发展,这些趋势你了解吗?SystemVerilog + VM是目前的主流,在未来也将被大量采用,这些语言和方法学,你熟练掌握了吗?对SoC芯片设计验证感兴趣的朋友,可以关注启芯工作室推出的SoC芯片
    发表于 06-10 09:25

    systemverilog学习教程

    systemverilog的一些基本语法以及和verilog语言之间的区别。
    发表于 04-01 14:24

    转一篇Systemverilog的一个牛人总结

    () ;//释放空间l 队列队列增加或删除元素比较方便。l 关联数组当你需要建立一个超大容量的数组。关联数组,存放稀疏矩阵的值。表示方法:采用在方括号中放置数据类型的形式声明:B
    发表于 08-27 14:50

    round robin 的 systemverilog 代码

    大家好,我对一个 round robin 的 systemverilog 代码有疑惑。https://www.edaplayground.com/x/2TzD代码第49和54行是怎么解析呢 ?
    发表于 03-14 19:16

    做FPGA工程师需要掌握SystemVerilog吗?

    在某大型科技公司的招聘网站上看到招聘逻辑硬件工程师需要掌握SystemVerilog语言,感觉SystemVerilog语言是用于ASIC验证的,那么做FPGA工程师有没有必要掌握SystemVerilog语言呢?
    发表于 08-02 20:30

    如何在SystemVerilog为状态机的命令序列的生成建模

     我们将展示如何在SystemVerilog为状态机的命令序列的生成建模,并且我们将看到它是如何实现更高效的建模,以及实现更好的测试生成。​
    发表于 01-01 06:05

    使用SystemVerilog来简化FPGA接口的连接方式

    FPGA接口的连接方式。    也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具是不支持SystemVerilog的,导致大家都是用VHDL或者Verilog来
    发表于 01-08 17:23

    SystemVerilog有哪些标准?

    SystemVerilog有哪些标准?
    发表于 06-21 08:09

    LabVIEW队列使用详解

    1现实队列队列估计是我们生活中出现的最频繁的数据形式,各种类型的排队例如银行叫号办理业务,购买火车票飞机票、排队打饭、汽车灯等待红绿灯然后放行、流水线上下架的产品或零部件等都属于队列,与之相反
    发表于 09-05 00:07

    SystemVerilog Assertion Handbo

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:08 188次下载

    SystemVerilog的断言手册

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:12 20次下载

    SystemVerilog的正式验证和混合验证

    手册的这一部分探讨了使用SystemVerilog进行验证,然后查看了使用SystemVerilog的优点和缺点。
    发表于 03-29 10:32 23次下载

    SystemVerilog中可以嵌套的数据结构

    SystemVerilog中除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1226次阅读

    SystemVerilog中的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 1922次阅读

    SystemVerilog在硬件设计部分有哪些优势

    谈到SystemVerilog,很多工程师都认为SystemVerilog仅仅是一门验证语言,事实上不只如此。传统的Verilog和VHDL被称为HDL(Hardware Description
    的头像 发表于 10-19 11:19 450次阅读
    <b class='flag-5'>SystemVerilog</b>在硬件设计部分有哪些优势