目录
前言
首先为什么要有这个类,module 的名字管理,为什么会专门有个类来管理,这个对于软件工程老师傅们来说不可理喻,但是别着急,越用到后面,你就会觉得越香。所以先好好学。
spec 中解释,用于在模块阐述过程中建立模块层次结构中实例的层次名称。重要的是,他可以把sc_module和他自己类名关联起来起来。在c++ 中这个可能用不上,但是RTL中这点特别重要,两种debug方式天差地别,如果没有层级结构,sc中的module 中的wave 就无法使用。为此SC 2023 spec 中专门添加了SC_NAMED的宏,用来把实现变量名和类型初始化名统一起来。方便DEBUG。
code
namespace sc_core {
class sc_module_name
{
public:
sc_module_name( const char* );
sc_module_name( const sc_module_name& );
~sc_module_name(); operator const char*() const;
private:
// disable
sc_module_name();
sc_module_name& operator= ( const sc_module_name& );
};
}// namespace sc_core
使用方法
- 1.class sc_module_name 只能用作从class sc_module 派生的类的构造函数的参数类型。此外,每个此类构造函数都必须有一个类型为 sc_module_name 的参数,该参数不必是构造函数的第一个参数。
- 2.在直接或间接从class sc_module 派生的类 C 的构造函数被直接从类 C 派生的类 D 的构造函数调用的情况下,类 D 构造函数的 sc_module_name 类型的参数应作为参数直接传递给类 C 的构造函数。
3.如果class C 直接派生自class sc_module,则class C 的构造函数没有义务将 sc_module_name 传递给class sc_module 的构造函数。class sc_module 的默认构造函数可以显式或隐式地从类 C 的构造函数中调用
源码
class SC_API sc_module_name
{
friend class sc_module;
friend class sc_object_manager;
public:
sc_module_name( const char* );
sc_module_name( const sc_module_name& );
~sc_module_name();
operator const char*() const;
protected:
inline void clear_module( sc_module* module_p );
inline void set_module( sc_module* module_p );
private:
sc_module* m_module_p;
sc_module_name* m_next;
sc_simcontext* m_simc;
bool m_pushed;
private:
// disabled
sc_module_name();
sc_module_name& operator = ( const sc_module_name& );
};
源码中的 clear_module 和set_module很有用,可以用来管理所有module。