我有一些寄存器块和相应的寄存器适配器设置转换成某些总线协议。
当我将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
方法中?我可能错过了一些东西。
答案 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来关闭它,这就是我猜你的情况。