Я пытаюсь реализовать базовый тестовый стенд SystemC TLM для модуля сумматора, который я создал с использованием базовых simple_initiator_socket
и simple_target_socket
.
В настоящее время сборка дает сбой, и мне трудно понять, почему.
Вот реализации для трех основных модулей: сумматора, испытательного стенда и основного модуля, который создает экземпляры обоих и инициирует поток данных.
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");
}
test_bench.cc
#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
#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/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include/tlm_utils/simple_initiator_socket.h :23, из /home/test_bench/adder/test_bench.cc:3: /home/test_bench/adder/test_bench.cc:
В конструкторе '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_bench/adder/test_bench.cc:17:2: примечание: в расширении
макрос ‘SC_THREAD’ SC_THREAD(run_tests);
make: *** [/home//test_bench/adder/obj/test_bench.o] Ошибка 1
Я думаю, что я неправильно настроил сокеты. У испытательного стенда simple_initiator_socket
, а у сумматора simple_target_socket
. Нужно ли мне регистрировать simple_target_socket
методом b_transport
для модуля? Я сделал это в инициаторе, но в приведенном ниже руководстве я не увидел требования сделать это для цели. Я предполагаю, что поток данных был таким:
simple_initiator_socket
(участникtest_bench
) зарегистрирован в методеb_transport
модуля иsimple_target_socket
другого модуля (в верхнем модуле)- Модуль инициатора (
test_bench
) настраиваетtlm_generic_payload
с данными, которые он должен отправить на цель (adder
) b_transport
методsimple_initiator_socket
(членаtest_bench
), вызываемый с передачейtlm_generic_payload
(с дополнениями для сумматора)- Целевой сокет (target) получает и декодирует
tlm_generic_payload
(добавленные значения), которые были переданы. - Целевой сокет (
adder
) выполняет операции (добавляет декодированные слагаемые) и изменяетtlm_generic_payload
(передается по значению) (путем записи вычисленной суммы обратно в память полезной нагрузки) - Инициатор (
test_bench
) просматривает измененныйtlm_generic_payload
(теперь содержит сумму) и выполняет некоторые действия (сверяет с теоретической суммой)
Я пытался следовать этому примеру.
https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/< /а>
ОБНОВЛЕНИЕ
test_bench.h
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];
};
test_bench
с помощью макросаSC_MODULE
. Он должен быть объявлен так же, как вы объявляетеTop
модуль. - person StaceyGirl   schedule 21.12.2017