SystemC事务级建模01之最简单的模块间数据传输
现在来看一个非常简单的情形:CPU
传输数据给GPU
。我们使用SystemC
来对该情形进行事务级的建模。
CPU
是事务的发起者,GPU
是事务的接收者。它们通过 Socket
连接(注意,这里的Socket
不是网络中的那个Socket)。事务发起者的Socket
类型是simple_initiator_socket
,事务接收者的Socket
类型是simple_target_socket
。
先给CPU
建模,
#include <systemc.h>
#include <tlm_utils/simple_initiator_socket.h>
#include <tlm_utils/simple_target_socket.h>
class Cpu : public sc_module {
public:
SC_HAS_PROCESS(Cpu);
Cpu(sc_module_name name) : sc_module(name) {
}
public:
tlm_utils::simple_initiator_socket<Cpu> initiator_socket_gpu;
};
再给GPU
建模,
#include <systemc.h>
#include <tlm_utils/simple_initiator_socket.h>
#include <tlm_utils/simple_target_socket.h>
class Gpu : public sc_module {
public:
SC_HAS_PROCESS(Gpu);
Gpu(sc_module_name name) : sc_module(name) {
}
public:
tlm_utils::simple_target_socket<Gpu> target_socket_cpu;
};
然后,我们需要把CPU
和GPU
的Socket
连接起来,
int sc_main(int argc, char *argv[]) {
Cpu cpu{"cpu"};
Gpu gpu{"gpu"};
cpu.initiator_socket_gpu(gpu.target_socket_cpu);
return 0;
}
接着,我们尝试从CPU
发送一个数据到GPU
,
在CPU
中加入一个send
方法,并将其声明为方法进程,负责往GPU
发送一个消息:Hello, I am CPU
class Cpu : public sc_module {
public:
SC_HAS_PROCESS(Cpu);
Cpu(sc_module_name name) : sc_module(name) {
SC_METHOD(send);
}
void send() {
auto payload = new tlm::tlm_generic_payload{};
auto data = std::string{"Hello, I am CPU"};
payload->set_data_ptr((unsigned char *) data.c_str());
auto delay = SC_ZERO_TIME;
initiator_socket_gpu->b_transport(*payload, delay);
}
public:
tlm_utils::simple_initiator_socket<Cpu> initiator_socket_gpu;
};
GPU
要接收CPU
发送过来的字符串,需要,
- 在
target_socket
上注册一个接收的方法,这里叫receive
- 从
payload
中取出CPU
发送过来的消息
class Gpu : public sc_module {
public:
SC_HAS_PROCESS(Gpu);
Gpu(sc_module_name name) : sc_module(name) {
target_socket_cpu.register_b_transport(this, &Gpu::recieve);
}
void recieve(tlm::tlm_generic_payload &payload, sc_time &delay) {
std::cout << payload.get_data_ptr() << std::endl;
}
public:
tlm_utils::simple_target_socket<Gpu> target_socket_cpu;
};
编译,运行,
C:\Users\adam\CLionProjects\untitled\cmake-build-debug\untitled.exe
SystemC 2.3.3-Accellera --- Mar 10 2021 20:59:57
Copyright (c) 1996-2018 by all Contributors,
ALL RIGHTS RESERVED
Hello, I am CPU
Process finished with exit code 0
搞定!