微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > System Verilog 中队列的使用问题

System Verilog 中队列的使用问题

时间:10-02 整理:3721RD 点击:
刚学SV,做个模型但在使用队列时碰到了问题:定义了一个队列,然后在一个initial块中初始化了并填满了数据,然后在另一个always块中,让他每次弹出一个元素并赋给
一个寄存器,大体结构如下:
bit[31:0] buffer [$];
...
initial
begin
for(int j = 0 ;j<50;j++)
buffer[j] = {$ramdom}%500;
end
...
always @(posedge clk or negedge rst_n)
begin
...
data <= buffer.pop_front();
...
end
但是仿真时总是提示,“Cannot pop from an empty queue”!不知道队列怎么就空了呢?而且将其声明成static类型也是如此。
望各位高手指点迷津!
令:队列在SV中到底是什么类型?

试一下buffer.push_front();的方式写入

对啊,pop的时候至少判断下队列的size

恩,楼上两位说的有理,先size()一下,在看是否pop

1.队列兼具array和linked list的双重特点,所以用array的index方式给队列赋值是OK的。即
for(int j = 0 ;j<50;j++)
buffer[j] = {$ramdom}%500;
是正确的。
2.仿真时队列为空,确实应该是因为LZ没有对队列buffer.size做判断导致。

奥原来如此受益匪浅啊
我在用SV时也碰到了一个问题希望大家不吝赐教啊
这样声明一个mem有错吗?bit [WIDTH-1:0] mem [$EPTH];
为什么编译时说:"systemverilog feature not yet implemented . Bounded queue not supported yet "
是不是由于我漏设了什么编译参数啊?

DEPTH是const吗?用什么啊


WIDTH = 8DEPTH= 31

小编:
队列一般用pop_front()、push_front()、pop_back()、push_back()进行赋值和取值。
当然,队列也是一种数组,用普通数据的index调用的方式也是可以用的。但无法体现队列的优势,如果只是采用Index方式调用,不如用固定数组和动态数组。
你可以把一个队列看成一个移位寄存器,一般的使用是push_front()和pop_back()一起使用,push_back()和pop_front()一起使用。初学者在使用pop_front()和pop_back()之前可以用size()先判断队列的元素的个数。
你的代码在非复位条件下每个clk的上升沿都会去队列取数,在50个clk后,队列就空了。pop_front()方法调用一次,队列的size就减1.
6#:
你在声明时用到的"$DEPTH"是什么意思?是想声明为队列,且最大边界为DEPTH的意思吗?
你试试:bit [7:0] mem [$]; 或 bit [7:0] mem [31]; 或bit [7:0] mem [];

请看看手册 队列不是这样定义的 8# qinghuabing2008

大家看看9#TommyGG 的解释,非常地正确!

9# TommyGG

是啊我就想声明一个动态数列最大是DEPTH
我看文档上是可以这样使的啊bit [WIDTH-1:0] mem [$ : DEPTH]
如果像您说的这样声明的话:bit [7:0] mem [$]; 或 bit [7:0] mem [31]; 或bit [7:0] mem [],不就不能体现“动态数列,最大是DEPTH”了吗

10# yangzhendan

呵呵不好意思在$和DEPTH之间其实是冒号不知咋的自动生成了个小人头我怎么去也去不了呵呵让各位费力了不好意思啊!这次终于去掉了!

用`define DEPTH31呢?

很好啊

顶一个!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top