gem5  v20.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
AbstractController.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017,2019 ARM Limited
3  * All rights reserved.
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2009-2014 Mark D. Hill and David A. Wood
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 #ifndef __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
42 #define __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
43 
44 #include <exception>
45 #include <iostream>
46 #include <string>
47 
48 #include "base/addr_range.hh"
49 #include "base/callback.hh"
50 #include "mem/packet.hh"
51 #include "mem/qport.hh"
58 #include "mem/ruby/protocol/AccessPermission.hh"
60 #include "params/RubyController.hh"
61 #include "sim/clocked_object.hh"
62 
63 class Network;
64 class GPUCoalescer;
65 class DMASequencer;
66 
67 // used to communicate that an in_port peeked the wrong message type
68 class RejectException: public std::exception
69 {
70  virtual const char* what() const throw()
71  { return "Port rejected message based on type"; }
72 };
73 
75 {
76  public:
77  typedef RubyControllerParams Params;
78  AbstractController(const Params *p);
79  void init();
80  const Params *params() const { return (const Params *)_params; }
81 
82  NodeID getVersion() const { return m_machineID.getNum(); }
83  MachineType getType() const { return m_machineID.getType(); }
84 
85  void initNetworkPtr(Network* net_ptr) { m_net_ptr = net_ptr; }
86 
87  // return instance name
88  void blockOnQueue(Addr, MessageBuffer*);
89  bool isBlocked(Addr) const;
90  void unblock(Addr);
91  bool isBlocked(Addr);
92 
93  virtual MessageBuffer* getMandatoryQueue() const = 0;
94  virtual MessageBuffer* getMemReqQueue() const = 0;
95  virtual MessageBuffer* getMemRespQueue() const = 0;
96  virtual AccessPermission getAccessPermission(const Addr &addr) = 0;
97 
98  virtual void print(std::ostream & out) const = 0;
99  virtual void wakeup() = 0;
100  virtual void resetStats() = 0;
101  virtual void regStats();
102 
103  virtual void recordCacheTrace(int cntrl, CacheRecorder* tr) = 0;
104  virtual Sequencer* getCPUSequencer() const = 0;
105  virtual DMASequencer* getDMASequencer() const = 0;
106  virtual GPUCoalescer* getGPUCoalescer() const = 0;
107 
108  // This latency is used by the sequencer when enqueueing requests.
109  // Different latencies may be used depending on the request type.
110  // This is the hit latency unless the top-level cache controller
111  // introduces additional cycles in the response path.
112  virtual Cycles mandatoryQueueLatency(const RubyRequestType& param_type)
113  { return m_mandatory_queue_latency; }
114 
117  virtual bool functionalReadBuffers(PacketPtr&) = 0;
118  virtual void functionalRead(const Addr &addr, PacketPtr) = 0;
119  void functionalMemoryRead(PacketPtr);
122  virtual int functionalWriteBuffers(PacketPtr&) = 0;
123  virtual int functionalWrite(const Addr &addr, PacketPtr) = 0;
124  int functionalMemoryWrite(PacketPtr);
125 
127  virtual void enqueuePrefetch(const Addr &, const RubyRequestType&)
128  { fatal("Prefetches not implemented!");}
129 
133  virtual void collateStats()
134  {fatal("collateStats() should be overridden!");}
135 
137  virtual void initNetQueues() = 0;
138 
140  Port &getPort(const std::string &if_name,
141  PortID idx=InvalidPortID);
142 
143  void recvTimingResp(PacketPtr pkt);
144  Tick recvAtomic(PacketPtr pkt);
145 
146  const AddrRangeList &getAddrRanges() const { return addrRanges; }
147 
148  public:
149  MachineID getMachineID() const { return m_machineID; }
150 
151  Stats::Histogram& getDelayHist() { return m_delayHistogram; }
153  { return *(m_delayVCHistogram[index]); }
154 
168  MachineID mapAddressToMachine(Addr addr, MachineType mtype) const;
169 
170  protected:
172  void profileRequest(const std::string &request);
174  void profileMsgDelay(uint32_t virtualNetwork, Cycles delay);
175 
176  void stallBuffer(MessageBuffer* buf, Addr addr);
177  void wakeUpBuffers(Addr addr);
178  void wakeUpAllBuffers(Addr addr);
179  void wakeUpAllBuffers();
180  bool serviceMemoryQueue();
181 
182  protected:
186 
187  // MasterID used by some components of gem5.
189 
192  std::map<Addr, MessageBuffer*> m_block_map;
193 
195  typedef std::set<MessageBuffer*> MsgBufType;
196  typedef std::map<Addr, MsgVecType* > WaitingBufType;
197  WaitingBufType m_waiting_buffers;
198 
199  unsigned int m_in_ports;
200  unsigned int m_cur_in_port;
201  const int m_number_of_TBEs;
203  const unsigned int m_buffer_size;
206 
210 
215 
218  class StatsCallback : public Callback
219  {
220  private:
222 
223  public:
224  virtual ~StatsCallback() {}
225  StatsCallback(AbstractController *_ctr) : ctr(_ctr) {}
226  void process() {ctr->collateStats();}
227  };
228 
234  {
235  private:
236  // Packet queues used to store outgoing requests and snoop responses.
239 
240  // Controller that operates this port.
242 
243  public:
244  MemoryPort(const std::string &_name, AbstractController *_controller,
245  const std::string &_label);
246 
247  // Function for receiving a timing response from the peer port.
248  // Currently the pkt is handed to the coherence controller
249  // associated with this port.
250  bool recvTimingResp(PacketPtr pkt);
251  };
252 
253  /* Master port to the memory controller. */
255 
256  // State that is stored in packets sent to the memory controller.
258  {
259  // Id of the machine from which the request originated.
261 
262  SenderState(MachineID _id) : id(_id)
263  {}
264  };
265 
266  private:
269 };
270 
271 #endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
std::map< Addr, MsgVecType *> WaitingBufType
Ports are used to interface objects to each other.
Definition: port.hh:56
Bitfield< 30, 0 > index
WaitingBufType m_waiting_buffers
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:81
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:171
Generic callback class.
Definition: callback.hh:39
const unsigned int m_buffer_size
const PortID InvalidPortID
Definition: types.hh:236
virtual const char * what() const
The QueuedMasterPort combines two queues, a request queue and a snoop response queue, that both share the same port.
Definition: qport.hh:106
ip6_addr_t addr
Definition: inet.hh:330
const Cycles m_mandatory_queue_latency
std::map< Addr, MessageBuffer * > m_block_map
virtual void enqueuePrefetch(const Addr &, const RubyRequestType &)
Function for enqueuing a prefetch request.
const AddrRangeList & getAddrRanges() const
std::set< MessageBuffer * > MsgBufType
std::vector< MessageBuffer * > MsgVecType
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2505
Port that forwards requests and receives responses from the memory controller.
void process()
virtual process function that is invoked when the callback queue is executed.
STL vector class.
Definition: stl.hh:37
RubyControllerParams Params
NodeID getVersion() const
unsigned int NodeID
Definition: TypeDefines.hh:34
Declaration of the queued port.
Callback class used for collating statistics from all the controller of this type.
MachineID getMachineID() const
const AddrRangeList addrRanges
The address range to which the controller responds on the CPU side.
uint64_t Tick
Tick count type.
Definition: types.hh:61
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
std::vector< Stats::Histogram * > m_delayVCHistogram
ClockedObject declaration and implementation.
Stats::Histogram & getDelayVCHist(uint32_t index)
A simple histogram stat.
Definition: statistics.hh:2626
virtual void collateStats()
Function for collating statistics from all the controllers of this particular type.
Stats::Scalar m_fully_busy_cycles
Counter for the number of cycles when the transitions carried out were equal to the maximum allowed...
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:140
uint16_t MasterID
Definition: request.hh:84
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:249
A virtual base opaque structure used to hold state associated with the packet (e.g., an MSHR), specific to a SimObject that sees the packet.
Definition: packet.hh:397
MachineType getType() const
Declaration of the Packet class.
virtual Cycles mandatoryQueueLatency(const RubyRequestType &param_type)
Stats::Histogram & getDelayHist()
const Params * params() const
StatsCallback(AbstractController *_ctr)
const MasterID m_masterId
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:235
void initNetworkPtr(Network *net_ptr)
Bitfield< 0 > p
const FlagsType init
This Stat is Initialized.
Definition: info.hh:45
Stats::Histogram m_delayHistogram
Histogram for profiling delay for the messages this controller cares for.

Generated on Thu May 28 2020 16:21:35 for gem5 by doxygen 1.8.13