1.设置transaction或者sequence的优先级,
`uvm_do_pri(m_trans,100)
`uvm_do_pri_with(m_trans,200,{m_trans.pload.size<50;})
这两种方式优先级就是上面较高,但是需要注意要设置仲裁算法,通过
env.i_agt.sqr.set_artbitration(SEQ_ARB_STRICT_FIFO);等方式设置仲裁算法,保证,高优先级的sequence发送完毕后再发送低优先级sequence。
2.sequencerd lock与grab
repeat(3) begin
`uvm_do_with(m_trans,{m_trans.pload.size<50;})
end
lock();
repeat(5) begin
`uvm_do_with(m_trans,{m_trans.pload.size<50;})
end
unlock();
执行到lock语句时,会独占sequencer,直到unlock.
类似的,grab也可以这么做,与lock的区别就是,grab更强势,lock会等待仲裁队列里的请求全部执行完毕,而,grab会直接插到最前面一个,但是grab并不会打断正在进行的sequence。
repeat(3) begin
`uvm_do_with(m_trans,{m_trans.pload.size<50;})
end
grab();
repeat(5) begin
`uvm_do_with(m_trans,{m_trans.pload.size<50;})
end
ungrab();
3.通过is_relevant函数使sequence失效,sequencer仲裁时会查看sequence的is_relevant函数,返回为1时,sequence有效,否则无效,因此可以重载is_relevant来使sequence失效,通常is_relevant函数里要实现一个让sequence无效的条件,但是注意,当sequencer发送完所有sequence后,会调用有is_relevant的sequence里的wait_for_relevant,如果没有则会报错。所以要么,在所有sequence发送完之前就主动让is_relevant返回1,要么一定要有wait_for_relevant函数把无效的条件再恢复有效。
virtual function bit is_relevant();
if((num>=3)&&(!has_delayed)) return 0;
else return 1;
endfucntion
virtual task wait_for_relevant();
#10000;
has_delayed = 1;
endtask