管理test case结束机制介绍

描述

UVM中每个phase都有一个内置的objection ,为components和objects提供了同步方法,指示何时可以安全地结束这个phase,最终结束整个test case。

一般来说,由一个components或sequence在激励开始时raise phase objection,激励处理完毕之后drop objection。一旦所有提起的objections被dropped,该phase就终止了。

在仿真中,一个master agent可能需要在runphase停止之前完成所有的读写操作,一个reactive slave agent不会drop objection,因为它只是一直被动地处理事务。对于sequence来说,有三种可能的方式可以处理phase objection。

a) 

 

class test extends ovm_test;
task run_phase(uvm_phase phase);
    phase.raise_objection(this);
    seq.start(seqr);
    phase.drop_objection(this);
  endtask
endclass

 

b) 

 

class test extends ovm_test;
task run_phase (uvm_phase phase);
    seq.set_starting_phase(phase);
    seq.start(seqr);
  endtask
endclass


class seq extends uvm_sequence #(data_item);
task body();
    uvm_phase p = get_starting_phase();
    if(p) p.raise_objection(this); 
//some critical logic
    if(p) p.drop_objection(this);
  endtask
endclass

 

c) 

 

class test extends ovm_test;
task run_phase (uvm_phase phase);
    seq.set_starting_phase(phase);
    seq.start(seqr);
  endtask
endclass


class seq extends uvm_sequence #(data_item);
function new(string name = "seq");
super.new(name);
    set_automatic_phase_objection(1);
endfunction
  task body();
// Sequence logic with no objection
// as it is already handled in the base class
endtask
endclass

 

上面的三种方式只需要实现其中一种即可。

当所有objections都被dropped,当前运行的phase就结束了。在仿真过程中,可能需要一些额外的cycle来向scoreboard传输最后一笔transaction。

为了适配这种情况,可以使用phase_ready_to_end()方法在必要时刻重新提出phase objection。

另外,也可以设置一个drain time ,在组件所有objections都被dropped之后注入一个延迟。一般是在env或者test级设置drain time。




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分