求问一个uvm starting phase 为 null 的问题
- virtual task pre_body();
- if(starting_phase != null)
- starting_phase.raise_objection(this,{"Running sequence '",get_full_name(),"'"});
- endtask : pre_body
- virtual task post_body();
- if(starting_phase != null)
- starting_phase.drop_objection(this,{"Completed sequence '",get_full_name(),"'"});
- endtask : post_body
raise 和drop objection
原有的VIP的sequencer加入到virtual sequencer中,
新增加的virtual sequence继承seq lib基类而来,然后在test阶段将vseq绑定到v sequencer上
仿真报告中,seq lib基类中pre_body和post_body的信息没有打印
在vseq中检查starting_phase phase !=null,但是vseq用`uvm_do_on 调用的VIP seq中 starting_phase=null
run_phase阶段仿真时间没有推进,但是进入了body函数 ,使用工具 irun 12.20-s15 ,uvm版本1.1c,请问这种现象是什么原因引起的,在网上看到介绍说starting_phase 是seq成功指向sequencer的指针,那么我环境的问题是否是由于seq和sequencer的transaction类型不导致的
这个是正常的,vseq只会调用自己的pre&post,不会调用原来seq的,所以这种情况是必然的,
你在vseq的pre&post加上raise跟drop应该就可以了
先谢谢, vseq不能调用自己父类中的pre和post吗
2楼正解,这种情况是必然的,v_seq不会对这两个函数的
不推荐使用pre/post body两个函数,有时不会被call, 完全可以在基类的body中实现,然后实际用到的sequence的body中调用super.body()
starting phase的赋值发生的机制是1.run_test()->excute_phases()->traverse->excute()->sqr.start_phase_sequence();
2.start_phase_sequence()中会通过uvm_config_db::get 得到default_sequence的名字,如果get 到了default sequence的名字就会create default_sequence,并且将当前phase(uvm_main_phase或者uvm_run_phase)的句柄赋值给starting phase,如果没有get 到就会直接return退出当前函数;
3.由于uvm_config_db::set default sequence只针对的是virtual sequencer,当执行你调用的子sequencer的时候由于没有uvm_config_db::get到default sequence的名字,所以会直接退出return;4.所以如果使用了default_sequence机制,并且default sequence中有子sequence,这个时候要在子sequence使用starting_phase.raise_object要非常小心;4.这个跟pre body,post body貌似没有多大关系;
4.具体代码请见uvm1.1 中文件 uvm_sequencer_base.svh