6.4seqr&driver-seqr的lock与grab操作

注:该部分内容可参考uvm cookbook进行补充;

1.seqr的lock与grab操作

(1) lock: sequence向sequencer发送一个请求,这个请求与其他sequence发送transaction的请求一同被放入sequencer的仲裁队列中.当前面的所有请求处理完毕, sequencer就开始响应这个lock请求,此后sequencer会一直连续发送此sequence的transaction,直到unlock操作被调用.

注1:从效果上看,调用lock操作后,sequencer的所有权并没有被所有的sequence共享,而是被申请lock操作的sequence独占了;

注2:下面code中,lock语句前,sequence0和sequence1交替产生transaction; lock语句后,一直发送sequence1的transaction,直至unlock语句被调用后,sequence0和sequence1又开始交替产生transaction;

 

 (2) grab: grab操作也用于暂时拥有sequencer的所有权,但是grab操作比lock操作优先级更高. lock请求是被插入sequencer仲裁队列的最后面,而grab请求则被放入sequencer仲裁队列的最前面.

 

 

注1: 如果两个sequence都试图用lock任务(或grab任务)来获取sequencer的所有权,先获得所有权的sequence在执行完毕后,才会将所有权交还给另外一个sequence;

注2:如果一个sequence在使用grab任务获取sequencer的所有权前,另外一个sequence已经使用lock任务获得了sequencer的所有权,grab任务会一直等待lock的释放;

2.seqr lock与grab操作示例

注1:下面的代码中,将lock的调用改为了m_sequencer.lock(this),其实是将uvm_sequence_base.svh的lock task中的内容拿了出来;

 

 

 

 

posted on 2021-10-18 16:09  知北游。。  阅读(794)  评论(0)    收藏  举报

导航