scc 2025.09
SystemC components library
cxs_tlm.h
1/*******************************************************************************
2 * Copyright 2024 MINRES Technologies GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16
17#ifndef _CXS_CXS_TLM_H_
18#define _CXS_CXS_TLM_H_
19
20#include <cci_configuration>
21#include <cstdint>
22#include <scc/cci_param_restricted.h>
23#include <scc/peq.h>
24#include <scc/report.h>
25#include <scc/sc_variable.h>
26#include <tlm/nw/tlm_network_gp.h>
28#include <tlm/scc/tlm_gp_shared.h>
29#include <tlm/scc/tlm_mm.h>
30
32namespace cxs {
33enum class CXS_CMD { FLIT, CREDIT, CRDRTN };
34
35struct cxs_flit_payload : public tlm::nw::tlm_network_payload<CXS_CMD> {
36 cxs_flit_payload() = default;
37
38 explicit cxs_flit_payload(tlm::nw::tlm_base_mm_interface* mm)
40
41 std::array<uint8_t, 8> start_ptr;
42 std::array<uint8_t, 8> end_ptr;
43 uint8_t start{0};
44 uint8_t end{0};
45 uint8_t end_error{0};
46 bool last{false};
47
48 cxs_flit_payload& operator=(const cxs_flit_payload& x) {
49 tlm::nw::tlm_network_payload<CXS_CMD>::operator=(x);
50 start_ptr = x.start_ptr;
51 end_ptr = x.end_ptr;
52 end = x.end;
53 end_error = x.end_error;
54 last = x.last;
55 return (*this);
56 }
57};
58
60 using tlm_payload_type = cxs_flit_payload;
61 using tlm_phase_type = ::tlm::tlm_phase;
62};
63
64enum class CXS_PKT { DATA };
65struct cxs_packet_payload : public tlm::nw::tlm_network_payload<CXS_PKT> {
66 cxs_packet_payload() = default;
67
68 explicit cxs_packet_payload(tlm::nw::tlm_base_mm_interface* mm)
70};
71
73 using tlm_payload_type = cxs_packet_payload;
74 using tlm_phase_type = ::tlm::tlm_phase;
75};
76
77bool register_extensions();
78extern bool registered;
79
80} // namespace cxs
81
82namespace tlm {
83namespace scc {
84// provide needed info for SCC memory manager
85template <> struct tlm_mm_traits<cxs::cxs_flit_types> {
86 using mm_if_type = tlm::nw::tlm_base_mm_interface;
87 using payload_base = tlm::nw::tlm_network_payload_base;
88};
89template <> struct tlm_mm_traits<cxs::cxs_packet_types> {
90 using mm_if_type = tlm::nw::tlm_base_mm_interface;
91 using payload_base = tlm::nw::tlm_network_payload_base;
92};
93} // namespace scc
94} // namespace tlm
95
96namespace cxs {
97template <unsigned PHITWIDTH = 256, int N = 1>
99template <unsigned PHITWIDTH = 256, int N = 1>
103
104template <int N = 1> using cxs_pkt_initiator_socket = tlm::nw::tlm_network_initiator_socket<8, CXS_PKT, cxs_packet_types, N>;
105template <int N = 1> using cxs_pkt_target_socket = tlm::nw::tlm_network_target_socket<8, CXS_PKT, cxs_packet_types, N>;
108
109struct orig_pkt_extension : public tlm::tlm_extension<orig_pkt_extension> {
110 virtual tlm_extension_base* clone() const override {
111 auto ret = new orig_pkt_extension();
112 *ret = *this;
113 return ret;
114 }
115 void copy_from(tlm_extension_base const& ext) override { *this = dynamic_cast<orig_pkt_extension const&>(ext); }
116 virtual ~orig_pkt_extension() = default;
117
118 std::vector<cxs_pkt_shared_ptr> orig_ext;
119};
120
121template <unsigned PHITWIDTH = 256, unsigned CXSMAXPKTPERFLIT = 2>
122struct cxs_transmitter : public sc_core::sc_module,
123 public tlm::nw::tlm_network_fw_transport_if<cxs_packet_types>,
124 public tlm::nw::tlm_network_bw_transport_if<cxs_flit_types> {
125 using flit_tx_type = cxs_flit_types::tlm_payload_type;
126 using flit_phase_type = cxs_flit_types::tlm_phase_type;
127
128 using pkt_tx_type = cxs_packet_types::tlm_payload_type;
129 using pkt_phase_type = cxs_packet_types::tlm_phase_type;
130
131 static constexpr unsigned PHIT_BYTE_WIDTH = PHITWIDTH / 8;
132 static constexpr unsigned BUCKET_SIZE = PHITWIDTH / 8 / CXSMAXPKTPERFLIT;
133
134 sc_core::sc_in<bool> clk_i{"clk_i"};
135
136 sc_core::sc_in<bool> rst_i{"rst_i"};
137
138 cxs_pkt_target_socket<> tsck{"tsck"};
139
140 cxs_flit_initiator_socket<PHITWIDTH> isck{"isck"};
141
142 cci::cci_param<sc_core::sc_time> clock_period{"clock_period", sc_core::SC_ZERO_TIME, "clock period of the CXS transmitter"};
143
144 scc::cci_param_restricted<unsigned> burst_len{"burst_len", 1, scc::min_restriction(1u),
145 "minimum amount of credits to start transmitting flits, shall be larger than 0"};
146
147 cxs_transmitter(sc_core::sc_module_name const& nm)
148 : sc_core::sc_module(nm) {
149 register_extensions();
150 tsck(*this);
151 isck(*this);
152 SC_HAS_PROCESS(cxs_transmitter);
153 SC_METHOD(clock);
154 sensitive << clk_i.pos();
155 SC_METHOD(handle_received_credits);
156 sensitive << received_credits.event();
157 dont_initialize();
158 }
159
160private:
161 void start_of_simulation() override {
162 if(clock_period.get_value() == sc_core::SC_ZERO_TIME)
163 if(auto clk_if = dynamic_cast<sc_core::sc_clock*>(clk_i.get_interface()))
164 clock_period.set_value(clk_if->period());
165 }
166
167 void b_transport(pkt_tx_type& trans, sc_core::sc_time& t) override {
168 flit_tx_type tx;
169 auto ext = new orig_pkt_extension();
170 tx.set_extension(ext);
171 ext->orig_ext.emplace_back(&trans);
172 isck->b_transport(tx, t);
173 }
174
175 tlm::tlm_sync_enum nb_transport_fw(pkt_tx_type& trans, pkt_phase_type& phase, sc_core::sc_time& t) override {
176 SCCTRACEALL(SCMOD) << "Forwarding CXS packet with size " << trans.get_data().size() << "bytes";
177 if(phase == tlm::nw::REQUEST) {
178 pkt_peq.notify(cxs_pkt_shared_ptr(&trans), t);
179 if(clock_period.get_value() != sc_core::SC_ZERO_TIME)
180 t += clock_period.get_value() - 1_ps;
181 phase = tlm::nw::CONFIRM;
182 return tlm::TLM_UPDATED;
183 }
184 throw std::runtime_error("illegal request in forward path");
185 }
186
187 unsigned int transport_dbg(pkt_tx_type& trans) override { return 0; }
188
189 tlm::tlm_sync_enum nb_transport_bw(flit_tx_type& trans, flit_phase_type& phase, sc_core::sc_time& t) override {
190 SCCTRACEALL(SCMOD) << "Received non-blocking transaction in bw path with phase " << phase.get_name() << " and command "
191 << static_cast<unsigned>(trans.get_command());
192 if(phase == tlm::nw::REQUEST && trans.get_command() == cxs::CXS_CMD::CREDIT) {
193 received_credits.notify(trans.get_data()[0], sc_core::SC_ZERO_TIME);
194 SCCTRACE(SCMOD) << "Received " << static_cast<unsigned>(trans.get_data()[0]) << " credit(s), " << available_credits.get()
195 << " credit(s) in total";
196 if(clock_period.get_value() > sc_core::SC_ZERO_TIME)
197 t += clock_period - 1_ps;
198 phase = tlm::nw::CONFIRM;
199 return tlm::TLM_UPDATED;
200 }
201 throw std::runtime_error("illegal request in backward path");
202 }
203
204 void handle_received_credits() {
205 while(received_credits.has_next()) {
206 auto crd = received_credits.get();
207 available_credits += crd;
208 }
209 }
210
211 void clock() {
212 if(rst_i.read()) {
213 available_credits = 0u;
214 pkt_peq.clear();
215 pending_pkt = nullptr;
216 return;
217 }
218 if((!pending_pkt && !pkt_peq.has_next()) || // there are no packets to send
219 (!burst_credits && (available_credits < burst_len.get_value()))) // we do not have enough credits to burst-send flits
220 return;
221 auto* ptr = cxs_flit_mm::get().allocate();
222 auto ext = ptr->get_extension<orig_pkt_extension>();
223 if(!ext) {
224 ext = new orig_pkt_extension();
225 ptr->set_auto_extension(ext);
226 }
227 auto next_bucket = 0U;
228 auto start_ptr_idx = 0U;
229 auto end_ptr_idx = 0U;
230 while(pkt_peq.has_next() || pending_pkt) {
231 auto trans = pending_pkt ? pending_pkt : pkt_peq.get();
232 pending_pkt = nullptr;
233 if(!transfered_pkt_bytes) { // we start a new packet
234 ptr->start |= 1u << start_ptr_idx;
235 ptr->start_ptr[start_ptr_idx++] = next_bucket;
236 }
237 const auto remaining_bytes = trans->get_data().size() - transfered_pkt_bytes;
238 const auto remaining_buckets = (CXSMAXPKTPERFLIT - next_bucket);
239 const auto bucketed_size = (remaining_bytes + BUCKET_SIZE - 1) / BUCKET_SIZE;
240 if(bucketed_size > remaining_buckets) {
241 // packet exceeds current flit, so sen the flit
242 transfered_pkt_bytes += remaining_buckets * BUCKET_SIZE;
243 pending_pkt = trans;
244 break;
245 } else {
246 // packet fits into current flit length
247 ptr->end |= 1u << end_ptr_idx;
248 ptr->end_ptr[end_ptr_idx++] = (next_bucket * BUCKET_SIZE + remaining_bytes + 1) / 4 - 1; // end pointer is 4 byte aligned
249 ptr->last = true;
250 next_bucket += bucketed_size;
251 ext->orig_ext.push_back(trans);
252 transfered_pkt_bytes = 0;
253 }
254 }
255 sc_core::sc_time t;
256 auto phase = tlm::nw::REQUEST;
257 isck->nb_transport_fw(*ptr, phase, t);
258 if(!burst_credits) {
259 burst_credits = burst_len.get_value();
260 available_credits -= burst_credits;
261 }
262 burst_credits--;
263 SCCTRACE(SCMOD) << "Transmitted one flit, " << available_credits.get() << " credit(s) in total";
264 }
265
267 cxs_pkt_shared_ptr pending_pkt;
268 unsigned transfered_pkt_bytes{0};
269
270 scc::peq<unsigned> received_credits;
271 scc::sc_variable<unsigned> available_credits{"available_credits", 0};
272 unsigned burst_credits{0};
273};
274
275template <unsigned PHITWIDTH = 64, unsigned CXSMAXPKTPERFLIT = 2>
276struct cxs_receiver : public sc_core::sc_module,
277 public tlm::nw::tlm_network_fw_transport_if<cxs_flit_types>,
278 public tlm::nw::tlm_network_bw_transport_if<cxs_packet_types> {
279 using flit_tx_type = cxs_flit_types::tlm_payload_type;
280 using flit_phase_type = cxs_flit_types::tlm_phase_type;
281
282 using pkt_tx_type = cxs_packet_types::tlm_payload_type;
283 using pkt_phase_type = cxs_packet_types::tlm_phase_type;
284
285 static constexpr unsigned PHIT_BYTE_WIDTH = PHITWIDTH / 8;
286 static constexpr unsigned BUCKET_SIZE = PHITWIDTH / 8 / CXSMAXPKTPERFLIT;
287
288 sc_core::sc_in<bool> clk_i{"clk_i"};
289
290 sc_core::sc_in<bool> rst_i{"rst_i"};
291
292 cxs_flit_target_socket<PHITWIDTH> tsck{"tsck"};
293
294 cxs_pkt_initiator_socket<> isck{"isck"};
295
296 cci::cci_param<sc_core::sc_time> clock_period{"clock_period", sc_core::SC_ZERO_TIME, "clock period of the CXS receiver"};
297
298 scc::cci_param_restricted<unsigned> max_credit{"max_credits", 1, scc::min_restriction(1u),
299 "CXS_MAX_CREDIT property, shall be larger than 0"};
300
301 cxs_receiver(sc_core::sc_module_name const& nm)
302 : sc_core::sc_module(nm) {
303 register_extensions();
304 tsck(*this);
305 isck(*this);
306 SC_HAS_PROCESS(cxs_receiver);
307 SC_METHOD(clock);
308 sensitive << clk_i.pos();
309 dont_initialize();
310 SC_METHOD(handle_received_credits);
311 sensitive << returned_credits.event();
312 dont_initialize();
313 }
314
315private:
316 void start_of_simulation() override {
317 if(clock_period.get_value() == sc_core::SC_ZERO_TIME)
318 if(auto clk_if = dynamic_cast<sc_core::sc_clock*>(clk_i.get_interface()))
319 clock_period.set_value(clk_if->period());
320 }
321
322 void b_transport(flit_tx_type& trans, sc_core::sc_time& t) override {
323 auto ext = trans.get_extension<orig_pkt_extension>();
324 sc_assert(ext);
325 auto tx = ext->orig_ext.front();
326 isck->b_transport(*tx, t);
327 }
328
329 tlm::tlm_sync_enum nb_transport_fw(flit_tx_type& trans, flit_phase_type& phase, sc_core::sc_time& t) override {
330 SCCTRACEALL(SCMOD) << "Received non-blocking transaction in fw path with phase " << phase.get_name();
331 returned_credits.notify(1, sc_core::SC_ZERO_TIME);
332 if(trans.end) {
333 auto ext = trans.get_extension<cxs::orig_pkt_extension>();
334 for(auto& orig_ptr : ext->orig_ext) {
335 auto ph = tlm::nw::REQUEST;
336 auto d = sc_core::SC_ZERO_TIME;
337 SCCDEBUG(SCMOD) << "Forwarding CXS pkt with size " << orig_ptr->get_data().size() << "bytes";
338 auto status = isck->nb_transport_fw(*orig_ptr, ph, t);
339 sc_assert(status == tlm::TLM_UPDATED);
340 }
341 }
342 if(clock_period.get_value() != sc_core::SC_ZERO_TIME)
343 t += clock_period.get_value() - 1_ps;
344 phase = tlm::nw::RESPONSE;
345 return tlm::TLM_UPDATED;
346 }
347
348 unsigned int transport_dbg(flit_tx_type& trans) override { return 0; }
349
350 tlm::tlm_sync_enum nb_transport_bw(pkt_tx_type& trans, flit_phase_type& phase, sc_core::sc_time& t) override {
351 SCCTRACEALL(SCMOD) << "Received non-blocking transaction in bw path with phase " << phase.get_name();
352 if(phase == tlm::nw::CONFIRM)
353 return tlm::TLM_ACCEPTED;
354 throw std::runtime_error("illegal request in backward path");
355 }
356
357 void handle_received_credits() {
358 while(returned_credits.has_next()) {
359 auto crd = returned_credits.get();
360 available_credits += crd;
361 }
362 }
363
364 void clock() {
365 if(rst_i.read()) {
366 available_credits = max_credit.get_value();
367 } else if(available_credits > 0u) {
368 auto* ptr = cxs_flit_mm::get().allocate();
369 ptr->set_command(cxs::CXS_CMD::CREDIT);
370 ptr->set_data({1});
371 auto ph = tlm::nw::REQUEST;
372 auto t = sc_core::SC_ZERO_TIME;
373 auto status = tsck->nb_transport_bw(*ptr, ph, t);
374 sc_assert(status == tlm::TLM_UPDATED);
375 available_credits -= 1u;
376 }
377 }
378 scc::sc_variable<unsigned> available_credits{"available_credits", 0};
379 scc::peq<unsigned> returned_credits;
380};
381
382template <unsigned PHITWIDTH = 64>
383struct cxs_channel : public sc_core::sc_module,
384 public tlm::nw::tlm_network_fw_transport_if<cxs_flit_types>,
385 public tlm::nw::tlm_network_bw_transport_if<cxs_flit_types> {
386
387 using transaction_type = cxs_flit_types::tlm_payload_type;
388 using phase_type = cxs_flit_types::tlm_phase_type;
389
390 sc_core::sc_in<bool> rx_clk_i{"rx_clk_i"};
391
392 cxs_flit_target_socket<PHITWIDTH> tsck{"tsck"};
393
394 sc_core::sc_in<bool> tx_clk_i{"tx_clk_i"};
395
396 cxs_flit_initiator_socket<PHITWIDTH> isck{"isck"};
397
398 cci::cci_param<sc_core::sc_time> channel_delay{"channel_delay", sc_core::SC_ZERO_TIME, "delay of the CXS channel"};
399
400 cci::cci_param<sc_core::sc_time> tx_clock_period{"tx_clock_period", sc_core::SC_ZERO_TIME,
401 "transmitter side clock period of the CXS channel"};
402
403 cci::cci_param<sc_core::sc_time> rx_clock_period{"rx_clock_period", sc_core::SC_ZERO_TIME,
404 "receiver side clock period of the CXS channel"};
405
406 cxs_channel(sc_core::sc_module_name const& nm)
407 : sc_core::sc_module(nm) {
408 isck(*this);
409 tsck(*this);
410 SC_HAS_PROCESS(cxs_channel);
411 SC_METHOD(fw);
412 SC_METHOD(bw);
413 }
414
415 void b_transport(transaction_type& trans, sc_core::sc_time& t) override {
416 t += channel_delay;
417 isck->b_transport(trans, t);
418 }
419
420 tlm::tlm_sync_enum nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
421 SCCTRACEALL(SCMOD) << "Received non-blocking transaction in fw path with phase " << phase.get_name();
422 if(phase == tlm::nw::REQUEST) {
423 if(trans.get_data().size() > PHITWIDTH / 8) {
424 SCCERR(SCMOD) << "A CXS flit can be maximal " << PHITWIDTH / 8 << " bytes long, current data length is "
425 << trans.get_data().size() << " bytes";
426 }
427 if(tx_clock_period.get_value().value()) {
428 auto exit_cycle =
429 (sc_core::sc_time_stamp().value() + channel_delay.get_value().value()) / tx_clock_period.get_value().value() + 1;
430 fw_peq.notify(cxs_flit_shared_ptr(&trans), tx_clock_period.get_value() * exit_cycle - sc_core::sc_time_stamp());
431 } else
432 fw_peq.notify(cxs_flit_shared_ptr(&trans), channel_delay.get_value());
433 if(rx_clock_period.get_value() > sc_core::SC_ZERO_TIME)
434 t += rx_clock_period - 1_ps;
435 phase = tlm::nw::CONFIRM;
436 return tlm::TLM_UPDATED;
437 } else if(phase == tlm::nw::RESPONSE) { // a credit response
438 bw_resp.notify(sc_core::SC_ZERO_TIME);
439 return tlm::TLM_ACCEPTED;
440 }
441 throw std::runtime_error("illegal request in forward path");
442 }
443
444 tlm::tlm_sync_enum nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) override {
445 SCCTRACEALL(SCMOD) << "Received non-blocking transaction in bw path with phase " << phase.get_name();
446 if(phase == tlm::nw::REQUEST) { // this is a credit
447 SCCTRACE(SCMOD) << "Forwarding " << static_cast<unsigned>(trans.get_data()[0]) << " credit(s)";
448 if(rx_clock_period.get_value().value()) {
449 auto exit_cycle =
450 (sc_core::sc_time_stamp().value() + channel_delay.get_value().value()) / rx_clock_period.get_value().value() + 1;
451 bw_peq.notify(cxs_flit_shared_ptr(&trans), rx_clock_period.get_value() * exit_cycle - sc_core::sc_time_stamp());
452 } else
453 bw_peq.notify(cxs_flit_shared_ptr(&trans), channel_delay.get_value());
454 if(tx_clock_period.get_value() > sc_core::SC_ZERO_TIME)
455 t += tx_clock_period - 1_ps;
456 phase = tlm::nw::CONFIRM;
457 return tlm::TLM_UPDATED;
458 } else if(phase == tlm::nw::RESPONSE) { // a data transfer completion
459 fw_resp.notify(sc_core::SC_ZERO_TIME);
460 return tlm::TLM_ACCEPTED;
461 }
462 throw std::runtime_error("illegal response in backward path");
463 }
464
465 unsigned int transport_dbg(transaction_type& trans) override { return isck->transport_dbg(trans); }
466
467private:
468 void start_of_simulation() override {
469 if(tx_clock_period.get_value() == sc_core::SC_ZERO_TIME)
470 if(auto clk_if = dynamic_cast<sc_core::sc_clock*>(tx_clk_i.get_interface()))
471 tx_clock_period.set_value(clk_if->period());
472 if(rx_clock_period.get_value() == sc_core::SC_ZERO_TIME)
473 if(auto clk_if = dynamic_cast<sc_core::sc_clock*>(rx_clk_i.get_interface()))
474 rx_clock_period.set_value(clk_if->period());
475 }
476
477 void fw() {
478 auto cur_cycle = sc_core::sc_time_stamp() / tx_clock_period.get_value();
479 if(fw_resp.triggered() && tx_clock_period.get_value().value()) {
480 auto next_cycle = sc_core::sc_time_stamp().value() / tx_clock_period.get_value().value() + 1;
481 next_trigger(tx_clock_period.get_value() * next_cycle - sc_core::sc_time_stamp());
482 return;
483 }
484 while(fw_peq.has_next()) {
485 auto ptr = fw_peq.get();
486 auto phase = tlm::nw::INDICATION;
487 auto t = sc_core::SC_ZERO_TIME;
488 auto sync = isck->nb_transport_fw(*ptr, phase, t);
489 if(sync == tlm::TLM_ACCEPTED) {
490 next_trigger(fw_resp);
491 return;
492 } else {
493 sc_assert(sync == tlm::TLM_UPDATED || sync == tlm::TLM_COMPLETED);
494 next_trigger(tx_clock_period.get_value());
495 return;
496 }
497 }
498 next_trigger(fw_peq.event());
499 }
500
501 void bw() {
502 if(bw_resp.triggered() && rx_clock_period.get_value().value()) {
503 auto next_cycle = sc_core::sc_time_stamp().value() / rx_clock_period.get_value().value() + 1;
504 next_trigger(rx_clock_period.get_value() * next_cycle - sc_core::sc_time_stamp());
505 return;
506 }
507 while(bw_peq.has_next()) {
508 auto ptr = bw_peq.get();
509 auto ph{tlm::nw::REQUEST};
510 sc_core::sc_time d;
511 auto sync = tsck->nb_transport_bw(*ptr, ph, d);
512 if(sync == tlm::TLM_ACCEPTED) {
513 next_trigger(bw_resp);
514 return;
515 } else {
516 sc_assert(sync == tlm::TLM_UPDATED || sync == tlm::TLM_COMPLETED);
517 next_trigger(rx_clock_period.get_value());
518 return;
519 }
520 }
521 next_trigger(bw_peq.event());
522 }
523
526 sc_core::sc_event fw_resp, bw_resp;
527};
528
529} // namespace cxs
530
531#ifdef HAS_SCV
532#include <scv.h>
533#ifndef SCVNS
534#define SCVNS
535#endif
536#else
537#include <scv-tr.h>
538#ifndef SCVNS
539#define SCVNS ::scv_tr::
540#endif
541#endif
542namespace tlm {
544namespace nw {
546namespace scv {
547
548void record(SCVNS scv_tr_handle& handle, cxs::cxs_flit_payload const& o);
549}
550} // namespace nw
551} // namespace tlm
552#endif // _CXS_CXS_TLM_H_
payload_type * allocate()
get a plain tlm_payload_type without extensions
Definition tlm_mm.h:218
CXS TLM utilities.
Definition cxs_tlm.cpp:22
SCC TLM utilities.
_min_restriction< T > min_restriction(T min)
creates a minimum restriction including the minimum value
SCC SCV4TLM classes and functions.
Definition cxs_tlm.h:546
SCC TLM utilities.
Definition cxs_tlm.h:544
SystemC TLM.
Definition dmi_mgr.h:19
extension of cci_param<T, TM> which automatically registeres a callback to restrict the valid values ...
priority event queue
Definition peq.h:41
SystemC variable.
Definition sc_variable.h:87
Definition of the tlm_network_initiator_socket class.
A base class for TLM network payloads.
A class for TLM network payloads with support for extensions and memory management.
CMDENUM get_command() const
Gets the command from the payload.
std::vector< uint8_t > const & get_data() const
Gets the data from the payload.
Definition of the tlm_network_target_socket class.
a tlm memory manager
Definition tlm_mm.h:330
The SystemC Transaction Level Model (TLM) Network TLM utilities.