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();
沒有留言:
張貼留言