quic/qbox
Loading...
Searching...
No Matches
initiator-tester.h
1/*
2 * This file is part of libgsutils
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 * Author: GreenSocs 2022
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#ifndef _GREENSOCS_GSUTILS_TESTS_INITIATOR_TESTER_H
10#define _GREENSOCS_GSUTILS_TESTS_INITIATOR_TESTER_H
11
12#include <functional>
13
14#include <systemc>
15#include <tlm>
16#include <tlm_utils/simple_initiator_socket.h>
17#include <module_factory_registery.h>
18#include <tlm_sockets_buswidth.h>
19
59class InitiatorTester : public sc_core::sc_module
60{
61public:
62 using TlmGenericPayload = tlm::tlm_generic_payload;
63 using TlmResponseStatus = tlm::tlm_response_status;
64 using TlmDmi = tlm::tlm_dmi;
65
66 using InvalidateDirectMemPtrFn = std::function<void(uint64_t, uint64_t)>;
67
68private:
69 sc_core::sc_time m_last_txn_delay;
70 unsigned int m_last_transport_debug_ret;
71 bool m_last_dmi_hint = false;
72
73 TlmDmi m_last_dmi_data;
74
75 InvalidateDirectMemPtrFn m_dmi_inval_cb;
76
77 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
78 {
79 if (m_dmi_inval_cb) {
80 m_dmi_inval_cb(start, end);
81 }
82 }
83
84protected:
85 virtual void prepare_txn(TlmGenericPayload& txn, bool is_read, uint64_t addr, uint8_t* data, size_t len)
86 {
87 using namespace tlm;
88
89 tlm_command cmd = is_read ? TLM_READ_COMMAND : TLM_WRITE_COMMAND;
90
91 txn.set_address(addr);
92 txn.set_data_length(len);
93 txn.set_data_ptr(data);
94 txn.set_command(cmd);
95 txn.set_streaming_width(len);
96 txn.set_byte_enable_ptr(nullptr);
97 txn.set_response_status(TLM_INCOMPLETE_RESPONSE);
98 }
99
100public:
101 tlm_utils::simple_initiator_socket<InitiatorTester, DEFAULT_TLM_BUSWIDTH> socket;
102
103 InitiatorTester(const sc_core::sc_module_name& n): sc_core::sc_module(n), socket("initiator_socket")
104 {
105 socket.register_invalidate_direct_mem_ptr(this, &InitiatorTester::invalidate_direct_mem_ptr);
106 }
107
108 virtual ~InitiatorTester() {}
109
110 /*
111 * b_transport / transport_dbg helpers
112 * -----------------------------------
113 */
114
126 TlmResponseStatus do_b_transport(TlmGenericPayload& txn)
127 {
128 socket->b_transport(txn, m_last_txn_delay);
129 m_last_dmi_hint = txn.is_dmi_allowed();
130
131 return txn.get_response_status();
132 }
133
145 TlmResponseStatus do_transport_dbg(TlmGenericPayload& txn)
146 {
147 m_last_transport_debug_ret = socket->transport_dbg(txn);
148
149 return txn.get_response_status();
150 }
151
164 TlmResponseStatus do_transaction(TlmGenericPayload& txn, bool debug = false)
165 {
166 if (debug) {
167 return do_transport_dbg(txn);
168 } else {
169 return do_b_transport(txn);
170 }
171 }
172
191 TlmResponseStatus do_read_with_txn_and_ptr(TlmGenericPayload& txn, uint64_t addr, uint8_t* data, size_t len,
192 bool debug = false)
193 {
194 prepare_txn(txn, true, addr, data, len);
195 return do_transaction(txn, debug);
196 }
197
217 TlmResponseStatus do_write_with_txn_and_ptr(TlmGenericPayload& txn, uint64_t addr, const uint8_t* data, size_t len,
218 bool debug = false)
219 {
220 prepare_txn(txn, false, addr, const_cast<uint8_t*>(data), len);
221 return do_transaction(txn, debug);
222 }
223
234 TlmResponseStatus do_read_with_ptr(uint64_t addr, uint8_t* data, size_t len, bool debug = false)
235 {
236 TlmGenericPayload txn;
237
238 return do_read_with_txn_and_ptr(txn, addr, data, len, debug);
239 }
240
253 TlmResponseStatus do_write_with_ptr(uint64_t addr, const uint8_t* data, size_t len, bool debug = false)
254 {
255 TlmGenericPayload txn;
256
257 return do_write_with_txn_and_ptr(txn, addr, data, len, debug);
258 }
259
275 template <class T>
276 TlmResponseStatus do_read_with_txn(TlmGenericPayload& txn, uint64_t addr, T& data, bool debug = false)
277 {
278 uint8_t* ptr = reinterpret_cast<uint8_t*>(&data);
279
280 return do_read_with_txn_and_ptr(txn, addr, ptr, sizeof(data), debug);
281 }
282
300 template <class T>
301 TlmResponseStatus do_write_with_txn(TlmGenericPayload& txn, uint64_t addr, const T& data, bool debug = false)
302 {
303 const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&data);
304
305 return do_write_with_txn_and_ptr(txn, addr, ptr, sizeof(data), debug);
306 }
307
317 template <class T>
318 TlmResponseStatus do_read(uint64_t addr, T& data, bool debug = false)
319 {
320 uint8_t* ptr = reinterpret_cast<uint8_t*>(&data);
321
322 return do_read_with_ptr(addr, ptr, sizeof(data), debug);
323 }
324
336 template <class T>
337 TlmResponseStatus do_write(uint64_t addr, const T& data, bool debug = false)
338 {
339 const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&data);
340
341 return do_write_with_ptr(addr, ptr, sizeof(data), debug);
342 }
343
349 void set_next_txn_delay(const sc_core::sc_time& delay) { m_last_txn_delay = delay; }
350
356 const sc_core::sc_time& get_last_txn_delay() const { return m_last_txn_delay; }
357
363 unsigned int get_last_transport_debug_ret() const { return m_last_transport_debug_ret; }
364
371 bool get_last_dmi_hint() const { return m_last_dmi_hint; }
372
373 /*
374 * get_direct_mem_ptr helpers
375 * --------------------------
376 */
377
387 {
388 TlmGenericPayload txn;
389
390 prepare_txn(txn, true, addr, nullptr, 0);
391 return socket->get_direct_mem_ptr(txn, m_last_dmi_data);
392 }
393
399 const TlmDmi& get_last_dmi_data() const { return m_last_dmi_data; }
400
401 /*
402 * Backward interface helpers
403 * --------------------------
404 */
405
409 void register_invalidate_direct_mem_ptr(InvalidateDirectMemPtrFn cb) { m_dmi_inval_cb = cb; }
410};
411
412GSC_MODULE_REGISTER(InitiatorTester);
413
414#endif
A TLM initiator to do testing on a target.
Definition initiator-tester.h:60
const TlmDmi & get_last_dmi_data() const
Get the DMI data returned by the last get_direct_mem_ptr call.
Definition initiator-tester.h:399
TlmResponseStatus do_transport_dbg(TlmGenericPayload &txn)
Perform a transport_dbg TLM transaction using the txn TLM payload.
Definition initiator-tester.h:145
TlmResponseStatus do_read_with_txn_and_ptr(TlmGenericPayload &txn, uint64_t addr, uint8_t *data, size_t len, bool debug=false)
Perform a simple read into the buffer pointed by data with a pre-set payload.
Definition initiator-tester.h:191
TlmResponseStatus do_write_with_ptr(uint64_t addr, const uint8_t *data, size_t len, bool debug=false)
Perform a simple write with data pointed by data
Definition initiator-tester.h:253
TlmResponseStatus do_transaction(TlmGenericPayload &txn, bool debug=false)
Perform a TLM transaction using the txn TLM payload.
Definition initiator-tester.h:164
void register_invalidate_direct_mem_ptr(InvalidateDirectMemPtrFn cb)
Register a callback on invalidate_direct_mem_ptr event.
Definition initiator-tester.h:409
bool get_last_dmi_hint() const
Get the DMI hint value of the last transaction (the is_dmi_allowed() flag in the payload)
Definition initiator-tester.h:371
bool do_dmi_request(uint64_t addr)
Perform a get_direct_mem_ptr call by specifying an address.
Definition initiator-tester.h:386
const sc_core::sc_time & get_last_txn_delay() const
Get the delay value resulting of the last b_transport call.
Definition initiator-tester.h:356
TlmResponseStatus do_write(uint64_t addr, const T &data, bool debug=false)
Perform a simple write.
Definition initiator-tester.h:337
TlmResponseStatus do_read_with_txn(TlmGenericPayload &txn, uint64_t addr, T &data, bool debug=false)
Perform a simple read with a pre-set payload.
Definition initiator-tester.h:276
TlmResponseStatus do_write_with_txn(TlmGenericPayload &txn, uint64_t addr, const T &data, bool debug=false)
Perform a simple write with a pre-set payload.
Definition initiator-tester.h:301
unsigned int get_last_transport_debug_ret() const
Get the return value of the last transport_dbg call.
Definition initiator-tester.h:363
void set_next_txn_delay(const sc_core::sc_time &delay)
Set the delay value to use for the next b_transport call.
Definition initiator-tester.h:349
TlmResponseStatus do_b_transport(TlmGenericPayload &txn)
Perform a b_transport TLM transaction using the txn TLM payload.
Definition initiator-tester.h:126
TlmResponseStatus do_read(uint64_t addr, T &data, bool debug=false)
Perform a simple read into data
Definition initiator-tester.h:318
TlmResponseStatus do_read_with_ptr(uint64_t addr, uint8_t *data, size_t len, bool debug=false)
Perform a simple read into the buffer pointed by data
Definition initiator-tester.h:234
TlmResponseStatus do_write_with_txn_and_ptr(TlmGenericPayload &txn, uint64_t addr, const uint8_t *data, size_t len, bool debug=false)
Perform a simple write with data pointed by data with a pre-set payload.
Definition initiator-tester.h:217
Definition target.h:160