-
run_test
- run_test语句会自动的创建一个传入类名的实例,并且自动调用其main_phase。
- 根据类名创建一个类的实例,这是uvm_component_utils宏所带来的结效果,只有在类定义的时候声明了这个宏,才能使用这个功能。
- 在UVM验证平台中,只要一个类使用uvm_component_utils注册且此例被实例化了,那么这个类的main_phase就会被自动的调用。
- UVM通过run_test语句实例化了一个脱离了top_tb层次结构的实例,建立了名为uvm_test_top的一个新的层次结构。对于这种脱离了top_tb层次结构,同时又期望在top_tb中对其进行某些操作的实例,UVM引入了config_db机制。
-
UVM要求UVM树最晚在build_phase时段完成,如果build_phase后的某个phase实例化一个component,就会产生错误。实例化工作还可以放在new函数。
-
如果需要通过config_db传递is_active的值,需要在实例化之前使用config_db语句传递值,所以还是建议在build_phase中进行实例化。
-
driver中设置断点观察执行顺序,结果:new函数==>build_phase。
-
一个sequence在向sequencer发送transaction前,要先向sequencer发送一个请求,sequencer把这个请求放在一个仲裁队列中,作为sequencer,需要做两件事情,第一:检测仲裁队列里是否有某个sequence发送transaction的请求,第二,检测driver是否申请transaction。
-
driver中的成员变量seq_item_port和sequencer中的成员变量seq_item_export进行连接通信,在driver使用get_next_item得到一个transaction时,sequencer自己保存一个刚刚发送的transaction,当出现sequencer发出了transaction而driver未接收到是,sequencer会把保留的这份transaction再次发送。
-
get_next_item是阻塞的,他会一直等到有新的transaction;而try_next_item是非阻塞的,如果没有新的transaction直接返回null。
-
sequence只需要在某个component的main_phase中使用start函数启动即可。
-
通过default_phase启动sequence,sequence设置为某个sequencer的某个phase的default_sequence。这样随着phase的执行,sequence会自动执行:
uvm_config_db#(uvm_object_wrapper)::set(this,"i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());
- 第一个和第二个参数为组成路径。
- 当在tb中使用是,由于tb不是一个类,无法使用this指针,第一个参数为null,第二个参数就需要使用绝对路径uvm_test_top.*
- starting_phase是uvm_sequence指向phase的一个指针,当sequencer在main_phase中启动default_sequence时,sequencer就将phase赋值给sequence中的这个指针,从而满足了starting_phase!= null的这个条件。
- 可以在sequence中使用start_phase进行提起和撤销objection。