source: branches/v5/communication/dspin_dhccp_param/caba/source/include/dspin_dhccp_param.h @ 310

Last change on this file since 310 was 310, checked in by cfuguet, 11 years ago

Introducing FROM_L1_BC and FROM_MC_BC in dspin param class to
access the Broadcast bit in flit.
Replacing BROADCAST_BC by FROM_MC_BC in memory cache

File size: 14.6 KB
Line 
1#ifndef DSPIN_DHCCP_PARAMS_H
2#define DSPIN_DHCCP_PARAMS_H
3
4#include <inttypes.h>
5#include <assert.h>
6
7namespace soclib { namespace caba {
8
9/*
10 * L1 cache to Memory Cache command packets
11 *
12 * CLEANUP
13 *
14 * flit 1
15 * ----------------------------------------------------------------------------------------------
16 * EOP:0 | DEST(10 bits) | SRCID(14 bits) | NLINE MSB(2 bits) | WAY_INDEX(4 bits)  |    TYPE:0b1X
17 * ----------------------------------------------------------------------------------------------
18 *                                                                                 | X: 0 DATA  |
19 *                                                                                 |    1 INST  |
20 * flit 2
21 * ----------------------------------------------------------------------------------------------
22 * EOP:1 |                                                                         NLINE(32 bits)
23 * ----------------------------------------------------------------------------------------------
24 *
25 * MULTICAST ACKNOWLEDGEMENT
26 *
27 * flit 1
28 * ----------------------------------------------------------------------------------------------
29 * EOP:1 | DEST(10 bits) |                         X(16 bits) | UPDT_INDEX(4 bits) |    TYPE:0b00
30 * ----------------------------------------------------------------------------------------------
31 */
32
33/*
34 * Memory Cache to L1 cache command packets
35 *
36 * CLEANUP ACKNOWLEDGEMENT
37 *
38 * flit 1
39 * ----------------------------------------------------------------------------------------------
40 * EOP:1 | DEST(14 bits) | X | SET_INDEX(16 bits) | WAY_INDEX(4 bits) | TYPE:0b100(3 bits) | BC:0
41 * ----------------------------------------------------------------------------------------------
42 *
43 * MULTICAST UPDATE
44 *
45 * flit 1
46 * ----------------------------------------------------------------------------------------------
47 * EOP:0 | DEST(14 bits) | X(3 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b01X  | BC:0
48 * ----------------------------------------------------------------------------------------------
49 *                                                                           | X: 0 DATA  |
50 *                                                                           |    1 INST  |
51 * flit 2
52 * ----------------------------------------------------------------------------------------------
53 * EOP:0 | X | WORD_INDEX(4 bits)  |                                             NLINE (34 bits)
54 * ----------------------------------------------------------------------------------------------
55 *
56 * flit 3
57 * ----------------------------------------------------------------------------------------------
58 * EOP:0 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
59 * ----------------------------------------------------------------------------------------------
60 *
61 * flit N
62 * ----------------------------------------------------------------------------------------------
63 * EOP:1 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
64 * ----------------------------------------------------------------------------------------------
65 *
66 * MULTICAST INVALIDATE
67 *
68 * flit 1
69 * ----------------------------------------------------------------------------------------------
70 * EOP:0 | DEST(14 bits) | X(3 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b00X | BC:0
71 * ----------------------------------------------------------------------------------------------
72 *                                                                           | X: 0 DATA  |
73 *                                                                           |    1 INST  |
74 * flit 2
75 * ----------------------------------------------------------------------------------------------
76 * EOP:1 | X(5 bits) |                                                           NLINE (34 bits)
77 * ----------------------------------------------------------------------------------------------
78 *
79 * BROADCAST INVALIDATE
80 *
81 * flit 1
82 *       | BOUNDING BOX(20 bits)            |
83 * ----------------------------------------------------------------------------------------------
84 * EOP:0 | XMIN   | XMAX   | YMIN   | YMAX  | MEMC_ID(14 bits) | NETWORK_RESERVED(4 bits) | BC:1
85 * ----------------------------------------------------------------------------------------------
86 *
87 * flit 2
88 * ----------------------------------------------------------------------------------------------
89 * EOP:1 | X | UPDT_INDEX(4 bits) |                                              NLINE (34 bits)
90 * ----------------------------------------------------------------------------------------------
91 */
92
93/*
94 * Utility MACROS
95 */
96#define GET_FIELD(x,y)\
97    case y: return ((x >> y##_SHIFT) & y##_MASK)
98
99#define SET_FIELD(x,y,z)\
100    case z: x |= ((y & z##_MASK) << z##_SHIFT);break
101
102template<int from_memc_flit_width_t, int from_l1_flit_width_t>
103class DspinDhccpParam
104{
105  public:
106
107    static const uint8_t  from_memc_flit_width         = 40;
108    static const uint8_t  from_l1_flit_width           = 33;
109
110    static const uint8_t  UPDT_INDEX_WIDTH             = 4;
111    static const uint8_t  NLINE_WIDTH                  = 34;
112    static const uint8_t  SRCID_WIDTH                  = 14;
113    static const uint8_t  GLOBALID_WIDTH               = 10;
114    static const uint8_t  MEMC_TYPE_WIDTH              = 3;
115    static const uint8_t  WORD_INDEX_WIDTH             = 4;
116    static const uint8_t  BE_WIDTH                     = 4;
117    static const uint8_t  DATA_WIDTH                   = 32;
118    static const uint8_t  SET_INDEX_WIDTH              = 16;
119    static const uint8_t  WAY_INDEX_WIDTH              = 4;
120    static const uint8_t  BROADCAST_BOX_WIDTH          = 20;
121    static const uint8_t  L1_TYPE_WIDTH                = 2;
122
123    static const uint8_t  FROM_L1_TYPE_SHIFT           = 1;
124    static const uint64_t FROM_L1_TYPE_MASK            = ((1ULL<<L1_TYPE_WIDTH)-1);
125    static const uint8_t  FROM_L1_EOP_SHIFT            = 32;
126    static const uint64_t FROM_L1_EOP_MASK             = 1;
127    static const uint8_t  FROM_L1_BC_SHIFT             = 0;
128    static const uint64_t FROM_L1_BC_MASK              = 1;
129
130    static const uint8_t  CLEANUP_DEST_SHIFT           = 22;
131    static const uint64_t CLEANUP_DEST_MASK            = ((1ULL<<GLOBALID_WIDTH)-1);
132    static const uint8_t  CLEANUP_SRCID_SHIFT          = 8;
133    static const uint64_t CLEANUP_SRCID_MASK           = ((1ULL<<SRCID_WIDTH)-1);
134    static const uint8_t  CLEANUP_NLINE_MSB_SHIFT      = 6;
135    static const uint64_t CLEANUP_NLINE_MSB_MASK       = ((1ULL<< 2)-1);
136    static const uint8_t  CLEANUP_WAY_INDEX_SHIFT      = 2;
137    static const uint64_t CLEANUP_WAY_INDEX_MASK       = ((1ULL<<WAY_INDEX_WIDTH)-1);
138    static const uint8_t  CLEANUP_NLINE_LSB_SHIFT      = 0;
139    static const uint64_t CLEANUP_NLINE_LSB_MASK       = ((1ULL<<32)-1);
140
141    static const uint8_t  MULTI_ACK_EOP_SHIFT          = FROM_L1_EOP_SHIFT;
142    static const uint64_t MULTI_ACK_EOP_MASK           = FROM_L1_EOP_MASK;
143    static const uint8_t  MULTI_ACK_DEST_SHIFT         = CLEANUP_DEST_SHIFT;
144    static const uint64_t MULTI_ACK_DEST_MASK          = CLEANUP_DEST_MASK;
145    static const uint8_t  MULTI_ACK_UPDT_INDEX_SHIFT   = 2;
146    static const uint64_t MULTI_ACK_UPDT_INDEX_MASK    = ((1ULL<<UPDT_INDEX_WIDTH)-1);
147
148    static const uint8_t  FROM_MC_TYPE_SHIFT           = 1;
149    static const uint64_t FROM_MC_TYPE_MASK            = ((1ULL<<MEMC_TYPE_WIDTH)-1);
150    static const uint8_t  FROM_MC_EOP_SHIFT            = 39;
151    static const uint64_t FROM_MC_EOP_MASK             = 1;
152    static const uint8_t  FROM_MC_BC_SHIFT             = 0;
153    static const uint64_t FROM_MC_BC_MASK              = 1;
154
155    static const uint8_t  MULTI_INVAL_DEST_SHIFT       = 26;
156    static const uint64_t MULTI_INVAL_DEST_MASK        = ((1ULL<<SRCID_WIDTH)-1);
157    static const uint8_t  MULTI_INVAL_SRCID_SHIFT      = 8;
158    static const uint64_t MULTI_INVAL_SRCID_MASK       = ((1ULL<<SRCID_WIDTH)-1);
159    static const uint8_t  MULTI_INVAL_UPDT_INDEX_SHIFT = 4;
160    static const uint64_t MULTI_INVAL_UPDT_INDEX_MASK  = ((1ULL<<UPDT_INDEX_WIDTH)-1);
161    static const uint8_t  MULTI_INVAL_NLINE_SHIFT      = 0;
162    static const uint64_t MULTI_INVAL_NLINE_MASK       = ((1ULL<<NLINE_WIDTH)-1);
163
164    static const uint8_t  MULTI_UPDT_DEST_SHIFT        = MULTI_INVAL_DEST_SHIFT;
165    static const uint64_t MULTI_UPDT_DEST_MASK         = MULTI_INVAL_DEST_MASK;
166    static const uint8_t  MULTI_UPDT_SRCID_SHIFT       = MULTI_INVAL_SRCID_SHIFT;
167    static const uint64_t MULTI_UPDT_SRCID_MASK        = MULTI_INVAL_SRCID_MASK;
168    static const uint8_t  MULTI_UPDT_UPDT_INDEX_SHIFT  = MULTI_INVAL_UPDT_INDEX_SHIFT;
169    static const uint64_t MULTI_UPDT_UPDT_INDEX_MASK   = MULTI_INVAL_UPDT_INDEX_MASK;
170    static const uint8_t  MULTI_UPDT_WORD_INDEX_SHIFT  = 34;
171    static const uint64_t MULTI_UPDT_WORD_INDEX_MASK   = ((1ULL<<WORD_INDEX_WIDTH)-1);
172    static const uint8_t  MULTI_UPDT_NLINE_SHIFT       = MULTI_INVAL_NLINE_SHIFT;
173    static const uint64_t MULTI_UPDT_NLINE_MASK        = MULTI_INVAL_NLINE_MASK;
174    static const uint8_t  MULTI_UPDT_BE_SHIFT          = 32;
175    static const uint64_t MULTI_UPDT_BE_MASK           = ((1ULL<<BE_WIDTH)-1);
176    static const uint8_t  MULTI_UPDT_DATA_SHIFT        = 0;
177    static const uint64_t MULTI_UPDT_DATA_MASK         = ((1ULL<<DATA_WIDTH)-1);
178
179    static const uint8_t  CLEANUP_ACK_DEST_SHIFT       = MULTI_INVAL_DEST_SHIFT;
180    static const uint64_t CLEANUP_ACK_DEST_MASK        = MULTI_INVAL_DEST_MASK;
181    static const uint8_t  CLEANUP_ACK_SET_SHIFT        = 8;
182    static const uint64_t CLEANUP_ACK_SET_MASK         = ((1ULL<<SET_INDEX_WIDTH)-1);
183    static const uint8_t  CLEANUP_ACK_WAY_SHIFT        = 4;
184    static const uint64_t CLEANUP_ACK_WAY_MASK         = ((1ULL<<WAY_INDEX_WIDTH)-1);
185
186    static const uint8_t  BROADCAST_BOX_SHIFT          = 29;
187    static const uint64_t BROADCAST_BOX_MASK           = ((1ULL<<BROADCAST_BOX_WIDTH)-1);
188    static const uint8_t  BROADCAST_SRCID_SHIFT        = 5;
189    static const uint64_t BROADCAST_SRCID_MASK         = MULTI_INVAL_SRCID_MASK;
190    static const uint8_t  BROADCAST_UPDT_INDEX_SHIFT   = 34;
191    static const uint64_t BROADCAST_UPDT_INDEX_MASK    = MULTI_INVAL_UPDT_INDEX_MASK;
192    static const uint8_t  BROADCAST_NLINE_SHIFT        = 0;
193    static const uint64_t BROADCAST_NLINE_MASK         = MULTI_INVAL_NLINE_MASK;
194
195    /*
196     * L1 cache to Memory Cache command types
197     */
198    enum
199    {
200      TYPE_MULTI_ACK    = 0,
201      TYPE_CLEANUP      = 2,
202      TYPE_CLEANUP_DATA = TYPE_CLEANUP,
203      TYPE_CLEANUP_INST = 3
204    };
205
206    /*
207     * Memory Cache to L1 cache command types
208     */
209    enum
210    {
211      TYPE_MULTI_UPDT       = 0,
212      TYPE_MULTI_UPDT_DATA  = TYPE_MULTI_UPDT,
213      TYPE_MULTI_UPDT_INST  = 1,
214      TYPE_MULTI_INVAL      = 2,
215      TYPE_MULTI_INVAL_DATA = TYPE_MULTI_INVAL,
216      TYPE_MULTI_INVAL_INST = 3,
217      TYPE_CLEANUP_ACK      = 4
218    };
219
220    enum flit_field_e
221    {
222      FROM_L1_TYPE,
223      FROM_L1_EOP,
224      FROM_L1_BC,
225
226      CLEANUP_DEST,
227      CLEANUP_SRCID,
228      CLEANUP_NLINE_MSB,
229      CLEANUP_WAY_INDEX,
230      CLEANUP_NLINE_LSB,
231
232      MULTI_ACK_DEST,
233      MULTI_ACK_UPDT_INDEX,
234
235      FROM_MC_TYPE,
236      FROM_MC_EOP,
237      FROM_MC_BC,
238
239      MULTI_INVAL_DEST,
240      MULTI_INVAL_SRCID,
241      MULTI_INVAL_UPDT_INDEX,
242      MULTI_INVAL_NLINE,
243
244      MULTI_UPDT_DEST,
245      MULTI_UPDT_SRCID,
246      MULTI_UPDT_UPDT_INDEX,
247      MULTI_UPDT_WORD_INDEX,
248      MULTI_UPDT_NLINE,
249      MULTI_UPDT_BE,
250      MULTI_UPDT_DATA,
251
252      CLEANUP_ACK_DEST,
253      CLEANUP_ACK_SET,
254      CLEANUP_ACK_WAY,
255
256      BROADCAST_BOX,
257      BROADCAST_SRCID,
258      BROADCAST_UPDT_INDEX,
259      BROADCAST_NLINE
260    };
261
262    static uint64_t dspin_get(uint64_t flit, flit_field_e field)
263    {
264      switch(field)
265      {
266        GET_FIELD(flit,FROM_L1_TYPE);
267        GET_FIELD(flit,FROM_L1_EOP);
268        GET_FIELD(flit,CLEANUP_DEST);
269        GET_FIELD(flit,CLEANUP_SRCID);
270        GET_FIELD(flit,CLEANUP_NLINE_MSB);
271        GET_FIELD(flit,CLEANUP_WAY_INDEX);
272        GET_FIELD(flit,CLEANUP_NLINE_LSB);
273        GET_FIELD(flit,MULTI_ACK_DEST);
274        GET_FIELD(flit,MULTI_ACK_UPDT_INDEX);
275        GET_FIELD(flit,FROM_MC_TYPE);
276        GET_FIELD(flit,FROM_MC_EOP);
277        GET_FIELD(flit,MULTI_INVAL_DEST);
278        GET_FIELD(flit,MULTI_INVAL_SRCID);
279        GET_FIELD(flit,MULTI_INVAL_UPDT_INDEX);
280        GET_FIELD(flit,MULTI_INVAL_NLINE);
281        GET_FIELD(flit,MULTI_UPDT_DEST);
282        GET_FIELD(flit,MULTI_UPDT_SRCID);
283        GET_FIELD(flit,MULTI_UPDT_UPDT_INDEX);
284        GET_FIELD(flit,MULTI_UPDT_WORD_INDEX);
285        GET_FIELD(flit,MULTI_UPDT_NLINE);
286        GET_FIELD(flit,MULTI_UPDT_BE);
287        GET_FIELD(flit,MULTI_UPDT_DATA);
288        GET_FIELD(flit,CLEANUP_ACK_DEST);
289        GET_FIELD(flit,CLEANUP_ACK_SET);
290        GET_FIELD(flit,CLEANUP_ACK_WAY);
291        GET_FIELD(flit,BROADCAST_BOX);
292        GET_FIELD(flit,BROADCAST_SRCID);
293        GET_FIELD(flit,BROADCAST_UPDT_INDEX);
294        GET_FIELD(flit,BROADCAST_NLINE);
295
296        default: assert(false && "Incorrect DHCCP DSPIN field");
297      }
298    }
299
300    static void dspin_set(uint64_t &flit, uint64_t value, flit_field_e field)
301    {
302      switch(field)
303      {
304        SET_FIELD(flit,value,FROM_L1_TYPE);
305        SET_FIELD(flit,value,FROM_L1_EOP);
306        SET_FIELD(flit,value,CLEANUP_DEST);
307        SET_FIELD(flit,value,CLEANUP_SRCID);
308        SET_FIELD(flit,value,CLEANUP_NLINE_MSB);
309        SET_FIELD(flit,value,CLEANUP_WAY_INDEX);
310        SET_FIELD(flit,value,CLEANUP_NLINE_LSB);
311        SET_FIELD(flit,value,MULTI_ACK_DEST);
312        SET_FIELD(flit,value,MULTI_ACK_UPDT_INDEX);
313        SET_FIELD(flit,value,FROM_MC_TYPE);
314        SET_FIELD(flit,value,FROM_MC_EOP);
315        SET_FIELD(flit,value,MULTI_INVAL_DEST);
316        SET_FIELD(flit,value,MULTI_INVAL_SRCID);
317        SET_FIELD(flit,value,MULTI_INVAL_UPDT_INDEX);
318        SET_FIELD(flit,value,MULTI_INVAL_NLINE);
319        SET_FIELD(flit,value,MULTI_UPDT_DEST);
320        SET_FIELD(flit,value,MULTI_UPDT_SRCID);
321        SET_FIELD(flit,value,MULTI_UPDT_UPDT_INDEX);
322        SET_FIELD(flit,value,MULTI_UPDT_WORD_INDEX);
323        SET_FIELD(flit,value,MULTI_UPDT_NLINE);
324        SET_FIELD(flit,value,MULTI_UPDT_BE);
325        SET_FIELD(flit,value,MULTI_UPDT_DATA);
326        SET_FIELD(flit,value,CLEANUP_ACK_DEST);
327        SET_FIELD(flit,value,CLEANUP_ACK_SET);
328        SET_FIELD(flit,value,CLEANUP_ACK_WAY);
329        SET_FIELD(flit,value,BROADCAST_BOX);
330        SET_FIELD(flit,value,BROADCAST_SRCID);
331        SET_FIELD(flit,value,BROADCAST_UPDT_INDEX);
332        SET_FIELD(flit,value,BROADCAST_NLINE);
333
334        default: assert(false && "Incorrect DHCCP DSPIN field");
335      }
336    }
337};
338
339#undef GET_FIELD
340#undef SET_FIELD
341
342}} // end namespace soclib::caba
343
344#endif
345// Local Variables:
346// tab-width: 2
347// c-basic-offset: 2
348// c-file-offsets:((innamespace . 0)(inline-open . 0))
349// indent-tabs-mode: nil
350// End:
351
352// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
Note: See TracBrowser for help on using the repository browser.