Jump to content


  • Content Count

  • Joined

  • Last visited

  1. I have a UVC that has multiple agents, each with a single sequencer. I want to use the factory to do instance overrides on a per agent basis. So lets assume I have 2 agents, and the sequencer hierarchy looks like this: env.agent0.sequencer env.agent1.sequencer These sequencers create uvm_sequence_items, but suppose we want to override this on agent1. Lets define a class called my_sequence_item which extends uvm_sequence_item. I can use a factory instance override like so: uvm_sequence_item::type_id::set_inst_override(my_sequence_item::get_type(), "env.agent1.*"); This works as you would expect. The sequencer in agent0 is generating uvm_sequence_items, and the sequencer in agent1 is generating my_sequence_items. Note in my sequences I am using a standard `uvm_do() to create the sequence item. The problem arises when I use a virtual sequencer. Now I have 3 sequencers, one of which is virtual: env.virtual_sequencer env.agent0.sequencer env.agent1.sequencer When I use the virtual sequencer to load sequences on the sequencers in the agents, the factory override does not take effect. Is this a known issue, or is this desired behavior? I've debugged it thoroughly and I understand whats going on. Seems like a bug to me. The suspect code is in uvm_sequence_item::get_full_name(). This is the code which determines the name of a sequence or sequence_item. Here is it: // Function- get_full_name // // Internal method; overrides must follow same naming convention function string get_full_name(); if(m_parent_sequence != null) get_full_name = {m_parent_sequence.get_full_name(), "."}; else if(m_sequencer!=null) get_full_name = {m_sequencer.get_full_name(), "."}; if(get_name() != "") get_full_name = {get_full_name, get_name()}; else begin get_full_name = {get_full_name, "_item"}; end endfunction Lets suppose we just have a single sequence called "my_seq" that gets run directly on the sequencers in the agents. It creates sequence_items called "my_item". Because there is no parent_sequence, the resulting full name for the sequence item will be "env.agent1.sequencer.my_seq.my_item". The factory will apply the override correctly. Now add the virtual sequencer to the equation. The initiating sequence will be a virtual sequence called "my_virtual_seq". The virtual sequence will get the fullname "env.virtual_sequencer.my_virtual_seq". It kicks of the "my_seq" sequence on agent1.sequencer. The fullname for myseq will be "env.virtual_sequencer.my_virtual_seq.my_seq". When it creates items, they will get the name "env.virtual_sequencer.my_virtual_seq.my_seq.my_item". The factory override will not take effect on this hierarchical name. It seems to me that the first part of the "if" clause should apply to only nested sequences running on a single sequencer. It should not apply to virtual sequences kicking sequences off on another sequencer. I think the resulting hierarchical name should reflect the actual physical sequencer on which the sequence is being run. Has anyone run into this issue? Thanks! Jeremy
  • Create New...