2015-05-27 2 views
3

Согласно 1800-2012 specs,Как совместить и удалить элемент из очереди?

Queue::delete([input int index]) 

удаляет элемент очереди в SystemVerilog, кроме того, Очередь может выполнять те же операции, как распакованной Array, давая ему доступ к:

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 возвращает массив размером один с индексом в местоположении 0?

EDIT: я сдуру не представила автономный пример: раздели пример того, что я делаю как выглядит:

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.

+0

Из дальнейшего анализа действительно выглядит как find_first_index возвращает массив. 'int index = queue.find_first_index (x) где (x == obj_to_del);' жалуется на назначение int $ [$] для int. –

ответ

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() в любом случае перед удалением?

+0

Ах, как глупо меня. Я добавил приведенный выше пример. Перед вызовом функции удаления есть проверки, и я уверен, что это конкретное удаление будет вызвано только в том случае, если этот предмет существует. –

+0

Извините, я хотел сказать, что последняя версия используется для работы с int '() для меня. –

+0

Mh ... Мой компилятор недоволен типом: «[IMEMCT] Недопустимое использование памяти. Память или фрагмент памяти не разрешается использовать в следующем контексте:/* omitted */Expression: this.A_queue.find_first_index() 'Странно ... Я сделаю обходной способ сначала найти индекс и сохранить его в int, а затем отчитаться. –

0

ИНТ литая не работает для меня, как хорошо, но следующий работал

int index_to_del[$]; 

index_to_del = que.find_first_index(x) with (x == task_to_del); 
que.delete(index_to_del[0]); 
Смежные вопросы