如何匹配和删除队列中的元素?

时间:2015-05-27 23:00:27

标签: system-verilog

根据1800-2012 specs

Queue::delete( [input int index] ) 

删除SystemVerilog中队列的一个元素,此外,Queue可以执行与解压缩数组相同的操作,使其可以访问:

Array::find_first_index( )

返回与特定条件匹配的第一个元素的索引。即。

find_first_index( x ) with ( x == 3)

现在我想从队列中删除一个保证存在的唯一项目。结合1和1给我:

queue.delete(queue.find_first_index( x ) with ( x == obj_to_del ));

编译器并不理解虽然说传递的参数必须是整数或整数兼容的。我可能会将两者分开:

int index = queue.find_first_index( x ) with ( x == obj_to_del );
queue.delete( index );

或通过类型化find_first_index强制整数:

queue.delete(int'(queue.find_first_index( x ) with ( x == obj_to_del ))) //Just finished compiling, does not work.

前者对我来说看起来并不优雅,后者似乎有些强迫,这让我很好奇,如果有更合适的方法来实现这一点。 find_first_index是否可能返回一个大小为1的数组,索引位于0?

编辑:我愚蠢地没有提供一个自包含的例子:我正在做的事情的剥离示例:

class parent_task;
endclass;

class child_taskA extends parent_task;
endclass;

class child_taskB extends parent_task;
endclass;    

class task_collector;

 child_taskA A_queue[$];
 child_taskB B_queue[$];

 function delete_from_queue(parent_task task_to_del);
      case (task_to_del.type):
         A: A_queue.delete(A_queue.find_first_index( x ) with ( x == task_to_del));
         B: B_queue.delete(B_queue.find_first_index( x ) with ( x == task_to_del));
         default: $display("This shouldn't happen.");
 endfunction
endclass

错误信息,逐字逐句:

Error-[SV-IQDA] Invalid Queue delete argument
"this.A_queue.find_first_index( iterator ) with ((iterator == task))"
 Queue method delete can take optional integer argument. So, argument passed
 to it must be either integer or integer assignment compatible.

在调用delete_from_queue之前,有一些检查确保有问题的任务存在。

2 个答案:

答案 0 :(得分:1)

int cast也不适合我,但以下工作

public class Categoria
{
    public int ID {get; set}
    public List<Produto> produto {get; set;}
    public int produtoCount {get; set;}
}

public class Produto
{
    public ID {get; set}
    public string data {get; set;}
}

答案 1 :(得分:0)

queue.delete(int'(queue.find_first_index( x ) with ( x == obj_to_del )));

适合我。如果您能提供完整的自包含示例,如下所示,那将非常有用:

module top;
   int queue[$] = {1,2,3,4,5};
   let object_to_del = 3;
       initial begin
      queue.delete(int'(queue.find_first_index( x ) with ( x == object_to_del )));
      $display("%p", queue);
       end
endmodule

但如果没有匹配怎么办?在删除之前,你不需要测试find_first_index()的结果吗?