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;
}