【问题标题】:How SC_CTOR works in SystemCSC_CTOR 如何在 SystemC 中工作
【发布时间】:2017-07-23 19:22:44
【问题描述】:

在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继承类sc_module,在类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*/} 的形式。 理解模拟相同的代码但未能创建 struct 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;
}

【问题讨论】:

    标签: c++11 systemc opencpu


    【解决方案1】:

    创建模块的典型代码是:

    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 的实例,而不是像在示例代码中那样传递类名。您还可以传递一些东西以隐式创建::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;
    }
    

    【讨论】:

    • 还有一个查询,因为 struct my_module 只定义了一个构造函数,它采用 sc_module_name 实例,然后 const char* 如何隐式创建 sc_module_name 实例。根据我对此的理解,将会有一个 my_module(const char*) 类型的构造函数。可能对C++概念不好,提前感谢提供更多细节
    • 我理解当 char* 被传递时,sc_module 是 sc_module_name 的朋友,sc_module_name 已经定义了带有 char* 参数的构造函数,但另一个问题是如果 sc_module_name 创建带有两个参数的构造函数 sc_module_name(const char*, int) 并且当尝试创建像 b obj("another name", 4) 这样的 B 对象时,它会失败
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2017-06-18
    相关资源
    最近更新 更多