1
Praktikum: SystemC
SystemC-TLM Tutorial
Joachim Falk (falk@cs.fau.de)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Praktikum: SystemC SystemC-TLM Tutorial Joachim Falk ( - - PowerPoint PPT Presentation
Praktikum: SystemC SystemC-TLM Tutorial Joachim Falk ( falk@cs.fau.de ) Friedrich-Alexander-Universitt Erlangen-Nrnberg Joachim Falk 1 Agenda SystemC and TLM Transaction TLM 2.0 Overview Interfaces
1
Joachim Falk (falk@cs.fau.de)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
2
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
3
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
4
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
5
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
6
[http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0119e/index.html] Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
7
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
8
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
9
9
IEEE 1666™ SystemC TLM-1 standard TLM-2 core interfaces: Blocking transport interface Non-blocking transport interface Direct memory interface Debug transport interface Analysis interface Initiator and target sockets Analysis ports Generic payload Phases Utilities: Convenience sockets Payload event queues Quantum keeper Instance-specific extn
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
10
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
11
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
MemHi yKB MemLo xKB CPU OpenRISC 1000 (TLM) Bus
12
12
CPU Bus MEM
Initiator socket Target socket Initiator socket Target socket
Forward path Backward path Forward path Backward path
Transaction
References to a single transaction object are passed along the forward and backward paths
Initiator Target
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
13
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
14
14
Initiator Target Target socket nb_transport_bw() invalidate_direct_mem_ptr() Initiator socket b_transport () nb_transport_fw() get_direct_mem_ptr() transport_dbg()
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
15
BEGIN_REQ END_REQ BEGIN_RESP END_RESP
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
void b_transport(TRANS &, sc_time &); tlm_sync_enum nb_transport_fw(TRANS &, PHASE &, sc_time &); tlm_sync_enum nb_transport_bw(TRANS &, PHASE &, sc_time &);
16
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
17
17
Initiator Target b_transport(t, 0ns)
Call Simulation time = 100ns Simulation time = 140ns
wait(40ns)
Initiator is blocked until return from b_transport Return
b_transport(t, 0ns) b_transport(t, 0ns)
Call Return
b_transport(t, 0ns)
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
18
18
Initiator Target b_transport(t, 0ns)
Call Simulation time = 100ns Simulation time = 140ns
wait(40ns)
Local time offset Return
b_transport(t, 5ns)
+5ns
b_transport(t, 20ns)
Call +20ns Return
b_transport(t, 25ns)
+25ns
b_transport(t, 30ns)
Call +30ns Return
b_transport(t, 5ns)
+5ns
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
19
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
20
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
21
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
22
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
struct Initiator: sc_module { tlm_utils::simple_initiator_socket<Initiator> socket; … }; struct Memory: sc_module { tlm_utils::simple_target_socket<Memory> socket; … }; SC_MODULE(Top) { Initiator initiator; Memory memory; Top(sc_module_name name) : sc_module(name), initiator(“initiator”), target(“target”) { initiator->socket.bind(memory->socket); } };
23
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
int data; tlm::tlm_generic_payload trans; sc_time delay = sc_time(10, SC_NS); trans.set_write(); trans.set_address(0x100); trans.set_data_ptr(reinterpret_cast<unsigned char*>(&data)); trans.set_data_length(sizeof(data)); trans.set_streaming_width(sizeof(data)); trans.set_byte_enable_ptr(0); trans.set_dmi_allowed(false); trans.set_response_status(tlm::TLM_INCOMPLETE_RESPONSE); initiatorSocket->b_transport(trans, delay); // check response status, perform delay
24
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
void Target::b_transport( tlm::tlm_generic_payload &trans, sc_time &delay) { addr_type addr = trans.get_address(); if (addr > mMaxAddr) { // set error response status and return } tlm::tlm_command cmd = trans.get_command(); unsigned char* ptr = trans.get_data_ptr(); unsigned int len = trans.get_data_length(); if (cmd == tlm::TLM_READ_COMMAND) memcpy(ptr, &mMemory[addr], len); else if (cmd == tlm::TLM_WRITE_COMMAND) memcpy(&mMemory[addr], ptr, len); else { // set error response and return } // add some delay delay = delay + sc_time(5, SC_NS); trans.set_response_status(tlm::TLM_OK_RESPONSE); }
25
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
26
Friedrich-Alexander-Universität Erlangen-Nürnberg Joachim Falk
Mem OpenRisc 1000 CPU Today we implement a TLM connection