uvm寄存器写入被卡住并且永远不会返回

时间:2016-08-05 09:03:15

标签: system-verilog uvm

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

当我将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都已正确制作 - 否则我的司机不应该首先看到交易。这是非常简单的测试 - 仅执行write

虽然write似乎已经完成了交易,但是知道为什么它会停留在寄存器driver方法中?我可能错过了一些东西。

1 个答案:

答案 0 :(得分:0)

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

可以使用define来关闭它,这就是我猜你的情况。