I am trying to create two register maps and then setting default map using “set_default_map” after adding registers. Then taking this register model instance in top-level register map where other maps are instantiated.
Here is snippet of my code.
class reg_block extends uvm_reg_block;
// Now define address mappings
spi_map = create_map("spi_map", 16'h0000, 2, UVM_LITTLE_ENDIAN);
ahb_map = create_map("ahb_map", 16'h0000, 2, UVM_LITTLE_ENDIAN);
//Add registers into spi map
spi_map.add_reg(reg_1,16'h0,RO)
spi_map.add_reg(reg_2,16'h0,RO)
/Add registers into spi map
ahb_map.add_reg(reg_1,16'h0,RO)
ahb_map.add_reg(reg_2,16'h0,RO)
set_default_map(ahb_map);
this.lock_model();
end reg_block
//top reg
package top_reg_pkg;
class top_reg_model extends uvm_reg_block;
rand my_reg_block_c m_reg;
rand uvm_mem m_mem;
uvm_reg_map top_map;
`uvm_object_utils(top_reg_model)
virtual function void build();
bit BYTE_ADDRESSING_OFF = 0; // assign zero to byte_addressing to turn it off
top_map = create_map( "top_map", 0, 2, UVM_LITTLE_ENDIAN, BYTE_ADDRESSING_OFF );
m_reg = my_reg_block_c::type_id::create("m_reg", , get_full_name());
m_reg.configure(this, "");
m_reg.build();
top_map.add_submap( ahb_map, 16'h8000 );
top_map.add_submap( spi_map, 16'4000 );
m_reg.set_default_map(m_reg.ahb_map);
m_reg.lock_model();
m_mem = new( "m_mem", `DATARAM_SIZE, 16 );
m_mem.configure( this, "" );
top_map.add_mem( m_mem, `DATARAM_BASE );
this.lock_model()
endfunction
endclass
endpackage
//In environment
class my_env extends uvm_env
virtual function build_phase()
function build_phase()
if( m_regmodel == null) begin
m_regmodel = top_reg::type_id::create("m_regmodel");
m_regmodel.build();
m_regmodel.lock_model();
// Set the regmodel object in the config_db so that it can be picked up by others
uvm_config_db#(top_uvm_reg_block)::set( null, "", "top_uvm_reg_block", m_regmodel );
end
endfunction
function connect_phase
m_regmodel.top_map.set_sequencer( spi_mst_agent.m_sqr, m_reg_adapter );
// Setup the regmodel predictor
m_reg_predictor.map = m_regmodel.top_map;
m_reg_predictor.adapter = m_reg_adapter;
// Turn on/off auto prediction.
m_regmodel.top_map.set_auto_predict(1);
m_ahb_predictor.map = m_regmodel.top_map;
m_ahb_reg_predictor.adapter = m_ahb_reg_adapter;
m_regmodel.top_map.set_sequencer( m_ahb_agent.m_sequencer, m_ahb_reg_adapter );
m_regmodel.m_reg.ahb_map.set_auto_predict(1);
// Connect the master monitor's analysis port to the predictor's bus_in port.
m_spi_mst_agent.m_mon.m_ap.connect( m_reg_predictor.bus_in );
m_ahb_agent.analysis_port.connect(m_ahb_reg_predictor.bus_in);
endfunction
In my Test class
bit_bashtest_seq.model = m_env.m_regmodel.m_reg;
bit_bashtest_seq.start(null);
somehow my test always takes spi_map as a default map even though i have set ahb_map as default map in reg-model.
In my test i see following message being printed.
Reading address 'h4000 via map “m_regmodel.m_reg.spi_map”…
When I comment all “spi_map.add_reg” for register model ,then only it is taking AHB MAP.
Can someone please let me know if I am missing anything here ? It’s bit urgent.