There are separate sequences running on multiple instances of UVC. In a testcase, I want to override the transaction item in particular instance of sequence. I tried the below, which is not working. Any clue ?
class baseseq extends uvm_sequence;
task body();
basetrans = trans::type_id::create ("trans");
start_item(trans);
trans.randomize();
finish_item(trans);
endtask
endclass
class basetest extends uvm_test;
task run;
foreach (seq[id]) begin // Let's say id is from 0 to 4
seq[id]=baseseq::type_id::create($sformatf("seq_%0d",id), ,get_full_name());
seq[id].start(seqr[id]);
end
endtask
endclass
class mytest extends basetest;
class errtrans extends basetrans;
// additional functionalities
endclass
task run;
foreach (seq[id]) begin
seq[id]=baseseq::type_id::create($sformatf("seq_%0d",id), ,get_full_name());
seq[id].start(seqr[id]);
end
basetrans::type_id:set_inst_override(errtrans:get_type(), {get_full_name,".seq_4"});
// I expect the override type should effect from now, but is not happening !!
foreach (seq[id]) begin
seq[id]=baseseq::type_id::create($sformatf("seq_%0d",id), ,get_full_name());
seq[id].start(seqr[id]);
end
endtask
endclass
Instance overrides just require the create() name of the instance to match the pattern of the override. You have an override that looks like it would be intended to override the sequence, not the transaction. It looks like you have followed most of the recommendations in the cookbook page Sequences/Overrides - just a couple of things need changed in your code to make it work:
(1) give your transaction instance some context when you create it in class baseseq, otherwise you can’t easily match it with an instance override. Recommend you change the create() to add the 3rd context argument:
basetrans trans = basetrans::type_id::create("trans",,get_full_name());
^^^^^^^^^^^^^^^^^
The transaction (that you wish to override) now has a context which is the get_full_name() OF THE SEQUENCE.
You need to match that up with (a) your create() of the sequence and (b) your instance override.
(2) in the sequence creation and override, use the get_full_name() of seqr[4], not of the test, and append the actual transaction name to the instance override (or a wildcard):
basetrans::type_id::set_inst_override(errtrans::get_type(), {seqr[4].get_full_name,".seq_4.trans"});
^^^^^^^^ ^^^^^^
foreach (seq[id]) begin
seq[id]=baseseq::type_id::create($sformatf("seq_%0d",id), ,seqr[id].get_full_name());
^^^^^^^^^
BTW kudos for using a NESTED CLASS for your definition of errtrans, inside your test. That is a great technique for keeping all aspects of a testcase together in one file, especially when the override is as simple as e.g. adding a random constraint on the base transaction. Just remember that class still needs a `uvm_object_utils so that the factory knows about it, and you need to ensure all such nested classes have unique names!
Gordon, Thanks for the solution. It did work :) I have also tried the below method previously
basetrans trans = basetrans::type_id::create("trans");
$display ("Full_NAME=%0s", trans.get_full_name());
This was to get the hierarchical path of the transaction item. It was giving the result “env.seqr_4.seq_4.trans” and in the test, I had done the following