uvm 寄存器写入卡住,从不 return

uvm register write is stuck and never return

我有一些寄存器块以及相应的寄存器适配器设置来转换成一些总线协议。

当我对我的一个寄存器调用 write 方法时,我可以看到交易正在进行,并且 driver 完成了它的工作,但是 write 卡在了某个地方。

请参阅下面 driversequence 的摘录:

// ...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

我很确定所有 connectset_sequencer 都已正确完成 - 否则我的 driver 一开始就不应该看到交易。这是非常简单的测试 - 只做那个 write.

尽管 driver 似乎已完成交易,但知道为什么它卡在寄存器 write 方法中吗?我可能错过了什么。

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() returns:

,此事件通常由排序器在序列项上触发
`ifndef UVM_DISABLE_AUTO_ITEM_RECORDING
sequencer.end_tr(item);
`endif

可以使用定义将其关闭,我猜你的情况就是这样。