1、sc_port关联sc_interface和channel,channel继承sc_interface。sc_module聚合sc_module、var、process和sc_port。sc_cthread和sc_method继承sc_thread。
2、接口:sc_interface中声明很多虚函数,作为接口函数实现接口功能,如send()、recv()等。通道实现(继承)了一个或者多个接口。
端口总是与一定的接口类关联sc_in<sc_myInterface>,端口只能连接到实现了该类接口的通道上。可以通过发送和接收模块的端口调用(sc_in/sc_port<sc_interface>->send()),实现模块通信。通过端口,模块中的进程可以连接到通道并使用通道提供的方法。sc_port<ram_if<int>,3>一个端口可以绑定多个接口。
3、通道分为基本通道和分层通道,基本通道是非结构化的,不包含进程,也不能直接读写其他基本通道。而分层通道是一个特殊模块,它可以包含子模块和进程,当然也可以直接读写其他通道。 常见基础通道:sc_signal<T>、sc_signal_rv<T>和sc_fifo<T>。
4、实现通道和端口的绑定。fifo_out/in(fifo)实现端口和通道的绑定,在out中写数据就会把数据写到fifo中。sc_fifo的写入和读取需要一定的时间,执行后续操作的时候需要在中间加一个时间间隔。示例:
sc_fifo_out<int> out;
sc_fifo_in<int> in;
sc_fifo<int> fifo;
out(fifo);
in(fifo);
out.write(1);
in.read();
可以通过in.num_available()获取in中的数据数量。
通道允许并行操作,如果同时读写,则读的结果是写入之前的值。
5、sc_fifo是一个模板类。创建:sc_fifo<int> my_fifo(10)创建深度为10的my_fifo。my_fifo.write()写fifo、my_fifo.read()读fifo、my_fifo.nb_write()不阻塞写、my_fifo.nb_read()不阻塞读。my_fifo.num_available()获取my_fifo中的元素个数、my_fifo.num_free()获取fifo中的空闲空间数。
6、wait_for_request()等待请求信号,wait_for_response()等待响应信号。代码中可以添加静态规则检查和动态规则检查,避免异常。sc_get_curr_process_handle()获取当前进程句柄。通道属性描述通道的一些特征,比如优先级等。
7、TLM是一个用于高层次建模的标准,允许设计师在较高的抽象和层次上进行系统级建模和仿真。通道 (Channel):在 TLM 中,负责执行事务的组件。Socket:在 SystemC 中,socket 是连接 TLM 通道和模块的接口,具有发送和接收交易的能力。socket 提供了一种标准化的方式来接收或发送事务请求和响应。
#include <tlm_utils/simple_target_socket.h>
#include <tlm_utils/simple_initiator_socket.h>
Tlm_utils::simple_initiator_socket<Producer> Socket;
SC_CTOR(Producer) : socket("socket") {
SC_THREAD(produce); // 生产线程
}
Socket->b_transport(*trans, sc_time(1,SC_NS));
A.socket.bind(B.socket);