目录
1 两种sequence中的starting_phase赋值方法
2 UVM1.1和UVM1.2版本中starting_phase赋值的注意事项
1 两种sequence中的starting_phase赋值方法
在UVM中,由于driver以及monitor中main_phase常常是一个死循环,故常常将仿真验证平台的进程控制放在sequence中。 在sequence中可以使用starting_phase来控制验证平台的关闭。那怎么为sequence中的starting_phase赋值呢?
有两种方式为starting_phase赋值。
1:在test_case中的main_phase()中,手动为sequence中的starting_phase赋值。
例如:seq.start(env.i_agt.sqr);
class my_case0 extends base_test;
function new(string name = "my_case0", uvm_component parent = null);
super.new(name,parent);
endfunction
`uvm_component_utils(my_case0)
virtual task main_phase(uvm_phase phase);
sequence0 seq0;
sequence1 seq1;
seq0 = new("seq0");
seq0.starting_phase = phase; //手动为seq0中的starting_phase赋值
seq1 = new("seq1");
seq1.starting_phase = phase;
fork
seq0.start(env.i_agt.sqr);
seq1.start(env.i_agt.sqr);
join
endtask
endclass
2:将此sequence作为sequencer的某动态运行phase的default_phase时,starting_phase不为null。
function void my_case0::build_phase(uvm_phase phase);
super.build_phase(phase);
//采用default_sequence启动seq时,seq的starting_phase不为null
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.i_agt.sqr.main_phase",
"default_sequence",
case0_sequence::type_id::get());
endfunction
2 UVM1.1和UVM1.2版本中starting_phase赋值的注意事项
- 在uvm1.1中采用default_sequence中会自动给starting_phase进行赋值;
- 但是uvm1.2不建议使用default_sequence,这样不会给starting_phase。所以在uvm1.2中,即使使用了default_sequence,sequence中starting_phase仍然为null。
- 建议采用start手动启动sequence,手动给starting_phase赋值,既然保证UVM版本的兼容性,也能增加代码的灵活性。