some useful regmodel access functions/tasks


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值