UVM启动和结束

  • Post author:
  • Post category:其他



哪个方法可以激活UVM验证平台,如何调用它?

**run_test()方法(静态方法)**用来激活UVM验证平台。

通常在顶层的“ initial begin…end”块中调用,并且它使用一个参数(UVM_TESTNAME)指定要运行的test case。

所有程序的启动都有一个入口。像是C程序的入口是main(),普通verilog的启动是在顶层模块中的initial begin end间的代码。

一般SV验证平台的启动在顶层module或者program中的initial begin end间的代码。

uvm的启动其实也是在顶层模块中的 initial begin end间的代码,

只是这段代码已经由uvm预备好了,这就是run_test()这个任务。所以所有的uvm顶层都有类似这么一段

import uvm_pkg::*;

    initial

    begin

        run_test();

    end

这里的run_test就在uvm_globals.svh中定义,

run_test()方法在build_phase()中执行test class的构造函数,

并进一步构造层次化的Env / Agent / Driver / Sequencer对象。


phase



domain

这里出现一个phase概念,与phase对应的还有

domain

phase可以理解为一个动物的各个生命阶段,

domain可以理解为哪些动物是同步行动的一个范围,

这两个都是从object派生出来的类。然而phase又大体分为2种,

一种是消耗仿真时间的task类,

一种是不消耗时间的function类。

task类可以类比为什么婴儿期,青春期,更年期这类持续一段时间的东西,

function类可以类比为出生,死亡这种定义一个瞬间的东西。

当然function phase又分为自上而下执行与自下而上执行2种,只有build,final 2个是自上而下执行,其他的都是自下而上执行。所有的task phase也是自下而上启动,而后并发执行。可以看到图中run_phase与其他的task phase不同颜色表示,这是因为run_phase其实为了之前ovm的写法,代表了整个的耗时仿真过程,而uvm把这个过程进行了细分,分成12段。这里可以自由选择是使用整个的run还是分别使用12个分段的过程。

上面大体介绍了各种phase,现在再说m_run_phases,当我们不定义特殊的domain关系,则系统所有的部件使用统一的domain,也就是整个系统是统一行动的,对于相对简单的系统,这样就足够了。m_run_phases调用顶层的execute_phase 然后调用tranverse遍历顶层下面所有的test,env,agent,monitor,driver等节点,依据运行时段是否task或者function型,分别执行exec_task和exec_func。然后等待所有的components执行完当下的phase,也就是等待所有的objection都已经被解除,则继续执行下一个phase,如此循环,将整个结构下所有节点的所有时段执行完成,结束仿真。

以上整个过程都是uvm内部设定好的,不需要使用者进行改动,只需要在各个phase中添加具体的行为,使得各个component安需求运行即可。


在UVM方法学中仿真如何结束?


正常结束(drops objection+check)


异常结束(错误而挂起 / timeouts)

UVM具有分阶段(phase)执行,该执行由建立 ,连接阶段,运行阶段和检查阶段组成。

在运行阶段执行实际的仿真,并且在此阶段中每个组件都可以在开始时raise objection,

并保留该objection直到完成其仿真行为为止。

一旦所有组件都drops objection则运行阶段完成,然后所有组件的check()阶段执行,最后测试结束。

这是正常仿真结束的方式,但是如果某些组件由于设计或测试平台中的错误而挂起,仿真超时(timeouts)也可以控制仿真结束。



版权声明:本文为weixin_44857476原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。