删除 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数组操作方法了解详情
当我们需要删除队列中的某些项目时,我们可以很容易地编写如下代码:
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数组操作方法了解详情