C++ SystemC:在单个cpp文件中实现多个模块

C++ SystemC:在单个cpp文件中实现多个模块,c++,compiler-errors,systemc,C++,Compiler Errors,Systemc,编辑:通过移动SC\u HAS\u进程(模块)找到解决方案语句插入头文件中的类定义中 我正在SystemC中编写一个模块,它有一些小的子模块。我希望将所有声明保存在单个头文件中,并将实现保存在单个.cpp文件中。我不认为这种方法有任何内在的错误,但我得到了一个与使用SC\u HAS\u过程相关的错误宏重新定义SC\u CURRENT\u USER\u模块 在从/systemc/2.3.1/include/systemc:72:0包含的文件中, 来自src/Decoder.cpp:39: /…/s

编辑:通过移动
SC\u HAS\u进程(模块)找到解决方案语句插入头文件中的类定义中

我正在SystemC中编写一个模块,它有一些小的子模块。我希望将所有声明保存在单个头文件中,并将实现保存在单个
.cpp
文件中。我不认为这种方法有任何内在的错误,但我得到了一个与使用
SC\u HAS\u过程相关的错误
宏重新定义
SC\u CURRENT\u USER\u模块

在从/systemc/2.3.1/include/systemc:72:0包含的文件中,
来自src/Decoder.cpp:39:
/…/systemc/2.3.1/include/sysc/kernel/sc_module.h:403:30:错误:声明“typedef struct Fifo_shift sc_CURRENT_USER_module”冲突
类型定义用户模块名称SC\U当前用户模块
^
src/Decoder.cpp:146:1:注意:在宏'SC_HAS_PROCESS'的扩展中
SC_有_过程(Fifo_移位);
^
/…/systemc/2.3.1/include/sysc/kernel/sc_module.h:403:30:错误:“sc_CURRENT_USER_module”以前的声明为“typedef struct Decoder sc_CURRENT_USER_module”
类型定义用户模块名称SC\U当前用户模块
^
src/Decoder.cpp:50:1:注意:在宏'SC_HAS_PROCESS'的扩展中
SC_具有_过程(解码器);
这个错误似乎是由于我第二次使用了
SC\u HAS\u进程
。我的代码的一般格式如下(为了简洁起见,删除了部分代码)

在“解码器.h”中:

SC_模块(Fifo_移位)
{
公众:
/*港口申报*/
/*变量声明*/
Fifo移位(sc模块名称nm,整块大小in);
~Fifo_shift();
/*成员函数*/
私人:
/*私有变量*/
};
/*其他模块*/
SC_模块(解码器)
{
公众:
/*港口申报*/
/*变量声明*/
解码器(sc_模块名称nm,int num_mac_in);//构造函数
~Decoder();//析构函数
/*成员函数*/
私人:
/*私有变量*/
};
在“解码器.cpp”中:

/*首次使用SC_的过程*/
SC_具有_过程(解码器);
解码器::解码器(sc_模块名称nm,int num_mac_in):
/*成员变量init*/
{
/*对动态变量进行一些初始化*/
/*连接子模块*/
/*指定线程进程*/
SC_线程(do_解码器);

敏感看起来您在多个区域有相同的代码

如以下/以上错误测量信息所示:

src/Decoder.cpp:146:1: note: in expansion of macro ‘SC_HAS_PROCESS’
 SC_HAS_PROCESS(Fifo_shift);
 ^
src/Decoder.cpp:50:1: note: in expansion of macro ‘SC_HAS_PROCESS’
 SC_HAS_PROCESS(Decoder);
查看第146行和第50行。

IEEE 1666-2011 LRM(SystemC的标准定义)说

宏SC_HAS_过程只能在类定义中使用, 构造函数体,或模块的成员函数体 正在构造的模块类应作为参数传递给 宏。宏调用应以分号终止

看起来您正在全局范围内使用宏


如果您还没有,您可以从下载LRM的副本。

我在
SC\u HAS\u PROCESS()
方面遇到了类似的错误,并且能够通过将
SC\u HAS\u PROCESS()
宏的用法放在构造函数的定义中来解决这些错误,如下所述:

Fifo_移位::Fifo_移位(sc_模块名称nm,整块大小in):
/*成员变量init*/
{
SC_有_过程(Fifo_移位);
//创建线程并指定敏感度
SC_螺纹(do_Fifo_移位);

敏感我已经在我的问题中包括了代码的这些部分。错误可能来自SC_HAS_进程宏的扩展,但是在SystemC中的构造函数之前需要此语句。然后我会在构造函数之前的类内声明它,而不是在类外。感谢标准定义。我想SC_已经_进程无法按我所希望的方式使用。我已通过将语句移动到头文件定义来修复此问题,并将更新我的帖子以反映解决方案。
Fifo_shift::Fifo_shift(sc_module_name nm, int chunk_size_in) :
  /* Member variable init */
{
  SC_HAS_PROCESS(Fifo_shift);
  // Create thread and specify sensitivity
  SC_THREAD(do_Fifo_shift);
    sensitive << CLK.pos();
}