首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现SystemC TLM测试平台构建失败

实现SystemC TLM测试平台构建失败
EN

Stack Overflow用户
提问于 2017-12-21 17:07:39
回答 1查看 595关注 0票数 0

我正在尝试为我使用basic simple_initiator_socketsimple_target_socket创建的加法器模块实现一个基本的TLM测试平台。

目前,构建失败了,我在诊断原因上有困难。

下面是三个主要模块的实现,即加法器、测试台和主模块,它们实例化并启动数据流。

main.cc

代码语言:javascript
复制
#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");


}

test_bench.cc

代码语言:javascript
复制
#define SC_INCLUDE_DYNAMIC_PROCESS

#include "tlm_utils/simple_initiator_socket.h"
#include "tlm_utils/simple_target_socket.h"

using namespace sc_core;
using namespace std;
using namespace sc_dt;

#include "test_bench.h"
#include <fstream>
#include <iostream>

test_bench::test_bench(sc_module_name name):
    sc_module(name), socket("socket")
{
    SC_THREAD(run_tests);
}

void test_bench::run_tests()
{
    ifstream infile("../adder.golden.dat");
    ofstream ofs;
    ofs.open("../adder.dat", ofstream::out | ofstream::app);

    while(infile >> data[0] >> data[1])
    {   
        tlm::tlm_generic_payload *trans = new tlm::tlm_generic_payload;
        sc_time delay = sc_time(10, SC_NS);

        trans->set_data_ptr((unsigned char*)data);

        socket->b_transport(*trans, delay);

        ofs << data[0] << data[1] << data[2];       

        delete trans;
    }
    infile.close();
    ofs.close();

    printf ("Comparing against output data \n");
    if (system("diff -w sha1.dat sha1.golden.dat")) 
    {

        cout << "*******************************************" << endl;
        cout << "FAIL: Output DOES NOT match the golden output" << endl;
        cout << "*******************************************" << endl;
    } 
    else 
    {
        cout << "*******************************************" << endl;
        cout << "PASS: The output matches the golden output!" << endl;
        cout << "*******************************************" << endl;
    }

}

adder.cc

代码语言:javascript
复制
#define SC_INCLUDE_DYNAMIC_PROCESS

#include "tlm_utils/simple_initiator_socket.h"
#include "tlm_utils/simple_target_socket.h"

using namespace sc_core;
using namespace std;

#include "adder.h"

adder::adder(sc_module_name name)
    : sc_module(name), socket("socket")
{
    socket.register_b_transport(this, &adder::b_transport);
    socket.register_transport_dbg(this, &adder::transport_dbg);
}

void adder::b_transport(tlm::tlm_generic_payload& trans, sc_time& delay)
{
    tlm::tlm_command cmd = trans.get_command();
    sc_dt::uint64   addr = trans.get_address();
    uint32_t    *ptr = (uint32_t*)trans.get_data_ptr();
    unsigned int    len = trans.get_data_length();
    unsigned char   *byt = trans.get_byte_enable_ptr();
    unsigned int    wid = trans.get_streaming_width();

    addend1 = *ptr;
    addend2 = *(ptr++);
    add();

    memcpy(ptr + sizeof(uint32_t) * 2, (char*) &sum, sizeof(uint32_t));
}

unsigned int adder::transport_dbg(tlm::tlm_generic_payload& trans)
{
    return 0;
}

void adder::add()
{
    sum = addend1 + addend2;
}

这是我在编译时看到的错误。

在/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/sysc/kernel/sc_module.h:35:0,中包含的文件中,从/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/systemc:74,到/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/tlm:23,从/home/test_ /home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/tlm_utils/simple_initiator_socket.h:23,/加法器/test_Ben.cc:3:/home/test_benches/加法器/test_benches.: 在构造函数‘test_bench::test_bench(sc_core::sc_module_name)’:/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/sysc/kernel/sc_module.h:463:29:错误中:“SC_CURRENT_USER_MODULE”尚未声明为SC_CURRENT_USER_MODULE,\ /home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/sysc/kernel/sc_process.h:151:46:注:宏“SC_MAKE_FUNC_PTR”static_cast(&callback_tag::func)的定义 /home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/sysc/kernel/sc_module.h:461:5:注:宏“declare_thread_process”declare_thread_process的扩展( func ## _handle,\ /home/test_工作台/加法器/test_benches. of :17:2:注意:在扩展中 宏‘SC_THREAD’SC_THREAD(run_tests); 制造:*/home//test_bench.o/加法器/obj/test_bench.o.o错误1

我最好的猜测是,我没有正确地设置套接字。测试台有一个simple_initiator_socket,加法器有一个simple_target_socket。是否需要使用模块的simple_target_socket方法注册b_transport?我是在启动器中这样做的,但在下面的教程中,我没有看到目标需要这样做。我猜数据流是这样的:

  1. simple_initiator_socket (test_bench成员)注册到模块的b_transport方法和另一个模块的simple_target_socket (在顶层模块中)
  2. 启动器模块(test_bench)使用需要发送到目标的数据(adder)来设置tlm_generic_payload
  3. 调用b_transport方法的simple_initiator_socket (test_bench成员),并传递tlm_generic_payload (加法器为加法器)
  4. 目标套接字(目标)接收并解码传递的tlm_generic_payload (加载项值)。
  5. 目标套接字(adder)执行操作(添加解码的加号)并修改tlm_generic_payload (通过值传递)(将计算的总和写入有效负载内存)。
  6. 启动器(test_bench)查看修改后的tlm_generic_payload (现在包含sum)并执行一些过程(检查理论和)。

我只是想效法这个例子。

1/

更新

test_bench.h

代码语言:javascript
复制
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];
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 17:31:31

在SystemC中有两种声明模块的方法。

第一个是通过使用SC_MODULE宏:

代码语言:javascript
复制
SC_MODULE(mymodule) {
    SC_CTOR(mymodule)
    {
    }
};

第二个没有它的:

代码语言:javascript
复制
class mymodule : public sc_core::sc_module {
    SC_HAS_PROCESS(mymodule);
public:
    mymodule(sc_core::sc_module_name)
    { }
};

我更喜欢第二个,因为:

  • 它尽可能地避免那些讨厌的宏。
  • 它允许您从另一个模块继承。

现在为什么您需要SC_MODULESC_HAS_PROCESS宏。原因是宏、SC_METHODSC_THREAD需要知道用于完成工作的模块的类型。由于SystemC是基于1998年发布的C++语言的旧版本,所以没有办法自动地做到这一点。因此助手宏SC_HAS_PROCESS被定义为:

代码语言:javascript
复制
#define SC_HAS_PROCESS(user_module_name) typedef user_module_name SC_CURRENT_USER_MODULE

这允许SC_METHODSC_THREAD使用SC_CURRENT_USER_MODULE作为它们正在使用的模块的同义词。宏SC_MODULE已经在幕后使用了SC_HAS_PROCESS

另一个建议--如果您使用的是C++11兼容的编译器,您可以为自己声明一个助手宏:

代码语言:javascript
复制
#define DECL(name, ...) name{#name, __VA_ARGS__}

这可以帮助您声明命名对象,而无需两次键入它们的名称:

代码语言:javascript
复制
sc_in<bool> DECL(clk);

任何提到此端口的错误消息都包含它的正确名称。

还可以在构造函数中用于初始化成员字段:

代码语言:javascript
复制
mymodule(sc_core::sc_module_name)
    : DECL(clk)
{
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47929657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档