// 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
的实现,该类用于访问和管理某种硬件寄存器组,这些寄存器用于配置和控制硬件设备。以下是代码的主要功能:
-
构造函数
gec_reg_model::gec_reg_model()
:在对象创建时,分配了一个名为gec_register_group
的CNVDLA_GEC_REGSET
类型的指针,并调用了GecRegReset()
函数来初始化这个寄存器组。 -
析构函数
gec_reg_model::~gec_reg_model()
:在对象销毁时,释放了之前分配的gec_register_group
指针,以避免内存泄漏。 -
函数
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)
来更新相关的变量。 -
函数
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
中的不同位的值。
这段代码的目的是将硬件寄存器组中的值映射到类的成员变量,以便在后续的代码中更容易访问和操作这些值。这种映射可以方便地管理硬件寄存器状态并进行后续的处理和控制。