我的寄存器访问总线支持出色的功能。我的驱动程序已经支持它。但是我必须在ral适配器中设置Provide_responses = 0。然后寄存器读取数据(ral内置读取任务)是错误的。
我正在为ral使用显式预测变量。并从监视器获取读取的响应数据(uvm_reg_predictor.bus_in)。但是数据不会更新为ral读取任务。
我通过TLM将读取的响应事务从监视器发送到ral预测变量。 Ral Prodictor中的写函数如下。
您能否帮助您弄清代码或解决方案出了什么问题?如果您需要更多信息,请随时告诉我。
//write method called by bus_in port
virtual function void write(rcb_transaction tr);
rcb_transaction req_tr;
access_t curr_access[uvm_reg];
field_t m_reg_fields[uvm_reg];
uvm_reg m_reg[$];
bit in_map[$];
bit modify_access;
req_tr = rcb_transaction::type_id::create("req_tr");
m_resp_with_req_tr.copy(tr);
`uvm_info(get_type_name(), $psprintf("rcb response predictor trans_id:%d, trans: \n%s", tr.id, tr.sprint()), UVM_HIGH);
if(tr.rcb_cmd == READ) begin
req_tr = m_req_predictor.get_rd_request_transaction(tr.id);
if(m_resp_with_req_tr != req_tr) begin
`uvm_warning(get_type_name(), {"Unable to get matching request for response", tr.sprint()});
end else begin
m_reg[0] = map.get_reg_by_offset(m_resp_with_req_tr.addr, (m_resp_with_req_tr.rcb_cmd == READ));
if(m_reg[0] != null) begin
`uvm_info(get_type_name(), "Observed targeting a register", UVM_FULL);
// return;
end else begin
`uvm_info(get_type_name(), $sformatf("Observed transaction does not target a register:%s",m_resp_with_req_tr.sprint()), UVM_FULL)
return;
end
end
end
endfunction : write