Я работал над связью с секвенсором драйвера OVM. Я использую try_get_item() в драйвере ovm, но он все еще зависает. В моем секвенсоре я переопределил try_next_item и просто напечатал оператор отображения до и после m_req_fifo.peek(t); Оператор перед просмотром был выполнен, но не оператор после просмотра. Я даже отобразил размер m_req_fifo, используя m_req_fifo.size(), и он распечатал 1. Почему peek ничего не возвращает даже после того, как размер равен 1? Модифицированный try_next_item (просто добавление отображения) приведен ниже. Строка После PEEK никогда не выполняется после строки Строка 398 с размером файла 1.
virtual task try_next_item(output REQ t);
int selected_sequence;
time arb_time;
ovm_sequence_base seq;
if (get_next_item_called == 1) begin
ovm_report_error(get_full_name(), "get_next_item/try_next_item called twice without item_done or get in between", OVM_NONE);
return;
end
wait_for_sequences();
selected_sequence = choose_next_request();
if (selected_sequence == -1) begin
t = null;
return;
end
set_arbitration_completed(arb_sequence_q[selected_sequence].request_id);
seq = arb_sequence_q[selected_sequence].sequence_ptr;
arb_sequence_q.delete(selected_sequence);
m_update_lists();
sequence_item_requested = 1;
get_next_item_called = 1;
$display("Line 398 with fifo size %0d\n", m_req_fifo.size());
m_req_fifo.peek(t);
$display("After PEEK\n");
wait_for_sequences();
// attempt to get the item; if it fails, produce an error and return
if (!m_req_fifo.try_peek(t))
ovm_report_error("TRY_NEXT_BLOCKED", {"try_next_item: the selected sequence '",
seq.get_full_name(), "' did not produce an item during wait_for_sequences(). ",
"Sequences should not consume time between calls to start_item and finish_item. ",
"Returning null item."}, OVM_NONE);
endtask