запись в регистр uvm застревает и никогда не возвращается

У меня есть некоторый блок регистра вместе с соответствующей настройкой адаптера регистра для перевода в какой-то протокол шины.

Когда я вызвал метод write для одного из моих регистров, я мог видеть, что транзакция выполняется, и driver завершил свою работу, но write где-то застрял.

См. выдержку из driver и sequence ниже:

// ...uvm driver
forever begin
  seq_item_port.get_next_item(req);
  $display("DEBUG A");
  // ... do transaction
  seq_item_port.item_done();
  $display("DEBUG B");
end

// ... sequence
$display("START WRITE");
my_reg_block.my_reg1.write(
$display("DONE WRITE");

Результат:

START WRITE
DEBUG A
DEBUG B

а потом симуляция застряла там - я никогда не вижу DONE WRITE.

Я совершенно уверен, что все connect, set_sequencer были сделаны правильно, иначе мой драйвер вообще не должен видеть транзакцию. И это довольно простой тест — нужно только сделать это write.

Есть идеи, почему он застрял в методе регистрации write, хотя driver, похоже, завершил транзакцию? Я, наверное, что-то пропустил.


person AldoT    schedule 05.08.2016    source источник
comment
Можете ли вы добавить больше деталей о вашей последовательности и методе write внутри нее?   -  person AndresM    schedule 05.08.2016
comment
uvm подробность UVM_HIGH /UVM_DEBUG может быть полезной. Он распечатает дополнительную информацию из модели reg, например, где она находится в задаче записи. Это может дать ключ к пониманию того, что происходит.   -  person Rahul Menon    schedule 05.08.2016


Ответы (1)


В uvm_reg_map::do_bus_write(...) есть следующий фрагмент кода, который обрабатывает запрос шины на доступ к регистру:

  bus_req.set_sequencer(sequencer);
  rw.parent.start_item(bus_req,rw.prior);

  if (rw.parent != null && i == 0)
    rw.parent.mid_do(rw);

  rw.parent.finish_item(bus_req);
  bus_req.end_event.wait_on();

Обратите внимание на end_event.wait_on(). Это событие обычно запускается секвенсором для элемента последовательности после вызова item_done() и возврата finish_item():

`ifndef UVM_DISABLE_AUTO_ITEM_RECORDING
sequencer.end_tr(item);
`endif

Это можно отключить с помощью определения, что, я думаю, и происходит в вашем случае.

person Tudor Timi    schedule 06.08.2016
comment
точно из-за определения, отличная догадка - person AldoT; 09.08.2016