2024年3月15日 星期五

********SystemC--SC_HAS_PROCESS

SC_HAS_PROCESS是systemc 2.0引入的,其僅接受一個參數,即module的name

和SC_STOR進行比較,兩者的定義如下

SC_CTOR: #define SC_CTOR(user_module_name) typedef user_module_name SC_CURRENT_USER_MODULE; user_module_name( ::sc_core::sc_module_name )

SC_HAS_PROCESS: #define SC_HAS_PROCESS(user_module_name) typedef user_module_name SC_CURRENT_USER_MODULE

這兩個巨集都將module定義為SC_CURRENT_USER_MODULE,這個巨集用於透過SC_METHOD/SC_THREAD/SC_CTHREAD將函數註冊到模擬內核,但是SC_CTOR同時會宣告一個預設的只接受module name的constructor。也就是說使用SC_STOR會完成註冊和宣告一個constructor,但是SC_HAS_PROCESS只完成註冊,需要自己提供一個constructor


SC_CTOR 和SC_HAS_PROCESS的使用方法

module沒有模擬過程,則兩者皆不使用
若module不需要額外參數進行實例化,則使用SC_CTOR
如果moduel需要額外參數,則使用SC_HAS_PROCESS

這裡給出範例原始碼



#include "sysc/kernel/sc_externs.h"
#include "sysc/kernel/sc_module.h"
#include "sysc/kernel/sc_module_name.h"
#include "sysc/kernel/sc_simcontext.h"
#include <systemc>

using namespace sc_core;
using namespace std;

SC_MODULE(module_a) {
    module_a(sc_module_name name) {
        cout << this->name() << ", no SC_CTOR or SC_HAS_PROCESS" << endl;
    }
};


SC_MODULE(module_b1) {
    SC_CTOR(module_b1) {
        SC_METHOD(func_b);
    }

    void func_b() {
        cout << name() << ", SC_CTOR" << endl;
    }
};

SC_MODULE(module_b2) {
    SC_HAS_PROCESS(module_b2);

    module_b2(sc_module_name name) {
        SC_METHOD(func_b);
    }

    void func_b() {
        cout << name() << ", SC_HAS_PROCESS" << endl;
    }
};

SC_MODULE(module_c) {
    const int i;

    SC_HAS_PROCESS(module_c);

    module_c(sc_module_name name, int i) : i(i) {
        SC_METHOD(func_c);
    }

    void func_c() {
        cout << name() << ", addithonal input argument" << endl;
    }
};

SC_MODULE(module_d1) {
    SC_CTOR(module_d1);
    void func_d() {
        cout << this->name() << ", SC_CTOR inside header, constructor defined outside header" << endl;
    }
};

module_d1::module_d1(sc_module_name name) : ::sc_core::sc_module(name) {
    SC_METHOD(func_d);
}

SC_MODULE(module_d2) {
    SC_HAS_PROCESS(module_d2);
    module_d2(sc_module_name);
    void func_d() {
        cout << this->name() << ", SC_CTOR inside header, constructor defined outside header" << endl;
    }
};

module_d2::module_d2(sc_module_name name) : ::sc_core::sc_module(name) {
    SC_METHOD(func_d);
}

SC_MODULE(module_e) {
    module_e(sc_module_name name);
    void func_e() {
        cout << this->name() << ", SC_HAS_PROCESS outside header, CANNOT use SC_CTOR" << endl;
    }
};

module_e::module_e(sc_module_name name){
    SC_HAS_PROCESS(module_e);
    SC_METHOD(func_e);
}

int sc_main(int argc, char **argv){
    module_a module_a_i("module_a_i");
    module_b1 module_b1_i("module_b1_i");
    module_b2 module_b2_i("module_b2_i");
    module_c module_c_i("module_c_i", 1);
    module_d1 module_d1_i("module_d1_i");
    module_d2 module_d2_i("module_d2_i");
    module_e module_e_i("module_e_i");
    sc_start();

沒有留言:

張貼留言

*******【WSL教學】在Windows上執行Linux + VSCode

安裝WSL: 以管理員身份運行PowerShell來開啟此功能。要做到這一點,您可以在Windows搜索欄中輸入“PowerShell”,然後右鍵單擊Windows PowerShell,選擇“以管理員身份運行”。 在PowerShell中,輸入以下指令以安裝WSL。 wsl -...