I am going to write to the specific registers filed via the task like follow
task automatic set_register(string block_name, string register_file, string register_name, string field_name, bit [3:0] RegisterValue);
uvm_reg_block reg_model;
uvm_reg_block reg_block;
uvm_reg reg_name[$];
uvm_reg_field reg_field[$];
uvm_status_e status;
reg_model = m_env.m_ral.lckg_ral;
reg_block = reg_model.get_block_by_name(block_name);
if (reg_block == null)
`uvm_fatal_context("set_register", "lckg_ral block not found", uvm_root::get());
reg_block.get_registers(reg_name);
reg_block.get_fields(reg_field);
foreach (reg_field[i]) begin
if ((reg_field[i].get_name() == field_name) && (reg_field[i].get_parent().get_name() == register_name) && (reg_field[i].get_parent().get_regfile().get_name() == register_file)) begin
reg_field[i].set(RegisterValue);
end
end
foreach (reg_name[i]) begin
if ((reg_name[i].get_name() == register_name) && (reg_name[i].get_regfile().get_name() == register_file)) begin
reg_name[i].update(status);
end
end
endtask
This task is called when reach to the core of nested foreach loop in main_phase
foreach (cfg.paths[input_clk]) begin
foreach (cfg.paths[input_clk][output_clk]) begin
foreach (cfg.paths[input_clk][output_clk][string1]) begin
foreach (cfg.paths[input_clk][output_clk][string1][string2]) begin
foreach (cfg.paths[input_clk][output_clk][string1][string2][string3]) begin
foreach (cfg.paths[input_clk][output_clk][string1][string2][string3][string4]) begin
set_register("boston_lckg_lckg_csr", string2, string3, string4, cfg.paths[input_clk][output_clk][string1][string2][string3][string4]);
end
end
end
end
end
end
and the paths is the associate array which is defines:
int paths [ace_input_clks_e][ace_output_clks_e][string][string][string][string];
The above task working properly but not sure what I am doing is the good approach in terms of UVM RAL and systemVerilog concept, as well as number of search I am doing, or there is optimized option?