哪个方法可以激活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)也可以控制仿真结束。