我正在尝试按实例覆盖序列。 示例代码将最好地描述它:
class my_vir_seq extends base_vir_seq;
my_seq_c seq1, seq2;
`uvm_object_utils_begin(my_vir_seq)
`uvm_field_object(seq1, UVM_ALL_ON)
`uvm_field_object(seq2, UVM_ALL_ON)
`uvm_object_utils_end
`uvm_declare_p_sequencer(v_seqr)
function new(string name = "my_vir_seq");
super.new(name);
endfunction // new
virtual task body();
`uvm_do_on(seq1, p_sequencer.my_seqr)
`uvm_do_on(seq2, p_sequencer.my_seqr)
endtask // body
endclass
class my_err_vir_seq extends my_vir_seq;
my_err_seq_c seq3;
`uvm_object_utils_begin(my_err_vir_seq)
`uvm_field_object(seq3, UVM_ALL_ON)
`uvm_object_utils_end
`uvm_declare_p_sequencer(v_seqr)
function new(string name = "my_err_vir_seq");
super.new(name);
my_seq_c::type_id::set_inst_override(my_err_seq_c::get_type(), "sve.v_seqr.my_err_vir_seq.seq2" );
endfunction // new
endclass
我的目标是仅使用seq2
覆盖seq3
(其类型扩展为seq2
的类型)。
我没有得到任何错误,但原始序列运行,
我做错了什么?
提前致谢,
以斯哈
答案 0 :(得分:1)
按实例进行类型覆盖是(我认为)概念性地用于派生自uvm_component
的类的实例,因为它们具有特定的分层路径。
对于序列也有一个技巧,使用音序器的路径作为set_inst_override(...)
的参数(你试过的那种)。但是,您需要对序列进行一些更改以支持此操作。在创建seq1
和seq2
时,您必须为他们提供一个上下文(仅显示seq2
),以便工厂可以找到它们:
// get_full_name() is the third argument
// - the second argument is empty, it's not a typo
seq2 = my_seq_c::type_id::create("seq2", , get_full_name());
创建序列后,您可以使用start(...)
:
seq2.start(p_sequencer.my_seqr, this);
您可以在此处找到DVCon 2013论文:DVCon 2013 paper