1、引入factory机制:
在要注册类开头配置:
`uvm_component_utils(className);注册类
在top中可以直接运行run_test("className");实例化这个类并且运行这个类的main_phase
2、引入objection机制
上面这样只配置factory后,main_phase中的内容得不到执行马上就结束了,需要添加objection
在main_phase中添加:
phase.raise_objection(this);
中间是main_phase中执行的代码。
phase.drop_objection(this);
这样就可以自动执行了。
3、灵活配置激励和待测设计之间的接口
摆脱激励类中直接操作顶层模块的信号时,使用模块层级信号。
(1)在激励类中添加虚接口:virtual 接口名 v接口句柄;
在main_phase中可以通过接口句柄操作接口。
(2)大同顶层模块中的接口实例和激励类中的虚接口
引入config_db机制,通过config_db的set和get方法传递接口。
在顶层top模块中设置set传入接口实例:
uvm_config_db #(virtual my_if) :: set(null, "uvm_test_top", "vif", input_if);//发送出去input_if接口实例,run_test创建的实例名uvm_test_top
在激励类中通过get接收接口实例:
在build_phase中接收:
virtual function build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db #(virtual my_if)::get(this, "", "vif", vif);//获取接口实例给本类实例的vif
endfunction
4、在测试平台中加入其他模块
transaction:就是一个激励包(类似一个协议包)
(1)transaction继承自uvm_sequence_item
类的属性就是包中的字段
(2)transaction注册factory使用`uvm_object_utils(transaction类名)
原因是生命周期不贯穿整个测试平台周期,使用完毕后会结束生命周期。
(3)在激励类中使用transaction
在激励类中的main_phase中实例化transaction,然后将transaction中的数据字段分发到接口中去驱动。
5、引入容器类env
引入原因:在测试平台中有很多相对功能独立的模块,如果都像上面那样,通过run_test实例化driver,然后在driver中实例化,显得不合理,所以引入一个容器类,这个类里包含所有的组件,并且在top的run_test中实例化这个容器,通过这个容器来实例化所有组件。
(1)env继承自uvm_env
(2)注册该类是`uvm_component_utils(类名)
(3)该类的属性是其他组件
(4)在该类的build_phase中实例化其他组件,使用以下方式实例化:
如:drv = my_driver::type_id::create("drv", this);//两个参数分别对应new中的两个参数
组件类句柄 = 组件类名::type_id::create("实例名", this);<