uvm_reg_hw_reset_seq does not check all registers of a block if the block contains regfiles and has sub-blocks that also contain regfiles.
I have a register model of following structure:
Block A +- Regfile A1 | +- Reg A1.1 | +- Reg A1.2 +- Regfile A2 | +- Reg A2.1 | +- Reg A2.2 +- Block SubA +- Regfile SubA1 +- Reg SubA1.1 +- Reg SubA1.2
If i run the uvm_reg_hw_reset_seq on “Block A” only the registers “SubA1.1” and “SubA1.2” will be checked.
hw_reset_seq = uvm_reg_hw_reset_seq::type_id::create("hw_reset_seq");
hw_reset_seq.model = blockA;
`uvm_send(hw_reset_seq);
The reason for this behavior lies in the do_block(…) task of the uvm_reg_hw_reset_seq (line 109-112):
maps[d].get_submaps(sub_maps);
if(sub_maps.size() !=0) begin
continue;
end
uvm_reg_map of “Block A” contains all “local” registers (“A1.1”, “A1.2”, “A2.1”, “A2.2”) but also has a submap for block “SubA”.
So sub_maps.size() is 1 and the current uvm_reg_map (including all local registers of “Block A”) is skipped.
Is this a bug in the uvm_reg_hw_reset_seq or am i doing something wrong?