IC验证学习笔记(MCDF)UVM实验2b-测试的开始与结束

二、测试的开始和结束
UVM验证环境测试的开始、环境构建的过程、连接以及结束的控制。
tb.sv
        通过uvm_config_db完成了各个接口从TB(硬件一侧)到验证环境mcdf_env(软件一侧)的传递。实现了以往SV函数的剥离,即UVM不需要深入到目标组件一侧,调用其set_interface()即可完成传递。这种传递方式有赖于config_db的数据存储和层次传递特性。而在mcdf_env中,暂时保留了mcdf_env的set_interface()以及各个子组件的set_interface()函数。仅修改了TB与mcdf_env之间的接口传递,其实可以移除所有的set_interface()函数,完全使用uvm_config_db的set和get方法,从而使得mcdf_env与其各个子组件之间也实现“层次剥离”,这样也就进一步促进了组件之间的独立性。

        通过调用run_test()函数即完成了test的选择、例化和开始测试。可以在代码中指定UVM test,或者通过 +UVM_TESTNAME=mytest在仿真选项中灵活传递test名。在run_test()执行中,它会初始化objection机制,即查看objection有没有挂起的地方,因此在test或者generator中必须至少有一处地方使用phase.raise_objection()来挂起仿真,避免仿真退出,而在仿真需要结束时,使用phase.drop_objection()来允许仿真可以退出。同时run_test()可以创建uvm_test组件,及其以下的各层组件群,并且可以调用phase控制方法,按照所有phase顺序执行。在UVM中,将对象的例化放置在build_phase中,而将对象的连接放置在connect_phase中。

1、uvm_base_test还能通过set_interface来传递接口吗?
以前是通过在仿真的时候传递一个TESTNAME,在运行的时候就可以直接把TESTNAME对应的set_interface和run函数调用起来(前提是已经提前把每个test都例化了),实现接口的层层传递,最终到达底层的组件。
而在uvm中是通过uvm_config_db来传递接口的,在组件还没有创建之前就先把接口放在中转库。运行则是通过run_test。

可能有人问,可否和之前一样还是通过set_interface来传递接口?

不行,调用组件方法set_interface的前提是组件已经例化了。而实际上,uvm中组件的例化是在run_test()中(因为run_test会执行所有的phase,包括build_phase),所以不行。

那如果把run_test放在set_interface之前呢?
也不行。因为run_test开始之后会进入build_phase。此时会发现没有interface的指针,所以也会有问题。

总结:
1、SV中接口传递的问题:

环境准备好了,组件例化了后才能传递;
每一层都要有set_interface,然后层层传递进去(好几个类中都要声明set_interface)这不利于软件环境的封装和复用。

2、而通过uvm_config_db可以将接口先放在一个中转库,可以使得接口的传递和获取彻底分开,直接将接口传递一步到位,而不是层层传递;无需担心测试台层次结构中任何组件的深度。

2、run_test()中有无参数的区别何在?
如果有参数,意味着mcdf_data_consistence_basic_test是默认的test,如果仿真选项中没有指定UVM_TESTNAME,那么就默认执行它;
        如果没有参数,也就意味着没有默认test。那么仿真选项就必须要指定test,否则会报错;
如果通过UVM_TESTNAME指定了某个test,那么UVM会从命令行中寻找测试用例的名字,创建它的实例并运行。
        选择正确的test
        通过test构建层次
        让每个phase按顺序执行
        通过objection机制控制仿真的结束

你可能感兴趣的:(学习,笔记)