第一种:手工启动sequence时为starting_phase赋值。 例如:seq.start(env.i_agt.sqr); classmy_case0extendsbase_test; functionnew(string name ="my_case0", uvm_component parent =null); super.new(name,parent); endfunction `uvm_component_utils(my_case0) extern virtual task main_phase(uvm_phase ph...
当验证平台进入某个phase时,在执行消耗时间的语句之前执行phase.raise_objection(this);在phase的最后执行phase.drop_objection(this); 对于12个run-time的phase,这里假定某时刻进入了mian_phase,uvm收集各个component提出的objection,并且实时监测是否所有的objection都已经撤销,如果某个时刻所有的objection都已经撤销,则当前...
uvm_config_db#(uvm_object_wrapper)::set(this,"i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get()); 提起和撤销objection:在sequence中使用starting_phase进行提起和撤销objection if(starting_phase != null) starting_phase.raise_objection(this); if(starting_phase != null) start...
function new(string name = "base_test", uvm_component parent = null); super.new(name,parent); endfunction extern virtual function void build_phase(uvm_phase phase); extern virtual function void connect_phase(uvm_phase phase); extern virtual function void report_phase(uvm_phase phase); `uvm_...
ckseq.model = p_sequencer.p_rm; ckseq.start(null); ckseq2 =new("ckseq2"); ckseq2.model = p_sequencer.p_rm; ckseq2.start(null); if(starting_phase !=null) starting_phase.drop_objection(this); endtask endclass 148关注 -22
上网查资料发现原来是uvm1.2中设置default_sequence不会自动给starting_phase赋值,即他的值还是Null。uvm1.1中才会自动赋值,把Makefile脚本中的uvm1.2改成uvm1.1,问题就解决了。 修改成1.1的库: 再次运行vcs: 可见,UVM平台成功运行,打印出来MATLAB模型和Verilog模型的输出,比对成功。
if(starting_phase != null) starting_phase.drop_objection(this); endtask : post_start 请注意,starting_phase仅为作为特定阶段的默认序列启动的序列定义。如果已通过调用序列的 start 方法显式启动它,则用户负责设置starting_phase。 类usb_simple_bulk_test扩展uvm_test; ...
在uvm进入到1.2后,starting_phase不在推荐使用。更为重要的是,不仅仅是不再推荐,而且如果以default sequence的方式启动以后,default sequence被启动以后,starting_phase依然会是null,如果沿用以前的代码,整个平台就起不来了 taskbody()if(starting_phase!=null)starting_phase.raise_objection(this)//do somethingif(st...
my_sequence中的raise_objection和drop_objection是属于phase的一个函数,但是uvm_sequence是一个uvm_object,而phase是属于component的一个概念。因此用starting_phase != null来判断。starting_phase实际上是uvm_sequence指向phase的一个指针,当sequencer在main_phase中启动default_sequence时,sequencer就将phase赋值给sequence...
starting_phase.raise_objection(this); repeat (10) begin `uvm_do(m_trans) end #1000; if(starting_phase != null) starting_phase.drop_objection(this); endtask `uvm_object_utils(my_sequence) endclass `endif 1. 2. 3. 4. 5. 6. ...