uvm 寄存器写入卡住,从不 return
uvm register write is stuck and never return
我有一些寄存器块以及相应的寄存器适配器设置来转换成一些总线协议。
当我对我的一个寄存器调用 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
都已正确完成 - 否则我的 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
可以使用定义将其关闭,我猜你的情况就是这样。
我有一些寄存器块以及相应的寄存器适配器设置来转换成一些总线协议。
当我对我的一个寄存器调用 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
都已正确完成 - 否则我的 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
可以使用定义将其关闭,我猜你的情况就是这样。