删除 foreach 循环内的队列项

delete queue items inside foreach loop

当我们需要删除队列中的某些项目时,我们可以很容易地编写如下代码:

foreach(queue[i]) begin
    if(queue[i].value == 1)
         queue.delete(i);
end

但是当queue[0]==queue[1]==1时上面的代码有bug。因为 queue.delete(0) 将更改队列中项目的所有索引。

所以目前我使用的代码如下:

foreach(queue[i]) begin
    if(queue[i].value == 1) begin
         queue.delete(i);
         i--;
    end
end

它可以工作,但乍一看看起来很混乱。

所以我的问题是: 这个问题在system verilog中有没有更好的解决方案?

我相信这应该可行(我现在无法对其进行测试。尝试时请确保顺序不变)

queue = queue.find() with ( item.value != 1 );

另一种方法是找到所有符合条件的索引,按顺序排序,然后遍历索引

int qi[$] =  queue.find_index() with ( item.value == 1 );
qi = qi.sort() with ( -item ); // sort highest to lowest 
foreach(qi[idx]) queue.delete(qi[idx]);

参考IEEE1800-2012§7.12数组操作方法了解详情