使用ral模型读取寄存器时如何获得正确的响应数据(provide_responses = 0)

时间:2019-07-09 10:19:03

标签: response system-verilog uvm

我的寄存器访问总线支持出色的功能。我的驱动程序已经支持它。但是我必须在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

0 个答案:

没有答案