phase机制—UVM

简介

  • 在SV中,虽然对象可以通过构建函数new()实现,但是单单通过new( )函数无法解决一个重要问题:验证环境在实现层次化时,如何保证例化的先后关系,以及各个组件在例化后的连接
  • 通过phase机制,可以清晰的将UVM仿真阶段层次化。
  • 这里的层次化不仅仅是各个phase的先后执行顺序,处于同一个phase中的层次化组件之间的phase也有先后关系。

一、phase的执行机制

1.执行顺序

在这里插入图片描述
注意:

  • 一个有9个phase,从build ——> final,自上而下,顺序执行;
  • 八个都是函数(意味着要立即做反馈),只有 run 是任务;
  • task phase中,run_phase 还可以拆分出12个分支的 task phase ,包括reset 、configure 、main 、shutdown 四个phase核心;
  • 仿真0时刻,build——>start_of_stimulation都都已经全部执行完毕(因为都是函数)。

特点的:

  • 对于同一层次的component,它们的 phase 执行顺序不固定,最好不要出现这种关系依赖的代码。
  • 对于任务phase(如run_phase) 虽然也是按照自底向上的执行顺序,但是它与function phase不同,它并不是等到上一层(如agent)的run_phase执行完,才执行下一层的(如driver和monitor)的task run_phase,而是将上一层和下一层的所有run_phase通过 fork …join_none 的形式启动
  • 分支 task phase 和 run_phase 之间是并行执行的,只有等全部task phase 执行完,才开始执行extract_phase 等后面的function phase;12个分支任务phase之间则是顺序执行的

PS部分拓展:

  • 为什么在进入phase后,有的phase要调用super.xxx_phase( phase )呢? 其实只有build_phase中做了有用的事,如省略config 的 get( ),其他phase完全可以不加super.xxx_phase( phase )这句话。
  • 但如果是继承于用户自己定义的类,并且父类的phase中定义了必要的动作,那就必须要调用super.xxx_phase( phase )这句话。

2.phase的跳转

这属实是一种骚操作。前面都说phase是一个一个执行的,现在是介绍phase之间跳来跳去的操作。如下:

task my_driver::reset_phase(uvm_phase phase);
	phase.raise_objection(this);
	vif.drv_cb.data <= 'h0;
	vif.drv_cb.addr <= 'h0;
	while(!vif.rstn)begin
		@(posedge vif.rstn);
	end
	phase.drop_objection(this);
endtask

task my_driver::main_phase(uvm_phase phase);
	fork
		get_and_driver( );
		reset_listener( phase);
   join_none
endtask

task my_driver::reset_listener(uvm_phase phase );
	@(negedge vif.rstn);
	phase.jump( uvm_reset_phase::get( ) ); //phase 跳转
endtask

二、UVM仿真开始

必须要在顶层test中调用全局函数run_test()

两种调用方式:

  • 可以通过全局函数(uvm_package提供)run_test( )来选择性指定要运行哪一个uvm_test。这里的test类均要继承与uvm_test。这样指定的test类将被例化并指定为顶层的组件(例如run_test(“base_test”))。一般而言,run_test( ) 函数可以在适合module/program中的initial块中调用;
  • 如果没有任何参数传递给 run_test( ),可以在仿真时通过传递参数 +UVM_TESTNAME=<test_name>,来指定要仿真时调用的uvm_test。这种方法也可以覆盖有参数传递的 run_test( ),优先级更高。

UVM中的顶层类uvm_root,继承于uvm_component的。在uvm_pkg中,有且只有一个顶层类uvm_root例化的对象,即uvm_top。

uvm_top的核心职责:

  • 作为隐形的UVM的顶层,任何其他的组件实例都是在他之下,通过创建组件时指定parent来构建层次;
  • 如果component在创建时,parent为null,那么它将做作为uvm_top的子组件
  • phase控制。控制所有组件的phase顺序;
  • 索引功能。通过层次名称来索引组件实例;
  • 报告机制。通过uvm_top来全局配置报告的繁简;
  • 全局报告设备。由于可以全局访问到uvm_top实例,因此uvm报告设备在组件内部和组件组外(例如module和sequence)都可以访问。

通过uvm_top调用方法run_test(),uvm_top做了如下的初始化:

  • 得到正确的test_name
  • 初始化objection机制
  • 创建uvm_test_top实例
  • 调用phase控制方法,安排所有组件的phase方法执行顺序
  • 等待所有phase执行结束,关闭phase控制进程
  • 报告总结和结束仿真

三、UVM仿真结束

1.objection 机制

结束仿真的机制有且只有一种,就是利用objection挂起机制来控制仿真结束

  • uvm_objection类提供了一种供所有component和sequence共享的计数器。如果有组件来挂起objection,那么它还应该记得落下objection。

  • 参与到objection机制中的组件,可以独立的各自挂起objection,防止run_phase退出。但是只有这些组件都落下objection之后,uvm_objection共享的counter才会便成为0,这意味着run_phase退出的条件满足,因此才会退出run_phase

raise_objection(uvm_object obj = null,string description ="",int count = 1) //挂起objection
drop_objection(uvm_object obj = null,string description ="",int count = 1) //落下objection
set_drain_time(uvm_object obj,time drain)//设置退出时间

【注意】:

  • 在run_phase阶段,至少要有一个组件把objection挂起,否则uvm会退出run_phase,进入后面的phase;

  • 要在component中挂起objection,建议在一进入run_phase( )后就挂起(第一行代码),保证objection counter及时被增加

2.超时退出

有的测试用例会hang住验证平台,而UVM默认的退出时间是9200s,所以我们可以再 debug 时加入仿真时间控制语句。有两种方式设置:

  1. 通过uvm_root的set_timeout 函数设置,如下:
function void base_test::build( );
	super.build( );
	...
	uvm_top.set_timeout(800ns,0);
endfunction

set_timeout函数的两个参数:

  • 第一个参数是设置退出时间;
  • 第二个参数表示此设置是否可以被其他 set_timeout 语句覆盖。
  1. 在仿真的命令行时加入命令设置,如下:
+UVM_TIMEOUT = "800ns,YES"

上面的命令表示:800ns退出,且可以被覆盖。

3.延时退出

为了避免在p时刻发完包之后,调用 drop_objection 会直接跳转到下一个phase,导致p+n时刻DUT输出的包没办法被采样,可以设置一个phase的延迟退出时间(drain_time)。

class base_test extends uvm_test;
	...
	virtual task main_phase(uvm_phase phase);
		phase,raise_objection(this);
		seq.start(env.agt.sqr);
		phase.phase_done.set_drain_time(this,200);
		phase.drop_objection;
	endtask  
	...
endclass
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值