先做小结:
1、lock:sequence独占sequencer,暂时拥有sequencer的所有权,在lock期间只有这个sequence在启动和发送transaction。
2、grab:也用于暂时拥有sequencer的所有权,比lock操作优先级更高,它几乎是一发出就拥有了sequencer的所有权。
3、sequence的is_relevant函数和wait_for_relevant函数:如果为1,说明此sequence有效,否则无效。在wait_for_relevant中,必须将使sequence无效的条件清除。当wait_for_relevant返回后,sequencer会继续调用sequence的is_relevant,发现依然是无效状态,则继续调用wait_for_relevant。系统会处于死循环的状态。
再看例子:
lock操作:
class sequence1 extends uvm_sequence #(my_transaction);
…
virtual task body();
…
repeat (3) begin
`uvm_do_with(m_trans, {m_trans.pload.size < 500;})
`uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
end
lock();
`uvm_info("sequence1", "locked the sequencer ", UVM_MEDIUM)
repeat (4) begin
`uvm_do_with(m_trans, {m_trans.pload.size < 500;})
`uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
end
`uvm_info("sequence1", "unlocked the sequencer ", UVM_MEDIUM)
unlock();
repeat (3) begin
`uvm_do_with(m_trans, {m_trans.pload.size < 500;})
`uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
end
…
endtask
…
endclass
1、如果两个sequence都试图使用lock任务来获取sequencer的所有权则会如何呢?
答:先获得所有权的sequence在执行完毕后才会将所有权交还给另外一个sequence。
2、如果两个sequence同时试图使用grab任务获取sequencer的所有权将会如何呢?
答:与两个sequence同时试图调用lock函数 一样,在先获得所有权的sequence执行完毕后才会将所有权交还给另外一个试图所有权的sequence。
3、如果一个sequence在使用grab任务获取sequencer的所有权前,另外一个sequence已经使用lock任务获得了sequencer的所有权则会如何呢?
答:grab任务会一直等待lock的释放。grab任务还是比较讲文明的,虽然它会插队,但是绝不会打断别人正在进行的事情。