source: trunk/modules/vci_io_bridge/caba/source/include/transaction_tab_io.h

Last change on this file was 715, checked in by cfuguet, 10 years ago

vci_io_bridge:

  • erasing XICU base and size registers. There registers are not used anymore because routing through INT network is done by using special attribute of IOX mapping segments.
  • bugfix: adding config_cmd_to_config_rsp registers for transmitting SRCID, TRDID and PKTID. Before, r_config_cmd registers were used for transmitting these informations to CONFIG_RSP FSM, but these registers can be simultaneously modified by the CONFIG_CMD FSM.
  • adding a masking table for SRCID in the DMA_CMD FSM. This masking table is used to replace SRCID global bits of commands coming from external DMA peripherals by the IOB cluster global bits. This way, the responses for DMA peripheral commands, will come through the same IOB. In the same manner, the DMA_RSP FSM masks the global bits of RSRCID before sending to DMA external peripherals.
  • introduction of an IO transaction table in the CONFIG_CMD FSM. This table is used to store SRCID and TRDID of incoming commands from the INT network. The SRCID and TRDID of these commands is replaced by the IOB IOX SRCID and table index respectively. The goal is to force that responses to these commands come back trough the same IOB. The CONFIG_RSP FSM restores both SRCID and TRDID by reading the table.
  • Property svn:executable set to *
File size: 7.1 KB
Line 
1#ifndef IOB_TRANSACTION_H_
2#define IOB_TRANSACTION_H_
3 
4#include <inttypes.h>
5#include <systemc>
6#include <cassert>
7#include "arithmetics.h"
8
9#define DEBUG_IOB_TRANSACTION 0
10
11////////////////////////////////////////////////////////////////////////
12//                  A transaction tab entry         
13////////////////////////////////////////////////////////////////////////
14
15class TransactionTabIOEntry {
16  typedef uint32_t size_t;
17
18 public:
19  bool   valid;          // valid entry
20  size_t srcid;          // initiator requesting the transaction
21  size_t trdid;          // thread ID of transaction
22
23  /////////////////////////////////////////////////////////////////////
24  // The init() function initializes the entry
25  /////////////////////////////////////////////////////////////////////
26  void init()
27  {
28    valid = false;
29  }
30
31  ////////////////////////////////////////////////////////////////////
32  // The copy() function copies an existing entry
33  // Its arguments are :
34  // - source : the transaction tab entry to copy
35  ////////////////////////////////////////////////////////////////////
36  void copy(const TransactionTabIOEntry &source)
37  {
38    valid = source.valid;
39    srcid = source.srcid;
40    trdid = source.trdid;
41  }
42
43  ////////////////////////////////////////////////////////////////////
44  // The print() function prints the entry
45  ////////////////////////////////////////////////////////////////////
46  void print(){
47    std::cout << "   valid = " << valid << std::hex
48              << " / srcid = " << srcid
49              << " / trdid = " << trdid << std::dec
50              << std::endl;
51  }
52
53  /////////////////////////////////////////////////////////////////////
54  //        Constructors
55  /////////////////////////////////////////////////////////////////////
56
57  TransactionTabIOEntry()
58  {
59    valid = false;
60  }
61
62  TransactionTabIOEntry(const TransactionTabIOEntry &source){
63    valid = source.valid;
64    srcid = source.srcid;
65    trdid = source.trdid;
66  }
67
68}; // end class TransactionTabIOEntry
69
70////////////////////////////////////////////////////////////////////////
71//                  The transaction tab                             
72////////////////////////////////////////////////////////////////////////
73class TransactionTabIO{
74 private:
75  const size_t size_tab;          // The size of the tab
76
77 public:
78  TransactionTabIOEntry *tab;     // The transaction tab
79
80  ////////////////////////////////////////////////////////////////////
81  //        Constructors
82  ////////////////////////////////////////////////////////////////////
83  TransactionTabIO(size_t n_entries) : size_tab(n_entries)
84  {
85    tab = new TransactionTabIOEntry[size_tab];
86  }
87
88  ~TransactionTabIO()
89  {
90    delete [] tab;
91  }
92
93  /////////////////////////////////////////////////////////////////////
94  // The size() function returns the size of the tab
95  /////////////////////////////////////////////////////////////////////
96  const size_t& size()
97  {
98    return size_tab;
99  }
100
101  /////////////////////////////////////////////////////////////////////
102  // The init() function initializes the transaction tab entries
103  /////////////////////////////////////////////////////////////////////
104  void init()
105  {
106    for ( size_t index = 0; index < size_tab; index++)
107    {
108      tab[index].init();
109    }
110  }
111
112  /////////////////////////////////////////////////////////////////////
113  // The print() function prints a transaction tab entry
114  // Arguments :
115  // - index : the index of the entry to print
116  /////////////////////////////////////////////////////////////////////
117  void print(const size_t index)
118  {
119    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
120    tab[index].print();
121    return;
122  }
123
124  /////////////////////////////////////////////////////////////////////
125  // The printTrace() function prints all transaction tab entries
126  /////////////////////////////////////////////////////////////////////
127  void printTrace()
128  {
129    for (size_t index = 0; index < size_tab; index++)
130    {
131      tab[index].print();
132    }
133  }
134
135  /////////////////////////////////////////////////////////////////////
136  // The read() function returns a transaction tab entry.
137  // Arguments :
138  // - index : the index of the entry to read
139  /////////////////////////////////////////////////////////////////////
140  TransactionTabIOEntry& read(const size_t index)
141  {
142    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
143    return tab[index];
144  }
145 
146  /////////////////////////////////////////////////////////////////////
147  // The readSrcid() function returns the srcid field of a transaction tab entry.
148  // Arguments :
149  // - index : the index of the entry to read
150  /////////////////////////////////////////////////////////////////////
151  size_t readSrcid(const size_t index)
152  {
153    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
154    return tab[index].srcid;
155  }
156
157  /////////////////////////////////////////////////////////////////////
158  // The readTrdid() function returns the trdid field of a transaction tab entry.
159  // Arguments :
160  // - index : the index of the entry to read
161  /////////////////////////////////////////////////////////////////////
162  size_t readTrdid(const size_t index)
163  {
164    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
165    return tab[index].trdid;
166  }
167
168  /////////////////////////////////////////////////////////////////////
169  // The full() function returns the state of the transaction tab
170  // Arguments :
171  // - index : (return argument) the index of an empty entry
172  // The function returns true if the transaction tab is full
173  /////////////////////////////////////////////////////////////////////
174  bool full(size_t &index)
175  {
176    for(size_t i=0; i<size_tab; i++)
177    {
178      if(!tab[i].valid)
179      {
180        index = i;
181        return false;   
182      }
183    }
184    return true;
185  }
186
187  /////////////////////////////////////////////////////////////////////
188  // The set() function registers a transaction (read or write)
189  // to the XRAM in the transaction tab.
190  // Arguments :
191  // - index : index in the transaction tab
192  // - srcid : srcid of the initiator that caused the transaction
193  // - trdid : trdid of the initiator that caused the transaction
194  /////////////////////////////////////////////////////////////////////
195  void set(const size_t index,
196           const size_t srcid,
197           const size_t trdid) 
198  {
199    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
200    tab[index].valid = true;
201    tab[index].srcid = srcid;
202    tab[index].trdid = trdid;
203  }
204
205  /////////////////////////////////////////////////////////////////////
206  // The erase() function erases an entry in the transaction tab.
207  // Arguments :
208  // - index : the index of the request in the transaction tab
209  /////////////////////////////////////////////////////////////////////
210  void erase(const size_t index)
211  {
212    assert( (index < size_tab) && "Invalid Transaction Tab Entry");
213    tab[index].valid = false;
214  }
215}; // end class TransactionTabIO
216
217#endif
218
219// Local Variables:
220// tab-width: 2
221// c-basic-offset: 2
222// c-file-offsets:((innamespace . 0)(inline-open . 0))
223// indent-tabs-mode: nil
224// End:
225
226// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
227
Note: See TracBrowser for help on using the repository browser.