所有程序的启动都有一个入口。像是C程序的入口是main(),普通verilog的启动是在顶层模块中的
initial beginend间的代码。一般SV验证平台的启动在顶层module或者program中的initial begin end间的代码。uvm的启动其实也是在顶层模块中的 initial beginend间的代码,只是这段代码已经由uvm预备好了,这就是run_test()这个任务。所以所有的uvm顶层都有类似这么一段
import uvm_pkg::*;
initial
begin
run_test();
end
这里的run_test就在uvm_globals.svh中定义, 它到底都做了些什么,下面详细解释一下。
这个run_test实际调用了uvm_top也就是单实例顶层的run_test任务,然后调用m_run_phases.
这里出现一个phase概念,与phase对应的还有domain,前面已经说过了phase可以理解为一个动物的各个生命阶段,domain可以理解为哪些动物是同步行动的一个范围,这两个都是从object派生出来的类。然而phase又大体分为2种,具体见下图,一种是消耗仿真时间的task类,一种是不消耗时间的function类,task类可以类比为什么婴儿期,青春期,更年期这类持续一段时间的东西,function类可以类比为出生,死亡这种定义一个瞬间的东西。当然functionphase又分为自上而下执行与自下而上执行2种,只有build,final 2个是自上而下执行,其他的都是自下而上执行。所有的taskphase也是自下而上启动,而后并发执行。可以看到图中run_phase与其他的taskphase不同颜色表示,这是因为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安需求运行即可。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。