NVDLA系列之C-model:glb-gen<107>

// cmod/glb/gen/gec_reg_model.cpp

gec_reg_model.cpp

// ================================================================
// NVDLA Open Source Project
// 
// Copyright(c) 2016 - 2017 NVIDIA Corporation.  Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with 
// this distribution for more information.
// ================================================================

// File Name: gec_reg_model.cpp

#include "gec_reg_model.h"
#include "arnvdla.uh"
#include "arnvdla.h"
#include "cmacros.uh"
#include "log.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

SCSIM_NAMESPACE_START(cmod)
    MK_UREGSET_CLASS(NVDLA_GEC)
SCSIM_NAMESPACE_END()

USING_SCSIM_NAMESPACE(cmod)
USING_SCSIM_NAMESPACE(clib)
using namespace tlm;
using namespace sc_core;
using namespace std;

gec_reg_model && GecAccessRegister && GecRegReset


gec_reg_model::gec_reg_model() {
    
    
    gec_register_group = new CNVDLA_GEC_REGSET;
    GecRegReset();
}

gec_reg_model::~gec_reg_model() {
    
    
    delete gec_register_group;
}

bool gec_reg_model::GecAccessRegister(uint32_t reg_addr, uint32_t & data, bool is_write) {
    
    
    uint32_t offset;
    uint32_t rdata = 0;

    offset                  = (reg_addr & 0xFFF);  // each sub-unit has only 4KBytes

    if (is_write) {
    
     // Write Request
        gec_register_group->SetWritable(offset, data);
        // Write done
    } else {
    
     // Read Request
        gec_register_group->GetReadable(offset, &rdata);
        data = rdata;
    }
    GecUpdateVariables(gec_register_group);
    return true;
}

void gec_reg_model::GecRegReset() {
    
    
        gec_register_group->ResetAll();

}

这段代码看起来是一个C++类 gec_reg_model 的实现,该类用于访问和管理某种硬件寄存器组,这些寄存器用于配置和控制硬件设备。以下是代码的主要功能:

  1. 构造函数 gec_reg_model::gec_reg_model():在对象创建时,分配了一个名为 gec_register_groupCNVDLA_GEC_REGSET 类型的指针,并调用了 GecRegReset() 函数来初始化这个寄存器组。

  2. 析构函数 gec_reg_model::~gec_reg_model():在对象销毁时,释放了之前分配的 gec_register_group 指针,以避免内存泄漏。

  3. 函数 bool gec_reg_model::GecAccessRegister(uint32_t reg_addr, uint32_t & data, bool is_write):这是一个用于读写硬件寄存器的函数。根据 is_write 参数的值,它可以执行读取或写入操作。根据给定的 reg_addr(寄存器地址),函数计算出偏移量 offset,然后执行相应的操作。如果是写操作,则调用 gec_register_group->SetWritable(offset, data) 来将数据写入寄存器组;如果是读操作,则调用 gec_register_group->GetReadable(offset, &rdata) 来从寄存器组中读取数据,并将读取的数据存储在 data 变量中。最后,它调用 GecUpdateVariables(gec_register_group) 来更新相关的变量。

  4. 函数 void gec_reg_model::GecRegReset():这个函数用于重置寄存器组中的所有寄存器。它调用 gec_register_group->ResetAll() 来执行重置操作。

这段代码的目的似乎是创建一个类,该类可以用于访问和操作硬件寄存器组,包括读取和写入操作以及寄存器的重置。这个类的具体功能可能取决于 CNVDLA_GEC_REGSET 类型的定义和相关的函数实现。

GecUpdateVariables


void gec_reg_model::GecUpdateVariables(CNVDLA_GEC_REGSET *reg_group_ptr) {
    
    
        feature_num_err_ = reg_group_ptr->rFEATURE.uNUM_ERR();
        feature_num_err_slices_ = reg_group_ptr->rFEATURE.uNUM_ERR_SLICES();
        swreset_swrst_ = reg_group_ptr->rSWRESET.uSWRST();
        missionerr_type_code_ = reg_group_ptr->rMISSIONERR_TYPE.uCODE();
        current_counter_value_value_ = reg_group_ptr->rCURRENT_COUNTER_VALUE.uVALUE();
        missionerr_index_idx_ = reg_group_ptr->rMISSIONERR_INDEX.uIDX();
        correctable_threshold_count_ = reg_group_ptr->rCORRECTABLE_THRESHOLD.uCOUNT();
        missionerr_inject_unlock_value_ = reg_group_ptr->rMISSIONERR_INJECT_UNLOCK.uVALUE();
        errslice0_missionerr_enable_err31_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR31();
        errslice0_missionerr_enable_err30_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR30();
        errslice0_missionerr_enable_err29_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR29();
        errslice0_missionerr_enable_err28_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR28();
        errslice0_missionerr_enable_err27_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR27();
        errslice0_missionerr_enable_err26_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR26();
        errslice0_missionerr_enable_err25_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR25();
        errslice0_missionerr_enable_err24_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR24();
        errslice0_missionerr_enable_err23_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR23();
        errslice0_missionerr_enable_err22_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR22();
        errslice0_missionerr_enable_err21_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR21();
        errslice0_missionerr_enable_err20_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR20();
        errslice0_missionerr_enable_err19_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR19();
        errslice0_missionerr_enable_err18_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR18();
        errslice0_missionerr_enable_err17_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR17();
        errslice0_missionerr_enable_err16_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR16();
        errslice0_missionerr_enable_err15_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR15();
        errslice0_missionerr_enable_err14_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR14();
        errslice0_missionerr_enable_err13_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR13();
        errslice0_missionerr_enable_err12_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR12();
        errslice0_missionerr_enable_err11_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR11();
        errslice0_missionerr_enable_err10_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR10();
        errslice0_missionerr_enable_err9_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR9();
        errslice0_missionerr_enable_err8_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR8();
        errslice0_missionerr_enable_err7_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR7();
        errslice0_missionerr_enable_err6_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR6();
        errslice0_missionerr_enable_err5_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR5();
        errslice0_missionerr_enable_err4_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR4();
        errslice0_missionerr_enable_err3_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR3();
        errslice0_missionerr_enable_err2_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR2();
        errslice0_missionerr_enable_err1_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR1();
        errslice0_missionerr_enable_err0_ = reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE.uERR0();
        errslice0_missionerr_force_err31_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR31();
        errslice0_missionerr_force_err30_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR30();
        errslice0_missionerr_force_err29_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR29();
        errslice0_missionerr_force_err28_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR28();
        errslice0_missionerr_force_err27_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR27();
        errslice0_missionerr_force_err26_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR26();
        errslice0_missionerr_force_err25_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR25();
        errslice0_missionerr_force_err24_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR24();
        errslice0_missionerr_force_err23_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR23();
        errslice0_missionerr_force_err22_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR22();
        errslice0_missionerr_force_err21_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR21();
        errslice0_missionerr_force_err20_ = reg_group_ptr->rERRSLICE0_MISSIONERR_FORCE.uERR20();
       ......
        errslice2_counter_reload_err64_ = reg_group_ptr->rERRSLICE2_COUNTER_RELOAD.uERR64();

}

这段代码是用于更新类 gec_reg_model 中的一些成员变量,这些成员变量的值来自于一个名为 CNVDLA_GEC_REGSET 的结构体指针 reg_group_ptr 的各个字段。这个过程的目的是将硬件寄存器组的值映射到类的成员变量,以便在后续的操作中使用这些成员变量。

下面是一些成员变量和它们对应的硬件寄存器字段:

  • feature_num_err_ 对应于 reg_group_ptr->rFEATURE.uNUM_ERR() 的值。
  • feature_num_err_slices_ 对应于 reg_group_ptr->rFEATURE.uNUM_ERR_SLICES() 的值。
  • swreset_swrst_ 对应于 reg_group_ptr->rSWRESET.uSWRST() 的值。
  • missionerr_type_code_ 对应于 reg_group_ptr->rMISSIONERR_TYPE.uCODE() 的值。
  • current_counter_value_value_ 对应于 reg_group_ptr->rCURRENT_COUNTER_VALUE.uVALUE() 的值。
  • missionerr_index_idx_ 对应于 reg_group_ptr->rMISSIONERR_INDEX.uIDX() 的值。
  • correctable_threshold_count_ 对应于 reg_group_ptr->rCORRECTABLE_THRESHOLD.uCOUNT() 的值。
  • missionerr_inject_unlock_value_ 对应于 reg_group_ptr->rMISSIONERR_INJECT_UNLOCK.uVALUE() 的值。

接下来的一系列变量,例如 errslice0_missionerr_enable_err31_errslice0_missionerr_enable_err30_errslice0_missionerr_enable_err29_ 等,也都是对应于硬件寄存器 reg_group_ptr->rERRSLICE0_MISSIONERR_ENABLE 中的不同位的值。

这段代码的目的是将硬件寄存器组中的值映射到类的成员变量,以便在后续的代码中更容易访问和操作这些值。这种映射可以方便地管理硬件寄存器状态并进行后续的处理和控制。

猜你喜欢

转载自blog.csdn.net/lincolnjunior_lj/article/details/134994973
gen
107