Martin Borja Posted July 17, 2013 Report Share Posted July 17, 2013 Hello Everyone,Good day.I am creating a testbench that has a structure shown below and am encountering errors perhaps due to the multi-layered virtual sequencer controlling both non-virtual sub sequencers and a virtual sub sequencer. Config's not shown.<start of diagram> .------------------------------------------------------. | my_test | | .--------------------------------------------------. | | | sequences | | | '--------------------------------------------------' | | .--------------------------------------------------. | | | my_env | | | '--------------------------------------------------' | '/----------------------------------------------------\' / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \.----------------------------------------------------------------------------------------------------.| my_env || .------------------------. || | my_virtual_sequencer | || '------------------------' || .-----------------------------------. .----------------------------. .---------------------------. || | sub_virtual_agent | | sub_agent_a | | sub_agent_b | || | .-------------------------------. | | .------------------------. | | .-----------------------. | || | | sub_virtual_sequencer | | | | sub_sequencer_a | | | | sub_sequencer_b | | || | '-------------------------------' | | '------------------------' | | '-----------------------' | || | .-------------------------. | | .------------------------. | | .-----------------------. | || | | sub_agent_3 | | | | driver_a | | | | driver_b | | || | .-------------------------. | | | '------------------------' | | '-----------------------' | || | | sub_agent_2 | | | | .------------------------. | | .-----------------------. | || | .---------------------------. | | | | | monitor_a | | | | monitor_b | | || | | sub_agent_1 | | | | | '------------------------' | | '-----------------------' | || | | .-----------------------. | | | | '----------------------------' '---------------------------' || | | | sub_sequencer_1 | | | | | || | | '-----------------------' | | | | || | | .-----------------------. | | | | || | | | driver_1 | | | | | || | | '-----------------------' | | | | || | | .-----------------------. | | | | || | | | monitor_1 | | |-' | || | | '-----------------------' |-' | || | '---------------------------' | || '-----------------------------------' |'----------------------------------------------------------------------------------------------------'<end of diagram>1) my_base_sequence (from w/c my_sequence_1 is extend)<start snip>class my_base_sequence extends uvm_sequence #(my_sequence_item); `uvm_object_utils(my_base_sequence) `uvm_declare_p_sequencer(sub_sequencer_1) function new (string name ="my_base_sequence"); super.new(name); endfunction virtual task pre_start(); if(get_parent_sequence() == null && starting_phase != null) starting_phase.raise_objection(get_sequencer()); else `uvm_error(get_type_name(), "starting_phase is null") endtask virtual task post_start(); if(get_parent_sequence() == null && starting_phase != null) starting_phase.drop_objection(get_sequencer()); endtaskendclass<end snip>2) my_virtual_sequence<start snip>class my_virtual_sequence extends uvm_sequence; my_sequence_1 i_my_sequence_1; `uvm_object_utils(my_virtual_sequence) `uvm_declare_p_sequencer(my_virtual_sequencer) virtual task body(); `uvm_do_on(i_my_sequence_1, p_sequencer.i_sub_virtual_sequencer.i_sub_sequencer_1); endtaskendclass<end snip>3) my_virtual_sequencer<start snip>class my_virtual_sequencer extends uvm_sequencer; sub_virtual_sequencer i_sub_virtual_sequencer; sub_sequencer_a i_sub_sequencer_a; sub_sequencer_b i_sub_sequencer_b; `uvm_component_utils(my_virtual_sequencer) function new (string name = "my_virtual_sequencer", uvm_component parent = null); super.new(name, parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); i_sub_virtual_sequencer = sub_virtual_sequencer::type_id::create("i_sub_virtual_sequencer",this); i_sub_sequencer_a = sub_sequencer_a::type_id::create("i_sub_sequencer_a",this); i_sub_sequencer_b = sub_sequencer_b::type_id::create("i_sub_sequencer_b",this); endfunctionendclass<end snip>4) my_env<start snip>class my_env extends uvm_env; my_virtual_sequencer i_my_virtual_sequencer; sub_virtual_agent i_sub_virtual_agent; sub_agent_a i_sub_agent_a; sub_agent_b i_sub_agent_b; `uvm_component_utils(my_env); extern function new (string name = "my_env", uvm_component parent = null); extern function void build_phase (uvm_phase phase); extern function void connect_phase (uvm_phase phase);endclassfunction my_env::new(string name = "my_env",uvm_component parent = null); super.new(name, parent);endfunctionfunction void my_env::build_phase(uvm_phase phase); super.build_phase(phase); i_sub_virtual_agent = sub_virtual_agent::type_id::create("i_sub_virtual_agent",this); uvm_config_db #(uvm_object_wrapper)::set(this, "i_sub_virtual_agent.i_sub_virtual_sequencer.i_sub_sequencer_1.main_phase","default_sequence",null); uvm_config_db #(uvm_object_wrapper)::set(this, "i_sub_virtual_agent.i_sub_virtual_sequencer.i_sub_sequencer_2.main_phase","default_sequence",null); uvm_config_db #(uvm_object_wrapper)::set(this, "i_sub_agent_a.i_sub_sequencer_a.main_phase", "default_sequence",null); uvm_config_db #(uvm_object_wrapper)::set(this, "i_sub_agent_b.i_sub_sequencer_b.main_phase", "default_sequence",null);endfunctionfunction void my_env::connect_phase(uvm_phase phase); super.connect_phase(phase); i_my_virtual_sequencer.i_sub_virtual_sequencer.i_sub_sequencer_1 = i_sub_virtual_agent.i_sub_virtual_sequencer.i_sub_sequencer_1; i_my_virtual_sequencer.i_sub_virtual_sequencer.i_sub_sequencer_2 = i_sub_virtual_agent.i_sub_virtual_sequencer.i_sub_sequencer_2; i_my_virtual_sequencer.i_sub_virtual_sequencer.i_sub_sequencer_3 = i_sub_virtual_agent.i_sub_virtual_sequencer.i_sub_sequencer_3; i_my_virtual_sequencer.i_sub_sequencer_a = i_sub_agent_a.i_sub_sequencer_a; i_my_virtual_sequencer.i_sub_sequencer_b = i_sub_agent_a.i_sub_sequencer_b;endfunction<end snip>5) my_test<start snip>class my_test extends uvm_test; my_env i_my_env; `uvm_component_utils(my_test) extern function new (string name = "my_test",uvm_component parent = null); extern function void build_phase (uvm_phase phase);endclassfunction my_test::new(string name = "my_test", uvm_component parent = null); super.new(name, parent);endfunctionfunction void my_test::build_phase(uvm_phase phase); super.build_phase(phase); i_my_env = my_env::type_id::create("i_my_env",this); uvm_config_db #(uvm_object_wrapper)::set(this, "i_my_env,i_my_virtual_sequencer.main_phase","default_sequence",my_virtual_sequence::type_id::get());endfunction<end snip>The result of this test run is as follows:<start snip>UVM_ERROR /some_path/my_sequence_lib.sv(693) @400000 : uvm_test_top.i_my_env.i_sub_virtual_agent.i_sub_agent_1.i_sub_sequencer_1@@my_virtual_sequence.i_sub_sequence_1 [my_virtual_sequence] starting_phase is null. . .UVM_INFO /cad_tools_path/F-2011.12-SP1/etc/uvm/base/uvm_phase.svh(1233) @400000 : reporter [PH_READY_TO_END] Phase 'uvm.uvm_sched.main' (id=2956) PHASE READY TO END<end snip>And then it ended w/o running the sub_sequence_1.The UVM_ERROR above shows that it was unable to get the raise.objection part to run.Any help/inputs to this is much appreciated.Thanks, Martin Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.