C++ 实现SystemC TLM测试台构建失败
我正在尝试为我使用basicC++ 实现SystemC TLM测试台构建失败,c++,compiler-errors,systemc,C++,Compiler Errors,Systemc,我正在尝试为我使用basicsimple\u initiator\u socket和simple\u target\u socket创建的加法器模块实现SystemC basic TLM测试台 目前构建失败,我无法诊断原因 以下是三个主要模块的实现:加法器、测试台和实例化并启动数据流的主要模块 main.cc #include "systemc.h" #include "tlm_utils/simple_initiator_socket.h" #include "tlm_utils/simple
simple\u initiator\u socket
和simple\u target\u socket
创建的加法器模块实现SystemC basic TLM测试台
目前构建失败,我无法诊断原因
以下是三个主要模块的实现:加法器、测试台和实例化并启动数据流的主要模块
main.cc
#include "systemc.h"
#include "tlm_utils/simple_initiator_socket.h"
#include "tlm_utils/simple_target_socket.h"
#include "tlm_utils/tlm_quantumkeeper.h"
using namespace sc_core;
using namespace sc_dt;
using namespace std;
#include "test_bench.h"
#include "adder.h"
SC_MODULE(Top)
{
test_bench *tb;
adder *ad;
sc_signal<bool> rst;
Top(sc_module_name name) :
rst("rst")
{
tb = new test_bench("test_bench");
ad = new adder("adder");
tb->socket.bind(ad->socket);
}
};
int sc_main(int argc, char *argv[])
{
Top *top = new Top("Top");
}
下面是我在编译时看到的错误
在文件中包括从
/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/sysc/kernel/sc_module.h:35:0,
from/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/SystemC:74,
from/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/tlm:23,
from/home/epi/jfrye\u xilinx/SystemC/SystemC-2.3.2/include/tlm\u utils/simple\u initiator\u socket.h:23,
自/主/测试台/加法器/测试台。抄送:3:
/主页/测试台/加法器/测试台.cc:
在构造器“测试台架::测试台架(sc_核心::sc_模块名称)”中:
/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/sysc/kernel/sc_module.h:463:29:
错误:“SC\U当前用户\U模块”尚未声明
SC_当前_用户_模块\
/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/sysc/kernel/sc_process.h:151:46:注意:在宏“sc_MAKE_FUNC_PTR”的定义中
静态\u转换(&callback\u标记::func)
/home/epi/jfrye_xilinx/SystemC/SystemC-2.3.2/include/sysc/kernel/sc_module.h:461:5:
注意:在宏“declare\u thread\u process”的展开中
声明线程进程(函数句柄\
/主页/测试台/加法器/测试台。cc:17:2:注:在扩展中
宏“SC_线程”SC_线程(运行测试)
制作:***
[/home//test_benches/adder/obj/test_bench.o]
错误1
我最好的猜测是我没有正确设置套接字。测试台有一个simple\u initiator\u socket
,加法器有一个simple\u target\u socket
。我需要为模块注册simple\u target\u socket
方法吗?我在启动器中注册了,但在下面的教程中我没有注册我看不出目标需要这样做。我猜数据流是这样的:
simple\u initiator\u socket
(test\u bench
)注册到另一个模块的b\u transport
方法和simple\u target\u socket
)test_bench
)使用需要发送到目标(加法器
)的数据设置tlm_generic_有效载荷
)b_传输
方法调用simple_initiator_socket
(测试台的成员)并传递tlm_generic_有效载荷
(使用加法器的加数)tlm\u generic\u有效载荷
(加数值)adder
)执行操作(添加解码的加数)并修改tlm_generic_有效载荷
(按值传递)(通过将计算出的总和写入有效载荷内存)test_bench
)查看修改后的tlm_generic_有效载荷(现在包含总和),并执行一些过程(对照理论总和进行检查)
class test_bench:
public sc_core::sc_module
{
public:
tlm_utils::simple_initiator_socket<test_bench> socket;
sc_out<bool> irq;
test_bench(sc_core::sc_module_name name);
void run_tests();
private:
uint32_t data[3];
};
类测试台:
公共sc_核心::sc_模块
{
公众:
tlm_utils::简单_启动器_套接字;
sc_out irq;
测试台(sc_核心:sc_模块名称);
无效运行_测试();
私人:
uint32_t数据[3];
};
在SystemC中声明模块有两种方法
第一种是通过使用SC\u模块
宏:
SC_MODULE(mymodule) {
SC_CTOR(mymodule)
{
}
};
第二个没有它:
class mymodule : public sc_core::sc_module {
SC_HAS_PROCESS(mymodule);
public:
mymodule(sc_core::sc_module_name)
{ }
};
我更喜欢第二个,因为:
- 它尽可能避免那些讨厌的宏
- 它允许您从另一个模块继承
SC\u HAS\u过程定义为:
#define SC_HAS_PROCESS(user_module_name) typedef user_module_name SC_CURRENT_USER_MODULE
这允许SC_方法
和SC_线程
使用SC_当前用户_模块
作为它们正在使用的模块的同义词。宏SC_模块
已经在幕后使用了SC_HAS_进程
另一个建议-如果您使用的是与C++11兼容的编译器,您可以自己声明一个helper宏:
#define DECL(name, ...) name{#name, __VA_ARGS__}
这可以帮助您声明命名对象,而无需键入其名称两次:
sc_in<bool> DECL(clk);
你应该发布你的“test_bench.h”。似乎您没有使用SC_module
宏声明test_bench
模块。它的声明方式应该与声明Top
module.im继承的方式相同。adder.cc使用相同的范例编译到对象,所以它是这样构建的,如果您不介意的话,这是一个快速的单独问题:运行_tests()当我运行可执行文件时,test_bench类的方法没有运行。是否有某种方法触发SC_线程。它如何首先进行实例化和tlm绑定,然后触发方法。我是否需要使线程敏感并从顶部模块触发test_bench的端口?所有线程进程都计划在模拟后执行离子启动。你不需要做任何事情。你有没有打电话给sc_start
?也许它确实被调用了,但在b_传输中被阻止了?没有,我没有。这确实触发了一个响应。实际上,现在我收到了一个奇怪的响应,这种响应很奇怪
#define DECL(name, ...) name{#name, __VA_ARGS__}
sc_in<bool> DECL(clk);
mymodule(sc_core::sc_module_name)
: DECL(clk)
{
}