gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
SimpleLTTarget1.h
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4  more contributor license agreements. See the NOTICE file distributed
5  with this work for additional information regarding copyright ownership.
6  Accellera licenses this file to you under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with the
8  License. You may obtain a copy of the License at
9 
10  http://www.apache.org/licenses/LICENSE-2.0
11 
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  implied. See the License for the specific language governing
16  permissions and limitations under the License.
17 
18  *****************************************************************************/
19 
20 #ifndef __SIMPLE_LT_TARGET1_H__
21 #define __SIMPLE_LT_TARGET1_H__
22 
23 #include "tlm.h"
24 #include <cassert>
25 #include <vector>
26 
28  public sc_core::sc_module,
29  public virtual tlm::tlm_fw_transport_if<>
30 {
31 public:
38 
39 public:
40  target_socket_type socket;
41 
42 public:
44  SimpleLTTarget1(sc_core::sc_module_name name, bool invalidate = false) :
45  sc_core::sc_module(name),
46  socket("socket"),
47  m_invalidate(invalidate)
48  {
49  // Bind this target's interface to the target socket
50  socket(*this);
51  if (invalidate)
52  {
57  }
58  }
59 
60  sync_enum_type nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
61  {
62  //Target never calls wait, so we can do this
63  b_transport(trans, t);
64 
65  return tlm::TLM_COMPLETED;
66  }
67 
68  void b_transport(transaction_type& trans, sc_core::sc_time &t)
69  {
70  sc_dt::uint64 address = trans.get_address();
71  assert(address < 400);
72 
73  unsigned int& data = *reinterpret_cast<unsigned int*>(trans.get_data_ptr());
74  if (trans.get_command() == tlm::TLM_WRITE_COMMAND) {
75  std::cout << name() << ": Received write request: A = 0x"
76  << std::hex << (unsigned int)address
77  << ", D = 0x" << data << std::dec
78  << " @ " << sc_core::sc_time_stamp() << std::endl;
79 
80  *reinterpret_cast<unsigned int*>(&mMem[address]) = data;
82 
83  } else {
84  std::cout << name() << ": Received read request: A = 0x"
85  << std::hex << (unsigned int)address << std::dec
86  << " @ " << sc_core::sc_time_stamp() << std::endl;
87 
88  data = *reinterpret_cast<unsigned int*>(&mMem[address]);
90  }
91 
93 
94  trans.set_dmi_allowed(true);
95  }
96 
97  unsigned int transport_dbg(transaction_type& r)
98  {
99  if (r.get_address() >= 400) return 0;
100 
101  unsigned int tmp = (int)r.get_address();
102  unsigned int num_bytes;
103  if (tmp + r.get_data_length() >= 400) {
104  num_bytes = 400 - tmp;
105 
106  } else {
107  num_bytes = r.get_data_length();
108  }
109  if (r.is_read()) {
110  for (unsigned int i = 0; i < num_bytes; ++i) {
111  r.get_data_ptr()[i] = mMem[i + tmp];
112  }
113 
114  } else {
115  for (unsigned int i = 0; i < num_bytes; ++i) {
116  mMem[i + tmp] = r.get_data_ptr()[i];
117  }
118  }
119  return num_bytes;
120  }
121 
122  bool get_direct_mem_ptr(transaction_type& trans,
123  tlm::tlm_dmi& dmi_data)
124  {
125  sc_dt::uint64 address = trans.get_address();
127  if (address < 400) {
128  dmi_data.allow_read_write();
129  dmi_data.set_start_address(0x0);
130  dmi_data.set_end_address(399);
131  dmi_data.set_dmi_ptr(mMem);
134  return true;
135 
136  } else {
137  // should not happen
138  dmi_data.set_start_address(trans.get_address());
139  dmi_data.set_end_address(trans.get_address());
140  return false;
141 
142  }
143  }
144 
146  {
147  sc_dt::uint64 start_address = 0x0;
148  sc_dt::uint64 end_address = 399;
149  socket->invalidate_direct_mem_ptr(start_address, end_address);
150  }
151 private:
152  unsigned char mMem[400];
156 };
157 
158 #endif
void set_response_status(const tlm_response_status response_status)
Definition: gp.hh:204
unsigned int transport_dbg(transaction_type &r)
target_socket_type socket
Bitfield< 7 > i
tlm::tlm_sync_enum sync_enum_type
#define SC_METHOD(name)
Definition: sc_module.hh:299
void set_dmi_ptr(unsigned char *p)
Definition: dmi.hh:81
void b_transport(transaction_type &trans, sc_core::sc_time &t)
void set_start_address(sc_dt::uint64 addr)
Definition: dmi.hh:82
const char * name() const
Definition: sc_object.cc:44
sc_sensitive sensitive
Definition: sc_module.hh:206
tlm::tlm_target_socket< 32 > target_socket_type
tlm::tlm_generic_payload transaction_type
void dont_initialize()
Definition: sc_module.cc:336
sc_dt::uint64 get_address() const
Definition: gp.hh:184
tlm::tlm_fw_transport_if fw_interface_type
unsigned char * get_data_ptr() const
Definition: gp.hh:188
sync_enum_type nb_transport_fw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
sc_core::sc_event m_invalidate_dmi_event
unsigned int get_data_length() const
Definition: gp.hh:192
sc_core::sc_time m_invalidate_dmi_time
SC_HAS_PROCESS(SimpleLTTarget1)
void set_read_latency(sc_core::sc_time t)
Definition: dmi.hh:84
tlm::tlm_bw_transport_if bw_interface_type
void set_write_latency(sc_core::sc_time t)
Definition: dmi.hh:85
const sc_time & sc_time_stamp()
Definition: sc_main.cc:128
void allow_read_write()
Definition: dmi.hh:90
void set_dmi_allowed(bool dmi_allowed)
Definition: gp.hh:239
uint64_t uint64
Definition: sc_nbdefs.hh:172
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
tlm_command get_command() const
Definition: gp.hh:180
SimpleLTTarget1(sc_core::sc_module_name name, bool invalidate=false)
tlm_sync_enum
Definition: fw_bw_ifs.hh:31
Bitfield< 5 > t
void invalidate_dmi_method()
void set_end_address(sc_dt::uint64 addr)
Definition: dmi.hh:83
const char data[]
bool is_read() const
Definition: gp.hh:176
tlm::tlm_phase phase_type
unsigned char mMem[400]

Generated on Mon Jun 8 2020 15:45:15 for gem5 by doxygen 1.8.13