NVDLAシリーズCモデル:glb-gen<105>

cmod/glb/gen/glb_reg_model.h

ファイル名: glb_reg_model.h

// ================================================================
// 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: glb_reg_model.h

#ifndef _GLB_REG_MODEL_H_
#define _GLB_REG_MODEL_H_

#include <systemc.h>
#include <tlm.h>

#include "scsim_common.h"

SCSIM_NAMESPACE_START(clib)
SCSIM_NAMESPACE_END()

SCSIM_NAMESPACE_START(cmod)

// Forward declarating cmacro parsed register model class
class CNVDLA_GLB_REGSET;

これは glb_reg_model.h という名前のヘッダー ファイルで、NVIDIA の NVDLA (NVIDIA Deep Learning Accelerator) オープン ソース プロジェクトに属しています。このヘッダー ファイルの主な内容と機能は次のとおりです。

  1. ファイルの先頭の注意:​​ ファイルには、コードの著作権とライセンス情報を示す著作権情報と使用許諾契約が含まれています。

  2. #ifndef および #define ディレクティブ: これらのディレクティブは、複数のインクルードを避けるためにヘッダー ファイルの内容をラップするために使用されます。ファイルが 1 回だけ組み込まれるようにするために、プリプロセッサ マクロ _GLB_REG_MODEL_H_ を定義します。

  3. には他のヘッダー ファイルが含まれています: ヘッダー ファイルには、systemc.htlm.h などのいくつかのシステム レベルのヘッダー ファイルと、カスタマイズされた scsim_common.h

  4. 名前空間: 名前空間は、コードを整理するためにコード内で使用されます。 SCSIM_NAMESPACE_START(clib)SCSIM_NAMESPACE_END()clib という名前の名前空間を定義し、 SCSIM_NAMESPACE_START(cmod) は名前空間という名前の名前空間を定義します。 cmod の。

  5. クラス の前方宣言: ファイル class CNVDLA_GLB_REGSET; 内に、 CNVDLA_GLB_REGSET という名前のクラスを宣言する前方宣言がありますが、クラス定義は提供されていません。これはおそらく、クラスの定義が別のファイルにあり、ヘッダー ファイルはクラスの存在を認識する必要があるだけで、完全な定義を含める必要がないためです。

つまり、このヘッダー ファイルの主な機能は、後続のコードに必要なインクルージョンと名前空間の定義を提供し、CNVDLA_GLB_REGSET という名前のクラスを宣言し、その定義はファイル内の別の場所にあります。


class glb_reg_model {
    
    
    public:
        glb_reg_model();
        ~glb_reg_model();
        sc_event operation_enable_event_;
        sc_event intr_status_w;
    protected:
//        bool is_there_ongoing_glb_csb_response_;
        CNVDLA_GLB_REGSET *glb_register_group;

        // Register field variables
        uint8_t   s_nvdla_hw_version_major_;
        uint16_t  s_nvdla_hw_version_minor_;
        uint8_t   s_intr_mask_sdp_done_mask0_;
        uint8_t   s_intr_mask_sdp_done_mask1_;
        uint8_t   s_intr_mask_cdp_done_mask0_;
        uint8_t   s_intr_mask_cdp_done_mask1_;
        uint8_t   s_intr_mask_pdp_done_mask0_;
        uint8_t   s_intr_mask_pdp_done_mask1_;
        uint8_t   s_intr_mask_bdma_done_mask0_;
        uint8_t   s_intr_mask_bdma_done_mask1_;
        uint8_t   s_intr_mask_rubik_done_mask0_;
        uint8_t   s_intr_mask_rubik_done_mask1_;
        uint8_t   s_intr_mask_cdma_dat_done_mask0_;
        uint8_t   s_intr_mask_cdma_dat_done_mask1_;
        uint8_t   s_intr_mask_cdma_wt_done_mask0_;
        uint8_t   s_intr_mask_cdma_wt_done_mask1_;
        uint8_t   s_intr_mask_cacc_done_mask0_;
        uint8_t   s_intr_mask_cacc_done_mask1_;
        uint8_t   s_intr_set_sdp_done_set0_;
        uint8_t   s_intr_set_sdp_done_set1_;
        uint8_t   s_intr_set_cdp_done_set0_;
        uint8_t   s_intr_set_cdp_done_set1_;
        uint8_t   s_intr_set_pdp_done_set0_;
        uint8_t   s_intr_set_pdp_done_set1_;
        uint8_t   s_intr_set_bdma_done_set0_;
        uint8_t   s_intr_set_bdma_done_set1_;
        uint8_t   s_intr_set_rubik_done_set0_;
        uint8_t   s_intr_set_rubik_done_set1_;
        uint8_t   s_intr_set_cdma_dat_done_set0_;
        uint8_t   s_intr_set_cdma_dat_done_set1_;
        uint8_t   s_intr_set_cdma_wt_done_set0_;
        uint8_t   s_intr_set_cdma_wt_done_set1_;
        uint8_t   s_intr_set_cacc_done_set0_;
        uint8_t   s_intr_set_cacc_done_set1_;
        uint8_t   s_intr_status_sdp_done_status0_;
        uint8_t   s_intr_status_sdp_done_status1_;
        uint8_t   s_intr_status_cdp_done_status0_;
        uint8_t   s_intr_status_cdp_done_status1_;
        uint8_t   s_intr_status_pdp_done_status0_;
        uint8_t   s_intr_status_pdp_done_status1_;
        uint8_t   s_intr_status_bdma_done_status0_;
        uint8_t   s_intr_status_bdma_done_status1_;
        uint8_t   s_intr_status_rubik_done_status0_;
        uint8_t   s_intr_status_rubik_done_status1_;
        uint8_t   s_intr_status_cdma_dat_done_status0_;
        uint8_t   s_intr_status_cdma_dat_done_status1_;
        uint8_t   s_intr_status_cdma_wt_done_status0_;
        uint8_t   s_intr_status_cdma_wt_done_status1_;
        uint8_t   s_intr_status_cacc_done_status0_;
        uint8_t   s_intr_status_cacc_done_status1_;

        // CSB request target socket
        // void csb2glb_b_transport (int ID, NV_MSDEC_csb2xx_16m_secure_be_lvl_t* payload, sc_time& delay);
        // CSB response send function
        // void GlbSendCsbResponse(uint32_t date, uint8_t error_id);
        // Register accessing
        bool GlbAccessRegister(uint32_t reg_addr, uint32_t & data, bool is_write);
        // Reset
        void GlbRegReset();
        // Update configuration from register to variable
        void GlbUpdateVariables(CNVDLA_GLB_REGSET *reg_group_ptr);
        //void GlbUpdateIdleStatus(bool status);
        void GlbUpdateBdmaIntrStatus_0(bool status);
        void GlbUpdateBdmaIntrStatus_1(bool status);
        void GlbUpdateCdmaDatIntrStatus_0(bool status);
        void GlbUpdateCdmaDatIntrStatus_1(bool status);
        void GlbUpdateCdmaWtIntrStatus_0(bool status);
        void GlbUpdateCdmaWtIntrStatus_1(bool status);
        void GlbUpdatePdpIntrStatus_0(bool status);
        void GlbUpdatePdpIntrStatus_1(bool status);
        void GlbUpdateSdpIntrStatus_0(bool status);
        void GlbUpdateSdpIntrStatus_1(bool status);
        void GlbUpdateCdpIntrStatus_0(bool status);
        void GlbUpdateCdpIntrStatus_1(bool status);
        void GlbUpdateRbkIntrStatus_0(bool status);
        void GlbUpdateRbkIntrStatus_1(bool status);
        void GlbUpdateCaccIntrStatus_0(bool status);
        void GlbUpdateCaccIntrStatus_1(bool status);
};
SCSIM_NAMESPACE_END()

#endif

これは、 という名前のクラスを定義する glb_reg_model.h という名前のヘッダー ファイルです。このクラスの主なメンバーと関数は次のとおりです。glb_reg_model

  1. コンストラクタとデストラクタ: クラス glb_reg_model には、オブジェクトの作成と破棄のためのコンストラクタとデストラクタが含まれています。

  2. メンバー変数:

    • operation_enable_event_ および intr_status_w: これらは、操作の有効化と割り込みステータスの監視を制御する SystemC イベント オブジェクトです。
    • glb_register_group: レジスタ グループの操作を管理するために使用される、タイプ CNVDLA_GLB_REGSET へのポインタ。
    • ハードウェア バージョン番号、割り込みマスク レジスタ、割り込み設定レジスタ、割り込みステータス レジスタなど、さまざまなレジスタ フィールドの値を保存するために使用される一連のメンバー変数。
  3. 関数メンバー:

    • GlbAccessRegister: レジスタにアクセスするために使用され、指定したアドレスのレジスタ値を読み書きすることができます。
    • GlbRegReset: レジスタおよび内部ステータスをリセットするために使用されます。
    • GlbUpdateVariables: 設定をレジスタから変数に更新するために使用されます。
    • さまざまな割り込みステータスを更新するために使用される一連の関数 (GlbUpdateBdmaIntrStatus_0GlbUpdateBdmaIntrStatus_1 など)。

このクラスの主な目的は、構成、割り込みステータス、割り込みマスクなどを含む、NVDLA のグローバル レジスタ セットを管理することです。これらのレジスタにアクセスして更新する機能に加え、割り込みステータスと割り込みマスキングを処理するロジックも提供します。これらの関数は、NVDLA モジュールの構成と割り込み処理を制御するために使用されます。

glb_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: glb_reg_model.cpp

#include "glb_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_GLB)
SCSIM_NAMESPACE_END()

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


glb_reg_model & :~glb_reg_model


glb_reg_model::glb_reg_model() {
    
    
    glb_register_group = new CNVDLA_GLB_REGSET;
    GlbRegReset();
}

glb_reg_model::~glb_reg_model() {
    
    
    delete glb_register_group;
}

これは、glb_reg_model クラスのコンストラクターとデストラクターの実装です。

コンストラクター内:

  1. glb_register_group という名前のポインタを作成し、 new 演算子を使用して CNVDLA_GLB_REGSET 型のオブジェクトを割り当てます。
  2. GlbRegReset 関数を呼び出して、レジスタと内部状態を初期化します。

デストラクター内:

  1. メモリ リークを避けるために、コンストラクタに割り当てられたglb_register_group オブジェクトのメモリを解放します。

これらのコンストラクターとデストラクターの目的は、オブジェクトの作成と破棄中に必要な操作を実行して、リソースの適切な管理と解放を保証することです。コンストラクターでは、オブジェクトの作成後にレジスタと内部状態が初期化されますが、デストラクターでは、オブジェクトが破棄されると、対応するメモリ リソースが解放されます。

Glbアクセス登録

bool glb_reg_model::GlbAccessRegister(uint32_t reg_addr, uint32_t & data, bool is_write) {
    
    
    uint32_t offset;
    uint32_t rdata = 0;
    uint32_t new_value = 0;

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

    if (is_write) {
    
     // Write Request
        if (offset == REG_off(NVDLA_GLB_S_INTR_STATUS)) {
    
    
            glb_register_group->Get(offset, &rdata);
            new_value = rdata & (~data);
            glb_register_group->SetWritable(offset, new_value);
            GlbUpdateVariables(glb_register_group);
            if((new_value&0xf03ff)==0)
                intr_status_w.notify();
        } else {
    
    
            glb_register_group->SetWritable(offset, data);
        }
    } else {
    
     // Read Request
        glb_register_group->Get(offset, &rdata);
        data = rdata;
    }
    return true;
}

これは、glb_reg_model クラスの GlbAccessRegister 関数の実装であり、レジスタにアクセスし、読み取りおよび書き込み操作を実行するために使用されます。

  • reg_addrパラメータはアクセスするレジスタのアドレスを表します。
  • dataパラメータは、レジスタから読み取られるデータ、またはレジスタに書き込まれるデータを格納する参照です。
  • is_write パラメータは、書き込み操作を実行するかどうかを示すブール値です。 true の場合は書き込み操作が実行され、false の場合は読み取り操作が実行されます。

関数内では次の処理が行われます。

  1. reg_addr に基づいてレジスタ グループに対するオフセット offset を計算します。
  2. is_writetrue の場合は、書き込み操作を実行し、offset (例: a>NVDLA_GLB_S_INTR_STATUS)。特定のレジスタの場合は、レジスタの対応するビットをビット単位でクリア(AND演算)し、新しい値をレジスタに書き込みます。新しい値の特定のビット (ここでは 0xf03ff) がすべて 0 の場合、 intr_status_w イベントがトリガーされます。
  3. is_writefalse の場合、読み取り操作が実行され、レジスタからデータを読み取り、そのデータを < a i =3> をパラメータに指定します。 data
  4. 最後に、関数は true を返し、操作が正常に完了したことを示します。

この関数により、レジスタへの読み取りおよび書き込み操作が可能になり、書き込み操作中に対応するイベントがトリガーされます。

GlbUpdate*


void glb_reg_model::GlbRegReset() {
    
    
        glb_register_group->ResetAll();

}

//void glb_reg_model::GlbUpdateIdleStatus(bool status) {
    
    
//}

void glb_reg_model::GlbUpdateBdmaIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uBDMA_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateBdmaIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uBDMA_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdatePdpIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uPDP_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdatePdpIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uPDP_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateSdpIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uSDP_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateSdpIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uSDP_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateCdpIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDP_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateCdpIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDP_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateRbkIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uRUBIK_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateRbkIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uRUBIK_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateCaccIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCACC_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateCaccIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCACC_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateCdmaDatIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDMA_DAT_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateCdmaDatIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDMA_DAT_DONE_STATUS1(status);
}

void glb_reg_model::GlbUpdateCdmaWtIntrStatus_0(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDMA_WT_DONE_STATUS0(status);
}

void glb_reg_model::GlbUpdateCdmaWtIntrStatus_1(bool status) {
    
    
    glb_register_group->rS_INTR_STATUS.uCDMA_WT_DONE_STATUS1(status);
}

これらはglb_reg_model クラスの一連の関数であり、さまざまなサブユニット (BDMA、PDP、SDP、CDP など) の割り込みステータス レジスタの値を更新するために使用されます。 )、および割り込みステータスで変化が発生すると、対応するレジスタフィールドに書き込まれます。これらの関数の機能は次のとおりです。

  • GlbUpdateBdmaIntrStatus_0 および GlbUpdateBdmaIntrStatus_1: BDMA サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdatePdpIntrStatus_0 および GlbUpdatePdpIntrStatus_1: PDP サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateSdpIntrStatus_0 および GlbUpdateSdpIntrStatus_1: SDP サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateCdpIntrStatus_0 および GlbUpdateCdpIntrStatus_1: CDP サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateRbkIntrStatus_0 および GlbUpdateRbkIntrStatus_1: RBK サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateCaccIntrStatus_0 および GlbUpdateCaccIntrStatus_1: CACC サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateCdmaDatIntrStatus_0 および GlbUpdateCdmaDatIntrStatus_1: CDMA_DAT サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

  • GlbUpdateCdmaWtIntrStatus_0 および GlbUpdateCdmaWtIntrStatus_1: CDMA_WT サブユニットの割り込みステータス レジスタのビット 0 および 1 を更新します。

これらの関数は、さまざまなサブユニットの割り込みステータスに従って、対応するレジスタフィールドの値を更新するために使用されます。場合によっては、特定の条件が満たされたときに他のイベントやアクションもトリガーします。

GlbUpdate変数

void glb_reg_model::GlbUpdateVariables(CNVDLA_GLB_REGSET *reg_group_ptr) {
    
    
        s_nvdla_hw_version_major_ = reg_group_ptr->rS_NVDLA_HW_VERSION.uMAJOR();
        s_nvdla_hw_version_minor_ = reg_group_ptr->rS_NVDLA_HW_VERSION.uMINOR();
        s_intr_mask_sdp_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uSDP_DONE_MASK0();
        s_intr_mask_sdp_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uSDP_DONE_MASK1();
        s_intr_mask_cdp_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uCDP_DONE_MASK0();
        s_intr_mask_cdp_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uCDP_DONE_MASK1();
        s_intr_mask_pdp_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uPDP_DONE_MASK0();
        s_intr_mask_pdp_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uPDP_DONE_MASK1();
        s_intr_mask_bdma_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uBDMA_DONE_MASK0();
        s_intr_mask_bdma_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uBDMA_DONE_MASK1();
        s_intr_mask_rubik_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uRUBIK_DONE_MASK0();
        s_intr_mask_rubik_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uRUBIK_DONE_MASK1();
        s_intr_mask_cdma_dat_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uCDMA_DAT_DONE_MASK0();
        s_intr_mask_cdma_dat_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uCDMA_DAT_DONE_MASK1();
        s_intr_mask_cdma_wt_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uCDMA_WT_DONE_MASK0();
        s_intr_mask_cdma_wt_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uCDMA_WT_DONE_MASK1();
        s_intr_mask_cacc_done_mask0_ = reg_group_ptr->rS_INTR_MASK.uCACC_DONE_MASK0();
        s_intr_mask_cacc_done_mask1_ = reg_group_ptr->rS_INTR_MASK.uCACC_DONE_MASK1();
        s_intr_set_sdp_done_set0_ = reg_group_ptr->rS_INTR_SET.uSDP_DONE_SET0();
        s_intr_set_sdp_done_set1_ = reg_group_ptr->rS_INTR_SET.uSDP_DONE_SET1();
        s_intr_set_cdp_done_set0_ = reg_group_ptr->rS_INTR_SET.uCDP_DONE_SET0();
        s_intr_set_cdp_done_set1_ = reg_group_ptr->rS_INTR_SET.uCDP_DONE_SET1();
        s_intr_set_pdp_done_set0_ = reg_group_ptr->rS_INTR_SET.uPDP_DONE_SET0();
        s_intr_set_pdp_done_set1_ = reg_group_ptr->rS_INTR_SET.uPDP_DONE_SET1();
        s_intr_set_bdma_done_set0_ = reg_group_ptr->rS_INTR_SET.uBDMA_DONE_SET0();
        s_intr_set_bdma_done_set1_ = reg_group_ptr->rS_INTR_SET.uBDMA_DONE_SET1();
        s_intr_set_rubik_done_set0_ = reg_group_ptr->rS_INTR_SET.uRUBIK_DONE_SET0();
        s_intr_set_rubik_done_set1_ = reg_group_ptr->rS_INTR_SET.uRUBIK_DONE_SET1();
        s_intr_set_cdma_dat_done_set0_ = reg_group_ptr->rS_INTR_SET.uCDMA_DAT_DONE_SET0();
        s_intr_set_cdma_dat_done_set1_ = reg_group_ptr->rS_INTR_SET.uCDMA_DAT_DONE_SET1();
        s_intr_set_cdma_wt_done_set0_ = reg_group_ptr->rS_INTR_SET.uCDMA_WT_DONE_SET0();
        s_intr_set_cdma_wt_done_set1_ = reg_group_ptr->rS_INTR_SET.uCDMA_WT_DONE_SET1();
        s_intr_set_cacc_done_set0_ = reg_group_ptr->rS_INTR_SET.uCACC_DONE_SET0();
        s_intr_set_cacc_done_set1_ = reg_group_ptr->rS_INTR_SET.uCACC_DONE_SET1();
        s_intr_status_sdp_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uSDP_DONE_STATUS0();
        s_intr_status_sdp_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uSDP_DONE_STATUS1();
        s_intr_status_cdp_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uCDP_DONE_STATUS0();
        s_intr_status_cdp_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uCDP_DONE_STATUS1();
        s_intr_status_pdp_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uPDP_DONE_STATUS0();
        s_intr_status_pdp_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uPDP_DONE_STATUS1();
        s_intr_status_bdma_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uBDMA_DONE_STATUS0();
        s_intr_status_bdma_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uBDMA_DONE_STATUS1();
        s_intr_status_rubik_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uRUBIK_DONE_STATUS0();
        s_intr_status_rubik_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uRUBIK_DONE_STATUS1();
        s_intr_status_cdma_dat_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uCDMA_DAT_DONE_STATUS0();
        s_intr_status_cdma_dat_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uCDMA_DAT_DONE_STATUS1();
        s_intr_status_cdma_wt_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uCDMA_WT_DONE_STATUS0();
        s_intr_status_cdma_wt_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uCDMA_WT_DONE_STATUS1();
        s_intr_status_cacc_done_status0_ = reg_group_ptr->rS_INTR_STATUS.uCACC_DONE_STATUS0();
        s_intr_status_cacc_done_status1_ = reg_group_ptr->rS_INTR_STATUS.uCACC_DONE_STATUS1();

}

GlbUpdateVariables 関数は、CNVDLA_GLB_REGSET クラス オブジェクトからレジスタ フィールドの値を読み取り、これらの値を クラス オブジェクトのメンバー変数に保存するために使用されます。 =2> クラス。これらのメンバー変数は、後続の操作で割り込みステータスやその他の機能をチェックおよび更新するために使用できます。この関数の動作は次のとおりです。glb_reg_model

  • reg_group_ptr からCNVDLA_GLB_REGSET クラス オブジェクトのさまざまなレジスタ フィールドの値を読み取り、glb_reg_model に保存します。クラスのメンバー変数内。

たとえば、reg_group_ptr フィールドから rS_NVDLA_HW_VERSION レジスタの uMAJOR()uMINOR() を読み取ります。値を取得し、 s_nvdla_hw_version_major_ および s_nvdla_hw_version_minor_ メンバー変数に保存します。同様に、他のレジスタフィールドからも値を読み取り、対応するメンバー変数に保存します。

こうすることでglb_reg_model、クラスは、割り込みステータスのチェック、割り込みの生成、CSB リクエストへの応答など、さまざまな操作を実行するために必要なときにこれらのメンバー変数にアクセスできます。

おすすめ

転載: blog.csdn.net/lincolnjunior_lj/article/details/134994561