当你大量使用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”的“队列查看器”放入波形窗口
c_flow_q变量的队列查看器
一个神奇的宏——几行代码的添加,提供了大量的可见性。