数字IC验证23831-- phase机制

phase执行机制

  • 如果暂时抛开phase的机制剖析,对于UVM组件的开发者而言,他们主要关心各个phase执行的先后顺序。
  • 在定义了各个phase虚方法后,UVM环境会按照phase的顺序分别调用这些方法。
    在这里插入图片描述
  • 这个自顶向下什么意思呢
    component在创建过程中是以钩子向下的形式进行层次化的,假设此处层次关系:t1->env->c1,此处的build阶段自顶向下即先运行顶层t1的build_phase,然后运行env的build_phase,最后运行c1的build_phase。然后在运行connect阶段,注意connect是自低向上的。

run_phase

  • 在所有phase中,只有run_phase方法是一个可以耗时的任务,这意味着该方法可以完成一些等待、激励、采样的任务。对于其它phase对应的方法都是函数,必须立即返回(0耗时)
  • 在run_phase中,用户如果要完成测试,通常需要组织下面的激励序列:
    ·上电
    ·复位
    ·寄存器配置
    ·发送主要测试内容
    ·等待DUT完成测试

将run_phase细分为12个小phase

在这里插入图片描述

  • 实际上run_phase任务和上面细分的12个phase是并行的,即在start_of_simulation_phase任务执行以后,run_phase和reset_phase开始执行,而在shutdown_phase执行完成之后,需要等待run_phase执行完才可以进入extract_phase。
    在这里插入图片描述

UVM编译和运行顺序

在这里插入图片描述

  • 0时刻前,进行代码编译链接
  • 0时刻,顶层模块的例化,always和initial块的启动,run_ test()启动,run_test帮助创建UVM顶层结构,执行run_phase之前的所有phase,因为他们都是函数,不需要时间。
  • 0时刻之后,执行run_phase,直到run_test()执行完毕

UVM的开始

  • 要在仿真开始时建立验证环境,用户可以考虑选择下面几种方式:
    可以通过全局函数(由uvm_pkg提供) run_test()来选择性地指定要运行哪一个uvm_test。这里的test类均继承于uvm_test。这样的话,指定的test类将被例化并指定为顶层的组件。一般而言,run_test()函数可以在合适module/program中的initial进程块中调用。
    如果没有任何参数传递给run_test(),那么用户可以在仿真时通过传递参数+UVM_TESTNAME=<test_name>,来指定仿真时调用的uvm_test。当然,即便run_test()函数在调用时已经有test名称传递,在仿真时
    +UVM_TESTNAME=<test_name>也可以从顶层覆盖已指定的test。这种方式使得仿真不需要通过再次修改run_test()调用的test名称和重复编译,就可以灵活选定test。
  • 无论上面哪一种方式,都必须在顶层调用全局函数run_test(),用户可以考虑不传递test名称作为参数,而在仿真时通过传递参数+UVM_TESTNAME=<test_name>来选择test。
  • 全局函数run_test()的重要性,正是从uvm_root创建了一个UVM世界。
    UVM源码中调用run_test的调用
task run_test (stringtest _name="") ;
	uvm_root top;
	uvm_coreservice _t cs ;
	cs = uvm coreservice_t: :get() ;
	top =cs.get_root() ;
	top . run_test (test_name) ;
endtask
uvm-1.2/ base/uvm globals .svh

UVM世界的诞生

uvm_top(root 类)承坦的核心职责包括:

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

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

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

UVM仿真退出

UVM-1.1之后,结束仿真的机制有且只有一种,那就是利用objection挂起机制来控制仿真结束。

  • uvm_objection类提供了一种供所有component和sequence共享的计数器。如果有组件来挂起objection,那么它还应该记得落下objection。
  • 参与到objection机制中的参与组件,可以独立的各自挂起objection,来防止run phase退出,但是只有这些组件都落下objection后,uvm_objection共享的counter才会变为0,这意味run phase退出的条件满足,因此可以退出run phase。

对这几种方法,在实际应用中的建议有:

  • 对于component()而言,用户可以在run_phase()中使用phase.raise_objection()/phase.drop_objection()来控制run phase退出。·用户最好为description字符串参数提供说明,这有利于后期的调试。
  • 应该使用默认count值。
  • 对于uvm_top或者uvm_test_top应该尽可能少地使用set_drain_time()。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值