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。
审核编辑:刘清
-
仿真器
+关注
关注
14文章
1018浏览量
83740 -
UVM
+关注
关注
0文章
182浏览量
19169
原文标题:管理test case结束机制
文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
基于base test如何来构造测试用例
条件(Case)结构的运用细节
Linux Shell系列教程之(十三)Shell分支语句case … esac教程
如何解决vhdl代码中的case语句问题?
工作流管理系统柔性机制
linux内存管理机制浅析
JavaScript定时器与执行机制介绍
聊一聊所谓的Objection机制
CASE:创建多路分支

管理test case结束机制介绍
评论