SC_CTOR 如何在 SystemC 中工作
How SC_CTOR works in SystemC
在 SystemC 中,模块构造函数可以使用 SC_CTOR
宏来定义:
#define SC_MODULE(user_module_name) \
struct user_module_name : ::sc_core::sc_module
#define SC_CTOR(user_module_name) \
typedef user_module_name SC_CURRENT_USER_MODULE; \
user_module_name( ::sc_core::sc_module_name )
需要了解在 sc_core
之前使用范围说明符运算符。
根据宏,用户可以生成构造函数,但它需要参数 sc_module_name
.
用户模块 struct user module
继承了 class sc_module
,在 class sc_module
中有不同的重载构造函数,如
sc_module();
sc_module( const sc_module_name& nm ); /* for those used to old style */
/* DEPRECATED */ sc_module( const char* nm );
/* DEPRECATED */ sc_module( const std::string& nm );
根据SC_CTOR
,它在构造函数主体中声明类型为sc_moduke_name 的任何对象,如果展开,构造函数将采用user_module(::sc_core::sc_module) { /*constructor body*/}
形式。
理解模拟相同代码但未能创建结构 B 类型的对象
class mname {
private:
char *name;
public:
mname() {
cout << "mname constructor invoked\n";
cout << "\t name\t" << name;
}
};
class A {
friend class mname;
private:
mname * mn;
public:
A() {
cout << "A constructor called\n";
}
A(const mname& m) {
cout << "freind class constructor of A\n";
}
A(const std:: string& s) {
cout << "string type construfctor\n";
}
};
struct B: A {
B(mname ) {
cout << "struct b cosntructor called\n";
}
};
int main() {
B obj(mname);
return 0;
}
创建模块的典型代码是:
SC_MODULE(my_module)
{
SC_CTOR(my_module)
{
}
};
使用宏,此代码将扩展为:
struct my_module : ::sc_core::sc_module
{
typedef my_module SC_CURRENT_USER_MODULE;
my_module( ::sc_core::sc_module_name )
{
}
};
如果要创建此模块的实例,则需要在构造函数中传递 ::sc_core::sc_module_name
的实例,而不是像示例代码中那样传递 class 名称。您还可以传递一些内容以隐式创建 ::sc_core::sc_module_name
的实例作为 const char*
(参见 ::sc_core::sc_module_name
构造函数)
my_module a("name_of_my_module");
或
::sc_core::sc_module_name module_name("another_name");
my_module b(module_name);
在您的示例代码中,只需将 main 替换为:
int main() {
mname name; // instance of mname
B obj(name);
return 0;
}
在 SystemC 中,模块构造函数可以使用 SC_CTOR
宏来定义:
#define SC_MODULE(user_module_name) \
struct user_module_name : ::sc_core::sc_module
#define SC_CTOR(user_module_name) \
typedef user_module_name SC_CURRENT_USER_MODULE; \
user_module_name( ::sc_core::sc_module_name )
需要了解在 sc_core
之前使用范围说明符运算符。
根据宏,用户可以生成构造函数,但它需要参数 sc_module_name
.
用户模块 struct user module
继承了 class sc_module
,在 class sc_module
中有不同的重载构造函数,如
sc_module();
sc_module( const sc_module_name& nm ); /* for those used to old style */
/* DEPRECATED */ sc_module( const char* nm );
/* DEPRECATED */ sc_module( const std::string& nm );
根据SC_CTOR
,它在构造函数主体中声明类型为sc_moduke_name 的任何对象,如果展开,构造函数将采用user_module(::sc_core::sc_module) { /*constructor body*/}
形式。
理解模拟相同代码但未能创建结构 B 类型的对象
class mname {
private:
char *name;
public:
mname() {
cout << "mname constructor invoked\n";
cout << "\t name\t" << name;
}
};
class A {
friend class mname;
private:
mname * mn;
public:
A() {
cout << "A constructor called\n";
}
A(const mname& m) {
cout << "freind class constructor of A\n";
}
A(const std:: string& s) {
cout << "string type construfctor\n";
}
};
struct B: A {
B(mname ) {
cout << "struct b cosntructor called\n";
}
};
int main() {
B obj(mname);
return 0;
}
创建模块的典型代码是:
SC_MODULE(my_module)
{
SC_CTOR(my_module)
{
}
};
使用宏,此代码将扩展为:
struct my_module : ::sc_core::sc_module
{
typedef my_module SC_CURRENT_USER_MODULE;
my_module( ::sc_core::sc_module_name )
{
}
};
如果要创建此模块的实例,则需要在构造函数中传递 ::sc_core::sc_module_name
的实例,而不是像示例代码中那样传递 class 名称。您还可以传递一些内容以隐式创建 ::sc_core::sc_module_name
的实例作为 const char*
(参见 ::sc_core::sc_module_name
构造函数)
my_module a("name_of_my_module");
或
::sc_core::sc_module_name module_name("another_name");
my_module b(module_name);
在您的示例代码中,只需将 main 替换为:
int main() {
mname name; // instance of mname
B obj(name);
return 0;
}