Executing RegModel translation sequence on sequencer, does not have an upstream sequencer defined. Execution of register items available only via direct calls to 'do_rw_access'

Hi,

I am trying implement RAL. I am getting following UVM_WARNING and my test is hanging.

UVM_WARNING /synopsys/vcs_mx_J-2014.12-sp3/etc/uvm/reg/uvm_reg_sequence.svh(137) @ 0: uvm_test_top.env.sagent.ssp_seqr@@s_seq [REG_XLATE_NO_SEQR] Executing RegModel translation sequence on sequencer uvm_test_top.env.sagent.ssp_seqr’ does not have an upstream sequencer defined. Execution of register items available only via direct calls to ‘do_rw_access’

MY code :

class spi_reg_wr_rd_ral extends my_test;

`uvm_component_utils(spi_reg_wr_rd_ral)

spi_reg_wr_rd_seq_ral s_seq;

extern function new (string name = “spi_reg_wr_rd_ral” , uvm_component parent);
extern function void build_phase(uvm_phase phase);
extern task run_phase(uvm_phase phase);

endclass : spi_reg_wr_rd_ral

function spi_reg_wr_rd_ral :: new (string name = “spi_reg_wr_rd_ral”, uvm_component parent);
super.new(name, parent);
endfunction

function void spi_reg_wr_rd_ral :: build_phase (uvm_phase phase);
super.build_phase(phase);
`uvm_info(“SPI_DUT_MSTR_TX_TEST”,“\n\t Entering spi_reg_wr_rd_ral build phase”,UVM_LOW)
s_seq = spi_reg_wr_rd_seq_ral ::type_id::create ( .name(“s_seq”), .contxt (get_full_name()));

`uvm_info(“SPI_DUT_MSTR_TX_TEST”,“\n\t Exiting spi_reg_wr_rd_ral build phase”,UVM_LOW)
endfunction

task spi_reg_wr_rd_ral :: run_phase (uvm_phase phase);
phase.raise_objection(this);
//start the sequencer
s_seq.reg_block = reg_block ;
s_seq.start(.sequencer (env.sagent.ssp_seqr));

phase.drop_objection(this);

endtask

BASE TEST - > my_test

class my_test extends uvm_test;

`uvm_component_utils(my_test)

virtual ssp_if intf1;
virtual ssp_if intf2;

ssp_env env;
ssp_env_config env_cfg;
ssp_agent_config sagent_cfg;
trick_agent_config tagent_cfg;

ssp_reg_block reg_block;

extern function new (string name = “my_test” , uvm_component parent);
extern function void build_phase(uvm_phase phase);
extern function void connect_phase(uvm_phase phase);
extern function void start_of_simulation_phase(uvm_phase phase);
extern task run_phase(uvm_phase phase);

endclass : my_test

function my_test :: new (string name = “my_test”, uvm_component parent);
super.new(name, parent);
endfunction

function void my_test :: build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info(“MY_TEST”,"\n\t Entering my_test build phase ",UVM_LOW);

 reg_block = ssp_reg_block::type_id::create( "reg_block" ); 
 reg_block.build(); 
 
 env_cfg = ssp_env_config::type_id::create("env_cfg");
 
 env_cfg.reg_block = reg_block;

 sagent_cfg = ssp_agent_config::type_id::create("sagent_cfg");
 tagent_cfg = trick_agent_config::type_id::create("tagent_cfg");
    
 if(!uvm_config_db #(virtual ssp_if)::get(this,"","ssp_if",intf1))
    `uvm_fatal("MY_TEST","No virtual interface set at top for trick agent")
 if(!uvm_config_db #(virtual ssp_if)::get(this,"","trick_if",intf2))
    `uvm_fatal("MY_TEST","No virtual interface set at top for ssp agent")

 sagent_cfg.intf = intf1 ;
 tagent_cfg.intf = intf2;

 env_cfg.sagent_cfg = sagent_cfg;
 env_cfg.tagent_cfg = tagent_cfg;

 env = ssp_env::type_id::create(.name("env"),.parent(this));
 uvm_config_db#(ssp_env_config)::set(this,"*","env_cfg",env_cfg);


   `uvm_info("MY_TEST","\n\tExiting my_test build phase ",UVM_LOW);

endfunction : build_phase

function void my_test :: start_of_simulation_phase(uvm_phase phase);
uvm_test_done.set_drain_time(this, 600);
uvm_test_done.set_report_verbosity_level(UVM_HIGH);
endfunction : start_of_simulation_phase

In reply to Jayakirthi Reddy:

More data are required to help. Specifically how does your uvm_reg_sequence “spi_reg_wr_rd_seq_ral” look like?

  • Did you implement its body() method of the sequence where you write/read registers/memories?
  • Or you are using it a translation mid-way sequence? in this case you need to set the reg_seqr field to point to the upstream seqr where you pull the high abstraction level register transactions.

Hi ayehia,

Thanks for the reply

I solved the above mentioned issue. It was a mistake. My sequence was extended from uvm_reg_sequence and I was calling “super.body” in actual body method of sequence. I removed it. Now it works fine.

I am not aware of internal details of uvm_reg_sequence. If possible can you explain why body method is present in uvm_reg_sequence, if it is required, Why can’t I use super.body.

Thanks in Advance.