run_test是在uvm_globals.svh中定义的一个task,用于启动UVM。
获取到uvm_root的单个实例,然后调用top的run_test函数。传入test_name的名字。
初始化objection。
设置testcase的name,从cmdline(涉及uvm_cmdline_processor类)获取+UVM_TESTNAME参数,如果有,将来使用第一个参数设置的值。如果cmdline没有设置UVM_TESTNAME,使用传入的testname。
根据test_name,调用工厂函数create_component_by_name,创建testcase的实例,并且赋值给uvm_test_top,因此对于UVM环境,顶层的testcase,将来都会变成uvm_test_top。
最后判断,创建的实例是否成功;
m_children是uvm_component中内建的变量;
当一个子类,通过UVM的工厂机制创建类实例后,会将给子类的父类中的m_children,加入该类对象,而testcase的父类,就是uvm_root,因此当之前的testcase被工厂机制创建实例之后,就会将uvm_root的m_children中,加入该testcase的类对象,因此此时m_children的个数就不为0。
将testname的名字打印出来。
通过process类,保存进程号,启动uvm phase。此处用fork join_none,父进程就不必等子进程结束,就可以退出。
#0,父进程休眠,其他进程得到调度,使其他phase的runner得到运行。
最后等待uvm的phase结束。
结束之后,将创建的所有子进程杀掉,调用report,打印,最后调用$finish,结束仿真。