Когда может произойти сбой просмотра TLM?

Я работал над связью с секвенсором драйвера 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

person user1978273    schedule 16.02.2018    source источник


Ответы (1)


uvm_tlm_fifo::size() возвращает не количество элементов в FIFO, а его емкость (т.е. максимальное количество элементов, которые он может содержать). Функция, которую вы ищете, это uvm_tlm_fifo::used(), которая возвращает количество сохраненных элементов.

Названия функций совершенно не интуитивны, и я помню, как потратил пару часов, пытаясь понять код, похожий на тот, что был у вас, пока не заметил в документации, что использовал неправильный метод.

person Tudor Timi    schedule 16.02.2018
comment
Большое спасибо. У меня есть дополнительный вопрос здесь stackoverflow.com /вопросы/48836101/ - person user1978273; 17.02.2018