Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现SystemC TLM测试台构建失败_C++_Compiler Errors_Systemc - Fatal编程技术网

C++ 实现SystemC TLM测试台构建失败

C++ 实现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

我正在尝试为我使用basic
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)
        { }
    };
    
    我更喜欢第二个,因为:

    • 它尽可能避免那些讨厌的宏
    • 它允许您从另一个模块继承
    现在,为什么你需要代码> SCMyMase<代码> >或者代码> SysHasePosial SCY方法和ScStult需要知道他们正在使用的模块类型。因为SystemC是基于1998版本中发布的C++语言的旧版本,所以没有办法自动完成。lper宏
    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)
    {
    }