监视你的SystemVerilog queue

当你大量使用systemverilog queue发送激励时,你是不是也很好奇SystemVerilog队列发生了什么。

你想从队列中了解哪些信息?

里面有什么呢?它们还剩多少个元素?。也许这个队列几乎在整个仿真中都是空的-或者这个队列几乎总是大于100个元素”

我们可以生成关于队列大小、活动的报告。

如果我们有一个神奇的宏——一个可以测量队列的宏,这样我们就可以更好地了解它在做什么。

我的队列:

int my_queue[$];

“神奇宏”:

`QUEUE_VIEW_C(int,my_queue)

这个宏需要两个参数——队列中包含的类型(int)和队列名称(my_queue)。这个方式很粗糙但是易于使用。

我们想在报告中提供什么样的信息?

Current Queue Size
  Maximum Queue Size so far
  The top 3 elements in the Queue (or the last 3, or both)
  Queue Contents (the whole thing)

在宏中,我们将构建一个队列监视器。它可以监控很多东西——例如,在伪代码中,我们的队列监视器:

task monitor (ref T q[$]);
 38   forever begin
 39     @(q.size change);
 40     size_bins[q.size()]++;
 41     if (q.size() > maxsize) maxsize = q.size();
 42     f0 = q[0];
 43     f1 = q[1];
 44     f2 = q[2];
 45     $display("@%t: %s : size=%0d %0d %0d %0d q=[%p]", 
 46       $time, name, q.size(), f0, f1, f2, q);
 47   end
 48 endtask

第37行提供了实际队列作为参数。
第38行和第39行提供了一个无限循环,等待队列更改大小。
一旦队列大小发生变化,第40行就会进行计数。
第41行计算了该队列达到的最大大小。
第42、43和44行捕获队列顶部,第二个和第三个元素。
第45行只是打印了队列的一些信息:当前时间、队列查看器名称、队列大小、前3个值,最后使用“%p”打印了整个队列。

以下是第45行的一些输出:

# @ 123: qview_6.c_flow_q : size=0 0 0 0 q=['{}]# @ 123: qview_6.c_flow_q : size=0 0 0 0 q=['{}]# @ 152: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]# @ 160: qview_6.c_flow_q : size=2 2 2 0 q=['{2, 2}]# @ 168: qview_6.c_flow_q : size=3 2 2 2 q=['{2, 2, 2}]# @ 181: qview_6.c_flow_q : size=4 6 2 2 q=['{6, 2, 2, 2}]# @ 188: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 2, 2}]# @ 199: qview_6.c_flow_q : size=6 8 2 6 q=['{8, 2, 6, 2, 2, 2}]# @ 206: qview_6.c_flow_q : size=7 4 8 2 q=['{4, 8, 2, 6, 2, 2, 2}]# @ 214: qview_6.c_flow_q : size=8 2 4 8 q=['{2, 4, 8, 2, 6, 2, 2, 2}]# @ 223: qview_6.c_flow_q : size=9 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2, 2}]# @ 233: qview_6.c_flow_q : size=8 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2}]# @ 235: qview_6.c_flow_q : size=7 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2}]# @ 236: qview_6.c_flow_q : size=8 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6, 2}]# @ 238: qview_6.c_flow_q : size=7 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6}]# @ 240: qview_6.c_flow_q : size=6 2 6 2 q=['{2, 6, 2, 4, 8, 2}]# @ 242: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 4, 8}]# @ 245: qview_6.c_flow_q : size=4 2 6 2 q=['{2, 6, 2, 4}]# @ 248: qview_6.c_flow_q : size=3 2 6 2 q=['{2, 6, 2}]# @ 249: qview_6.c_flow_q : size=2 2 6 0 q=['{2, 6}]# @ 251: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]# @ 254: qview_6.c_flow_q : size=0 0 0 0 q=['{}]# @ 317: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]# @ 330: qview_6.c_flow_q : size=2 5 7 0 q=['{5, 7}]# @ 338: qview_6.c_flow_q : size=3 2 5 7 q=['{2, 5, 7}]# @ 345: qview_6.c_flow_q : size=4 1 2 5 q=['{1, 2, 5, 7}]# @ 355: qview_6.c_flow_q : size=5 3 1 2 q=['{3, 1, 2, 5, 7}]# @ 368: qview_6.c_flow_q : size=6 7 3 1 q=['{7, 3, 1, 2, 5, 7}]# @ 372: qview_6.c_flow_q : size=5 7 3 1 q=['{7, 3, 1, 2, 5}]# @ 373: qview_6.c_flow_q : size=4 7 3 1 q=['{7, 3, 1, 2}]# @ 375: qview_6.c_flow_q : size=3 7 3 1 q=['{7, 3, 1}]# @ 377: qview_6.c_flow_q : size=2 7 3 0 q=['{7, 3}]# @ 379: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]# @ 381: qview_6.c_flow_q : size=0 0 0 0 q=['{}]# @ 152: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]# @ 160: qview_6.c_flow_q : size=2 2 2 0 q=['{2, 2}]# @ 168: qview_6.c_flow_q : size=3 2 2 2 q=['{2, 2, 2}]# @ 181: qview_6.c_flow_q : size=4 6 2 2 q=['{6, 2, 2, 2}]# @ 188: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 2, 2}]# @ 199: qview_6.c_flow_q : size=6 8 2 6 q=['{8, 2, 6, 2, 2, 2}]# @ 206: qview_6.c_flow_q : size=7 4 8 2 q=['{4, 8, 2, 6, 2, 2, 2}]# @ 214: qview_6.c_flow_q : size=8 2 4 8 q=['{2, 4, 8, 2, 6, 2, 2, 2}]# @ 223: qview_6.c_flow_q : size=9 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2, 2}]# @ 233: qview_6.c_flow_q : size=8 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2}]# @ 235: qview_6.c_flow_q : size=7 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2}]# @ 236: qview_6.c_flow_q : size=8 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6, 2}]# @ 238: qview_6.c_flow_q : size=7 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6}]# @ 240: qview_6.c_flow_q : size=6 2 6 2 q=['{2, 6, 2, 4, 8, 2}]# @ 242: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 4, 8}]# @ 245: qview_6.c_flow_q : size=4 2 6 2 q=['{2, 6, 2, 4}]# @ 248: qview_6.c_flow_q : size=3 2 6 2 q=['{2, 6, 2}]# @ 249: qview_6.c_flow_q : size=2 2 6 0 q=['{2, 6}]# @ 251: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]# @ 254: qview_6.c_flow_q : size=0 0 0 0 q=['{}]# @ 317: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]# @ 330: qview_6.c_flow_q : size=2 5 7 0 q=['{5, 7}]# @ 338: qview_6.c_flow_q : size=3 2 5 7 q=['{2, 5, 7}]# @ 345: qview_6.c_flow_q : size=4 1 2 5 q=['{1, 2, 5, 7}]# @ 355: qview_6.c_flow_q : size=5 3 1 2 q=['{3, 1, 2, 5, 7}]# @ 368: qview_6.c_flow_q : size=6 7 3 1 q=['{7, 3, 1, 2, 5, 7}]# @ 372: qview_6.c_flow_q : size=5 7 3 1 q=['{7, 3, 1, 2, 5}]# @ 373: qview_6.c_flow_q : size=4 7 3 1 q=['{7, 3, 1, 2}]# @ 375: qview_6.c_flow_q : size=3 7 3 1 q=['{7, 3, 1}]# @ 377: qview_6.c_flow_q : size=2 7 3 0 q=['{7, 3}]# @ 379: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]# @ 381: qview_6.c_flow_q : size=0 0 0 0 q=['{}]

最后,在模拟结束时,我可能想要一份关于垃圾桶的报告

# @ 123: qview_6.c_flow_q : size=0 0 0 0 q=['{}]
 # @ 152: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]
 # @ 160: qview_6.c_flow_q : size=2 2 2 0 q=['{2, 2}]
 # @ 168: qview_6.c_flow_q : size=3 2 2 2 q=['{2, 2, 2}]
 # @ 181: qview_6.c_flow_q : size=4 6 2 2 q=['{6, 2, 2, 2}]
 # @ 188: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 2, 2}]
 # @ 199: qview_6.c_flow_q : size=6 8 2 6 q=['{8, 2, 6, 2, 2, 2}]
 # @ 206: qview_6.c_flow_q : size=7 4 8 2 q=['{4, 8, 2, 6, 2, 2, 2}]
 # @ 214: qview_6.c_flow_q : size=8 2 4 8 q=['{2, 4, 8, 2, 6, 2, 2, 2}]
 # @ 223: qview_6.c_flow_q : size=9 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2, 2}]
 # @ 233: qview_6.c_flow_q : size=8 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2, 2}]
 # @ 235: qview_6.c_flow_q : size=7 6 2 4 q=['{6, 2, 4, 8, 2, 6, 2}]
 # @ 236: qview_6.c_flow_q : size=8 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6, 2}]
 # @ 238: qview_6.c_flow_q : size=7 2 6 2 q=['{2, 6, 2, 4, 8, 2, 6}]
 # @ 240: qview_6.c_flow_q : size=6 2 6 2 q=['{2, 6, 2, 4, 8, 2}]
 # @ 242: qview_6.c_flow_q : size=5 2 6 2 q=['{2, 6, 2, 4, 8}]
 # @ 245: qview_6.c_flow_q : size=4 2 6 2 q=['{2, 6, 2, 4}]
 # @ 248: qview_6.c_flow_q : size=3 2 6 2 q=['{2, 6, 2}]
 # @ 249: qview_6.c_flow_q : size=2 2 6 0 q=['{2, 6}]
 # @ 251: qview_6.c_flow_q : size=1 2 0 0 q=['{2}]
 # @ 254: qview_6.c_flow_q : size=0 0 0 0 q=['{}]
 # @ 317: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]
 # @ 330: qview_6.c_flow_q : size=2 5 7 0 q=['{5, 7}]
 # @ 338: qview_6.c_flow_q : size=3 2 5 7 q=['{2, 5, 7}]
 # @ 345: qview_6.c_flow_q : size=4 1 2 5 q=['{1, 2, 5, 7}]
 # @ 355: qview_6.c_flow_q : size=5 3 1 2 q=['{3, 1, 2, 5, 7}]
 # @ 368: qview_6.c_flow_q : size=6 7 3 1 q=['{7, 3, 1, 2, 5, 7}]
 # @ 372: qview_6.c_flow_q : size=5 7 3 1 q=['{7, 3, 1, 2, 5}]
 # @ 373: qview_6.c_flow_q : size=4 7 3 1 q=['{7, 3, 1, 2}]
 # @ 375: qview_6.c_flow_q : size=3 7 3 1 q=['{7, 3, 1}]
 # @ 377: qview_6.c_flow_q : size=2 7 3 0 q=['{7, 3}]
 # @ 379: qview_6.c_flow_q : size=1 7 0 0 q=['{7}]
 # @ 381: qview_6.c_flow_q : size=0 0 0 0 q=['{}]
将队列“c_flow_q”的“队列查看器”放入波形窗口

be09bab32f38b33dd67d6c348372f53c.jpeg


c_flow_q变量的队列查看器

一个神奇的宏——几行代码的添加,提供了大量的可见性。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值