class apb_protect_field_cb extends uvm_reg_cbs;
static local bit config lock enabled,
function new (string name);
super.new (name);
endfunction
virtual function void post_predict(
input uvm_reg field fld,
input uvm_reg_data_t previous,
inout uvm_reg_data_t value,
input uvm_predict e_kind,
input uvm_path e_path,
input uvm_reg_map map);
if (kind == UVM_PREDICT_WRITE) begin
//Protect config registers if config for APB accesses
if ((config_lock _enabled so (fld.get_access (map) != “W1C")) && (map.get_name() == “apb_ map") && is_parent_regmodel_pxcxixe (fld)) begin
// Revert to previous value if protected
value = previous;
end
end
endfunction
// Method: xxx apb write reg by name
// Do a write of a named xxx register via APB.
virtual task xxx_apb_write_reg_by_name(bit if_xxx_cfg, string regname, uvm_reg_data_t data) ;
uvm_status_e status;
uvm_reg found_reg;
if (if_xxx_cfg) begin
found_reg = xxx_tx_regblk.get_reg_by _name(regname) ;
end
else begin
found_reg = xxx_rx_regblk. get_reg_by_name(regname) ;
end
if (found_reg == null) begin
uvm_fatal(get_type_name (), $sformatf("Could not find register: %s", regname))
end
found_reg.write(.status(status) , .value(data) , .map(xxx_apb map)) ;
if (status != UVM_IS_OK) begin
uvm_error (get_type _name() , ssformatf ("Write to register &s via APB failed; status %s', regname, status. name ( ) ) )
end
endtask // xxx_apb_write_reg_by_name
//Function: predict field
// Function to call predict on a field
virtual function void predict_field(string regname, string fieldname, uvm_reg_data_t data) ;
uvm_reg found_reg;
uvm_reg_field found_field;
found _reg = get_reg_by_name (regname) ;
if (found_reg == null) begin
`uvm_fatal(get_type_name(), $sformatf("Could not find register: %s", regname))
end
found_field = found_reg. get_field_by_name(fieldname);
if (found_field == null) begin
`uvm_ fatal (get_type name(), $sformatf("Could not find field %s in register %s", fieldname, regname))
end
found_field.predict(data);
endfunction // predict_field
// Method: update registers apb
// Updates all registers using APB.
virtual task update_registers_apb ();
uvm_reg regs[$];
uvm_status _e status:
bit ignore_reg;
apb map.get_registers (regs);
// Can also add option to update in random order
foreach (regs[i]) begin
if (regs[i].needs update()) begin
regs[i].update(.status(status),.map(apb_map)) ;
if (status != UVM IS OK) begin
uvm_error(get_type_name), $sformatf("Update of register &s via APB failed; status=%s",
regs[i].get_full_name(), status.name ()))
end
end // if (regs[i].needs_update())
end // foreach (regs (ij)
endtask // update registers apb
some useful regmodel access functions/tasks
于 2023-01-15 17:46:49 首次发布