Ошибка записи в почтовый ящик systemverilog

Я использую почтовый ящик на тестовом стенде UVM SV и столкнулся с проблемой при попытке записи в почтовый ящик. Мой код выглядит следующим образом:

class my_seqyuence extends uvm_sequence;

mailbox data;
some_user_defined_type mydata;

function new(string name = "my_sequence");
  super.new(name);
  data=new();
endfunction

task body();
  forever begin
  // blocking-get. program is blocked here... not why get is not returning...!
    data.get(mydata);
    decode_mydata_and_do_something_here;
  end
endtask

function void writetrans(some_user_defined_type trans);
// I used print statements with mailbox size and i can see that valid trans is arriving here and successfully writing to mailbox.
  data.try_put(trans)
endfunction 
endclass

Я не совсем уверен, что пошло не так... Данные доходят до функции writetrans(*) и, в конце концов, не удается записать, хотя в почтовом ящике есть место.


person newbie    schedule 12.04.2014    source источник


Ответы (2)


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

Вы всегда должны проверять результат try_put() и try_get(), чтобы убедиться, что они были успешными.

Вы всегда должны использовать параметризованные почтовые ящики для более безопасной проверки типов.

mailbox #(some_user_defined_type) data;
person dave_59    schedule 12.04.2014
comment
Я создал порт анализа, расширив uvm_component. Порт анализа подключается к порту транзакций монитора для получения запроса DUT. В реализации записи порта анализа я вызываю функцию writetrans(*), упомянутую в приведенном выше коде, для передачи полученного запроса. Почтовый ящик записывается данными. Я немного растерялся, так как не могу понять, почему get() не работает... - person newbie; 15.04.2014

1) Anaylsis_export или anaylsis_imp используется для подключения к порту анализа вашего монитора.

2) Поскольку ваш почтовый ящик неограничен, используйте put() вместо try_put(). Согласно SystemVerilog LRM, try_put не имеет смысла для неограниченного почтового ящика. Он используется только для неблокирующего помещения элементов в почтовый ящик. Не уверен, что означает бессмысленный, но это может означать, что он не работает должным образом.

Из ЛРМ -

Метод try_put() сохраняет сообщение в почтовом ящике в строгом порядке FIFO. Этот метод имеет смысл только для ограниченных почтовых ящиков.

3) Используйте функцию num() почтового ящика перед методом get(), чтобы убедиться, что оно больше 1. Кроме того, вы можете выполнить try_get() и проверить, возвращаемое значение равно 1 (0-> пусто, -1-> несоответствие типов)

person noobuntu    schedule 14.10.2016