1.寄存器模型的常规方法
每一个寄存器的field都有两个值,一个是镜像值(mirrored value),一个是期望值(desired value)
镜像值可能域硬件实际值(actual value)不一致。mirrored value与desired value是寄存器模型的属性,而actual value对应着硬件的真实数值。
uvm提供了两种用来跟踪寄存器值的方式:
自动预测:uvm_reg_map::set_auto_predict()
显式预测(explicit):环境中独立的predictor
//显式预测
class mcdf_bus_env extends uvm_env;
mcdf_bus_agent agent;
mcdf_rgm rgm;
reg2mcdf_adapter reg2mcdf;
uvm_reg_predictor #(mcdf_bus_trans) mcdf2reg_predictor; //predictor只需要定义类型
`uvm_component_utils(mcdf_bus_env)
...
function void build_phase(uvm_phase phase);
agent = mcdf_bus_agent::type_id::create("agent", this);
if(!uvm_config_db#(mcdf_rgm)::get(this, " ", "rgm", rgm)) begin
`uvm_info("GETRGM", "no top-down RGM handle is assigned", UVM_LOW)
rgm = mcdf_rgm::type_id::create("rgm", this);
`uvm_info("NEWRGM", " created rgm instance locally", UVM_LOW)
end
rgm.build();
reg2mcdf = reg2mcdf_adapter::type_id:: create("reg2mcdf");
mcdf2reg_predictor =
uvm_reg_predictor#(mcdf_bus_trans)::type_id::create("mcdf2reg_predictor", this);
mcdf2reg_predictor.map = rgm.map;
mcdf2reg_predictor.adapter = reg2mcdf;
endfunction
function void connect_phase(uvm_phase phase);
rgm.map.set_sequencer(agent.sequencer, reg2mcdf);
agent.monitor.ap.connect(mcdf2reg_predictor.bus_in);
endfunction
endclass
通过desired的值来更新硬件的actual的值
read() 读寄存器,读回硬件实际值
write() 修改硬件实际值
peek() 后门方式读取硬件实际值
poke() 后门方式修改硬件实际值
mirror() 读回硬件实际值,更新或检查镜像值
update() 如果期望值/镜像值不同于实际值,则修改硬件实际值
reset() 复位 block/register/filed的期望值和镜像值
get_reset() 获取register/field的复位值
get() 获取register/field的期望值
set() 修改register/field的期望值
对于前门访问的read()和write(),在总线事务完成时ÿ