source: branches/wt_ideal/communication/dspin_wtidl_param/caba/source/include/dspin_wtidl_param.h @ 920

Last change on this file since 920 was 920, checked in by meunier, 9 years ago
  • Adding branch wt_ideal -- "ideal" write-through
File size: 18.2 KB
Line 
1/* -*- c++ -*-
2 * File         : dspin_wtidl_param.h
3 * Copyright    : UPMC / LIP6
4 *
5 * SOCLIB_LGPL_HEADER_BEGIN
6 *
7 * This file is part of SoCLib, GNU LGPLv2.1.
8 *
9 * SoCLib is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Lesser General Public License as published
11 * by the Free Software Foundation; version 2.1 of the License.
12 *
13 * SoCLib is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with SoCLib; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 *
23 * SOCLIB_LGPL_HEADER_END
24 */
25
26
27#ifndef DSPIN_WTIDL_PARAMS_H
28#define DSPIN_WTIDL_PARAMS_H
29
30#include <inttypes.h>
31#include <assert.h>
32
33namespace soclib { namespace caba {
34
35/*
36 * L1 cache to Memory Cache command packets
37 *
38 * CLEANUP
39 *
40 * flit 1
41 * --------------------------------------------------------------------------------------------------------
42 * EOP:0 |    DEST    |   SRCID   | NLINE MSB(2 bits)| CONTAINS_DATA | WAY_INDEX(2 bits) | TYPE:0b1X | BC:0
43 *       |  (10 bits) | (14 bits) |                  |               |                   |           |
44 * --------------------------------------------------------------------------------------------------------
45 *                                                                                 | X: 0 DATA  |
46 *                                                                                 |    1 INST  |
47 * flit 2
48 * ----------------------------------------------------------------------------------------------
49 * EOP:0/1 |                                                                       NLINE(32 bits)
50 * ----------------------------------------------------------------------------------------------
51 *
52 * flit N for data
53 * ----------------------------------------------------------------------------------------------
54 * EOP:0/1 |                                                                       WDATA(32 bits)
55 * ----------------------------------------------------------------------------------------------
56 *
57 * MULTICAST ACKNOWLEDGEMENT
58 *
59 * flit 1
60 * ----------------------------------------------------------------------------------------------
61 * EOP:1 |     DEST(10 bits)     |       X(15 bits)       | UPDT_INDEX(4 bits) | TYPE:0b00 | BC:0
62 * ----------------------------------------------------------------------------------------------
63 */
64
65/*
66 * M2P command packets
67 *
68 * MULTICAST UPDATE
69 *
70 * flit 1
71 * ----------------------------------------------------------------------------------------------
72 * EOP:0 | DEST(14 bits) | X(4 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b0X   | BC:0
73 * ----------------------------------------------------------------------------------------------
74 *                                                                           | X: 0 DATA   |
75 *                                                                           |    1 INST   |
76 * flit 2
77 * ----------------------------------------------------------------------------------------------
78 * EOP:0 | X | WORD_INDEX(4 bits)  |                                             NLINE (34 bits)
79 * ----------------------------------------------------------------------------------------------
80 *
81 * flit 3
82 * ----------------------------------------------------------------------------------------------
83 * EOP:0 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
84 * ----------------------------------------------------------------------------------------------
85 *
86 * flit N
87 * ----------------------------------------------------------------------------------------------
88 * EOP:1 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
89 * ----------------------------------------------------------------------------------------------
90 *
91 * MULTICAST INVALIDATE
92 *
93 * flit 1
94 * ------------------------------------------------------------------------------------------------------------------
95 * EOP:0 | DEST(14 bits) | X (3 bits) | IS_CONFIG (1 bit) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b1X  | BC:0
96 * ------------------------------------------------------------------------------------------------------------------
97 *                                                                                                | X: 0 DATA  |
98 *                                                                                                |    1 INST  |
99 * flit 2
100 * ----------------------------------------------------------------------------------------------
101 * EOP:1 | X(5 bits) |                                                           NLINE (34 bits)
102 * ----------------------------------------------------------------------------------------------
103 *
104 * BROADCAST INVALIDATE
105 *
106 * flit 1
107 *       | BOUNDING BOX(20 bits)            |
108 * ----------------------------------------------------------------------------------------------
109 * EOP:0 | XMIN   | XMAX   | YMIN   | YMAX  | MEMC_ID(14 bits) | NETWORK_RESERVED(4 bits) | BC:1
110 * ----------------------------------------------------------------------------------------------
111 *
112 * flit 2
113 * ----------------------------------------------------------------------------------------------
114 * EOP:1 |        X(5 bits)       |                                              NLINE (34 bits)
115 * ----------------------------------------------------------------------------------------------
116 *
117 * M2P clack commands
118 *
119 * CLEANUP ACKNOWLEDGEMENT
120 *
121 * flit 1
122 * ----------------------------------------------------------------------------------------------
123 * EOP:1 | DEST(14 bits) | X(5 bits) | SET_INDEX(16 bits) | WAY_INDEX(2 bits) | TYPE:0bX   | BC:0
124 * ----------------------------------------------------------------------------------------------
125 *                                                                            | X: 0 CLACK |
126 *                                                                            |      DATA  |
127 *                                                                            |    1 CLACK |
128 *                                                                            |      INST  |
129 *
130 */
131
132/*
133 * Utility MACROS
134 */
135#define GET_FIELD(x,y)\
136    case y: return ((x >> y##_SHIFT) & y##_MASK)
137
138#define SET_FIELD(x,y,z)\
139    case z: x |= ((y & z##_MASK) << z##_SHIFT);break
140
141class DspinWtidlParam
142{
143  public:
144
145    static const uint8_t  m2p_flit_width               = 40;
146    static const uint8_t  p2m_flit_width               = 33;
147    static const uint8_t  clack_flit_width             = 40;
148
149    static const uint8_t  UPDT_INDEX_WIDTH             = 4;
150    static const uint8_t  NLINE_WIDTH                  = 34;
151    static const uint8_t  SRCID_WIDTH                  = 14;
152    static const uint8_t  GLOBALID_WIDTH               = 10;
153    static const uint8_t  WORD_INDEX_WIDTH             = 4;
154    static const uint8_t  BE_WIDTH                     = 4;
155    static const uint8_t  DATA_WIDTH                   = 32;
156    static const uint8_t  SET_INDEX_WIDTH              = 6;
157    static const uint8_t  WAY_INDEX_WIDTH              = 2;
158    static const uint8_t  BROADCAST_BOX_WIDTH          = 20;
159    static const uint8_t  M2P_TYPE_WIDTH               = 2;
160    static const uint8_t  P2M_TYPE_WIDTH               = 2;
161    static const uint8_t  CLACK_TYPE_WIDTH             = 1;
162
163    static const uint8_t  P2M_TYPE_SHIFT               = 1;
164    static const uint64_t P2M_TYPE_MASK                = ((1ULL<<P2M_TYPE_WIDTH)-1);
165    static const uint8_t  P2M_EOP_SHIFT                = 32;
166    static const uint64_t P2M_EOP_MASK                 = 1;
167    static const uint8_t  P2M_BC_SHIFT                 = 0;
168    static const uint64_t P2M_BC_MASK                  = 1;
169
170    static const uint8_t  CLEANUP_DEST_SHIFT           = 22;
171    static const uint64_t CLEANUP_DEST_MASK            = ((1ULL<<GLOBALID_WIDTH)-1);
172    static const uint8_t  CLEANUP_SRCID_SHIFT          = 8;
173    static const uint64_t CLEANUP_SRCID_MASK           = ((1ULL<<SRCID_WIDTH)-1);
174    static const uint8_t  CLEANUP_NLINE_MSB_SHIFT      = 6;
175    static const uint64_t CLEANUP_NLINE_MSB_MASK       = ((1ULL<< 2)-1);
176    static const uint8_t  CLEANUP_WAY_INDEX_SHIFT      = 3;
177    static const uint64_t CLEANUP_WAY_INDEX_MASK       = ((1ULL<<WAY_INDEX_WIDTH)-1);
178    static const uint8_t  CLEANUP_NLINE_LSB_SHIFT      = 0;
179    static const uint64_t CLEANUP_NLINE_LSB_MASK       = ((1ULL<<32)-1);
180    static const uint8_t  CLEANUP_DATA_UPDT_SHIFT      = 0;
181    static const uint64_t CLEANUP_DATA_UPDT_MASK       = ((1ULL<<32)-1);
182    static const uint8_t  DATA_NO_SHARED_SHIFT         = 5;
183    static const uint64_t DATA_NO_SHARED_MASK          = 1;
184
185    static const uint8_t  MULTI_ACK_DEST_SHIFT         = CLEANUP_DEST_SHIFT;
186    static const uint64_t MULTI_ACK_DEST_MASK          = CLEANUP_DEST_MASK;
187    static const uint8_t  MULTI_ACK_UPDT_INDEX_SHIFT   = 3;
188    static const uint64_t MULTI_ACK_UPDT_INDEX_MASK    = ((1ULL<<UPDT_INDEX_WIDTH)-1);
189   
190    static const uint8_t  MULTI_ACK_UPDT_MISS_SHIFT    = 8;
191    static const uint64_t MULTI_ACK_UPDT_MISS_MASK     = 1;
192
193    static const uint8_t  M2P_TYPE_SHIFT               = 1;
194    static const uint64_t M2P_TYPE_MASK                = ((1ULL<<M2P_TYPE_WIDTH)-1);
195    static const uint8_t  M2P_EOP_SHIFT                = 39;
196    static const uint64_t M2P_EOP_MASK                 = 1;
197    static const uint8_t  M2P_BC_SHIFT                 = 0;
198    static const uint64_t M2P_BC_MASK                  = 1;
199
200    static const uint8_t  MULTI_INVAL_DEST_SHIFT       = 25;
201    static const uint64_t MULTI_INVAL_DEST_MASK        = ((1ULL<<SRCID_WIDTH)-1);
202    static const uint8_t  MULTI_INVAL_SRCID_SHIFT      = 7;
203    static const uint64_t MULTI_INVAL_SRCID_MASK       = ((1ULL<<SRCID_WIDTH)-1);
204    static const uint8_t  MULTI_INVAL_UPDT_INDEX_SHIFT = 3;
205    static const uint64_t MULTI_INVAL_UPDT_INDEX_MASK  = ((1ULL<<UPDT_INDEX_WIDTH)-1);
206    static const uint8_t  MULTI_INVAL_NLINE_SHIFT      = 0;
207    static const uint64_t MULTI_INVAL_NLINE_MASK       = ((1ULL<<NLINE_WIDTH)-1);
208    static const uint8_t  MULTI_INVAL_IS_CONFIG_SHIFT  = 21;
209    static const uint64_t MULTI_INVAL_IS_CONFIG_MASK   = 1;
210    static const uint8_t  BRDCAST_IS_CONFIG_SHIFT      = 1;
211    static const uint64_t BRDCAST_IS_CONFIG_MASK       = 1;
212 
213    static const uint8_t  MULTI_INVAL_IS_SHARED_SHIFT  = 22;
214    static const uint64_t MULTI_INVAL_IS_SHARED_MASK   = 1;
215    static const uint8_t  BRDCAST_IS_SHARED_SHIFT      = 2;
216    static const uint64_t BRDCAST_IS_SHARED_MASK       = 1;
217
218    static const uint8_t  MULTI_UPDT_DEST_SHIFT        = MULTI_INVAL_DEST_SHIFT;
219    static const uint64_t MULTI_UPDT_DEST_MASK         = MULTI_INVAL_DEST_MASK;
220    static const uint8_t  MULTI_UPDT_SRCID_SHIFT       = MULTI_INVAL_SRCID_SHIFT;
221    static const uint64_t MULTI_UPDT_SRCID_MASK        = MULTI_INVAL_SRCID_MASK;
222    static const uint8_t  CC_UPDT_IVT_INDEX_SHIFT  = MULTI_INVAL_UPDT_INDEX_SHIFT;
223    static const uint64_t CC_UPDT_IVT_INDEX_MASK   = MULTI_INVAL_UPDT_INDEX_MASK;
224    static const uint8_t  MULTI_UPDT_WORD_INDEX_SHIFT  = 34;
225    static const uint64_t MULTI_UPDT_WORD_INDEX_MASK   = ((1ULL<<WORD_INDEX_WIDTH)-1);
226    static const uint8_t  MULTI_UPDT_NLINE_SHIFT       = MULTI_INVAL_NLINE_SHIFT;
227    static const uint64_t MULTI_UPDT_NLINE_MASK        = MULTI_INVAL_NLINE_MASK;
228    static const uint8_t  MULTI_UPDT_BE_SHIFT          = 32;
229    static const uint64_t MULTI_UPDT_BE_MASK           = ((1ULL<<BE_WIDTH)-1);
230    static const uint8_t  MULTI_UPDT_DATA_SHIFT        = 0;
231    static const uint64_t MULTI_UPDT_DATA_MASK         = ((1ULL<<DATA_WIDTH)-1);
232
233    static const uint8_t  BROADCAST_BOX_SHIFT          = 19;
234    static const uint64_t BROADCAST_BOX_MASK           = ((1ULL<<BROADCAST_BOX_WIDTH)-1);
235    static const uint8_t  BROADCAST_SRCID_SHIFT        = 5;
236    static const uint64_t BROADCAST_SRCID_MASK         = MULTI_INVAL_SRCID_MASK;
237    static const uint8_t  BROADCAST_NLINE_SHIFT        = 0;
238    static const uint64_t BROADCAST_NLINE_MASK         = MULTI_INVAL_NLINE_MASK;
239
240    static const uint8_t  CLACK_TYPE_SHIFT             = 1;
241    static const uint64_t CLACK_TYPE_MASK              = ((1ULL<<CLACK_TYPE_WIDTH)-1);
242    static const uint8_t  CLACK_EOP_SHIFT              = 39;
243    static const uint64_t CLACK_EOP_MASK               = 1;
244    static const uint8_t  CLACK_BC_SHIFT               = 0;
245    static const uint64_t CLACK_BC_MASK                = 1;
246    static const uint8_t  CLACK_DEST_SHIFT             = 25;
247    static const uint64_t CLACK_DEST_MASK              = ((1ULL<<SRCID_WIDTH)-1);
248    static const uint8_t  CLACK_SET_SHIFT              = 4;
249    static const uint64_t CLACK_SET_MASK               = ((1ULL<<SET_INDEX_WIDTH)-1);
250    static const uint8_t  CLACK_WAY_SHIFT              = 2;
251    static const uint64_t CLACK_WAY_MASK               = ((1ULL<<WAY_INDEX_WIDTH)-1);
252
253    /*
254     * P2M command types
255     */
256    enum
257    {
258      TYPE_MULTI_ACK        = 0,
259      TYPE_CLEANUP_DATA     = 2,
260      TYPE_CLEANUP_INST     = 3
261    };
262
263    /*
264     * M2P command types
265     */
266    enum
267    {
268      TYPE_MULTI_UPDT       = 0,
269      TYPE_MULTI_UPDT_DATA  = TYPE_MULTI_UPDT,
270      TYPE_MULTI_UPDT_INST  = 1,
271      TYPE_MULTI_INVAL      = 2,
272      TYPE_MULTI_INVAL_DATA = TYPE_MULTI_INVAL,
273      TYPE_MULTI_INVAL_INST = 3
274    };
275
276    /*
277     * CLACK command types
278     */
279    enum
280    {
281      TYPE_CLACK      = 0,
282      TYPE_CLACK_DATA = TYPE_CLACK,
283      TYPE_CLACK_INST = 1
284    };
285
286    enum flit_field_e
287    {
288      P2M_TYPE,
289      P2M_EOP,
290      P2M_BC,
291
292      CLEANUP_DEST,
293      CLEANUP_SRCID,
294      CLEANUP_NLINE_MSB,
295      CLEANUP_WAY_INDEX,
296      CLEANUP_NLINE_LSB,
297      CLEANUP_DATA_UPDT,
298      DATA_NO_SHARED,
299
300      MULTI_ACK_DEST,
301      MULTI_ACK_UPDT_INDEX,
302      MULTI_ACK_UPDT_MISS,
303
304      M2P_TYPE,
305      M2P_EOP,
306      M2P_BC,
307
308      MULTI_INVAL_DEST,
309      MULTI_INVAL_SRCID,
310      MULTI_INVAL_UPDT_INDEX,
311      MULTI_INVAL_NLINE,
312      MULTI_INVAL_IS_CONFIG,
313      BRDCAST_IS_CONFIG,
314      MULTI_INVAL_IS_SHARED,
315      BRDCAST_IS_SHARED,
316
317      MULTI_UPDT_DEST,
318      MULTI_UPDT_SRCID,
319      CC_UPDT_IVT_INDEX,
320      MULTI_UPDT_WORD_INDEX,
321      MULTI_UPDT_NLINE,
322      MULTI_UPDT_BE,
323      MULTI_UPDT_DATA,
324
325      CLACK_TYPE,
326
327      CLACK_DEST,
328      CLACK_SET,
329      CLACK_WAY,
330
331      BROADCAST_BOX,
332      BROADCAST_SRCID,
333      BROADCAST_NLINE
334    };
335
336    static uint64_t dspin_get(uint64_t flit, flit_field_e field)
337    {
338      switch(field)
339      {
340        GET_FIELD(flit,P2M_TYPE);
341        GET_FIELD(flit,P2M_EOP);
342        GET_FIELD(flit,P2M_BC);
343        GET_FIELD(flit,CLEANUP_DEST);
344        GET_FIELD(flit,CLEANUP_SRCID);
345        GET_FIELD(flit,CLEANUP_NLINE_MSB);
346        GET_FIELD(flit,CLEANUP_WAY_INDEX);
347        GET_FIELD(flit,CLEANUP_NLINE_LSB);
348        GET_FIELD(flit,CLEANUP_DATA_UPDT);
349        GET_FIELD(flit,DATA_NO_SHARED);
350        GET_FIELD(flit,MULTI_ACK_DEST);
351        GET_FIELD(flit,MULTI_ACK_UPDT_INDEX);
352        GET_FIELD(flit,MULTI_ACK_UPDT_MISS);
353        GET_FIELD(flit,M2P_TYPE);
354        GET_FIELD(flit,M2P_EOP);
355        GET_FIELD(flit,M2P_BC);
356        GET_FIELD(flit,MULTI_INVAL_DEST);
357        GET_FIELD(flit,MULTI_INVAL_SRCID);
358        GET_FIELD(flit,MULTI_INVAL_UPDT_INDEX);
359        GET_FIELD(flit,MULTI_INVAL_NLINE);
360        GET_FIELD(flit,MULTI_INVAL_IS_CONFIG);
361        GET_FIELD(flit,BRDCAST_IS_CONFIG);
362        GET_FIELD(flit,MULTI_INVAL_IS_SHARED);
363        GET_FIELD(flit,BRDCAST_IS_SHARED);
364        GET_FIELD(flit,MULTI_UPDT_DEST);
365        GET_FIELD(flit,MULTI_UPDT_SRCID);
366        GET_FIELD(flit,CC_UPDT_IVT_INDEX);
367        GET_FIELD(flit,MULTI_UPDT_WORD_INDEX);
368        GET_FIELD(flit,MULTI_UPDT_NLINE);
369        GET_FIELD(flit,MULTI_UPDT_BE);
370        GET_FIELD(flit,MULTI_UPDT_DATA);
371        GET_FIELD(flit,CLACK_TYPE);
372        GET_FIELD(flit,CLACK_DEST);
373        GET_FIELD(flit,CLACK_SET);
374        GET_FIELD(flit,CLACK_WAY);
375        GET_FIELD(flit,BROADCAST_BOX);
376        GET_FIELD(flit,BROADCAST_SRCID);
377        GET_FIELD(flit,BROADCAST_NLINE);
378
379        default: assert(false && "Incorrect DHCCP DSPIN field");
380      }
381    }
382
383    static void dspin_set(uint64_t &flit, uint64_t value, flit_field_e field)
384    {
385      switch(field)
386      {
387        SET_FIELD(flit,value,P2M_TYPE);
388        SET_FIELD(flit,value,P2M_EOP);
389        SET_FIELD(flit,value,P2M_BC);
390        SET_FIELD(flit,value,CLEANUP_DEST);
391        SET_FIELD(flit,value,CLEANUP_SRCID);
392        SET_FIELD(flit,value,CLEANUP_NLINE_MSB);
393        SET_FIELD(flit,value,CLEANUP_WAY_INDEX);
394        SET_FIELD(flit,value,CLEANUP_NLINE_LSB);
395        SET_FIELD(flit,value,CLEANUP_DATA_UPDT);
396        SET_FIELD(flit,value,DATA_NO_SHARED);
397        SET_FIELD(flit,value,MULTI_ACK_DEST);
398        SET_FIELD(flit,value,MULTI_ACK_UPDT_INDEX);
399        SET_FIELD(flit,value,MULTI_ACK_UPDT_MISS);
400        SET_FIELD(flit,value,M2P_TYPE);
401        SET_FIELD(flit,value,M2P_EOP);
402        SET_FIELD(flit,value,M2P_BC);
403        SET_FIELD(flit,value,MULTI_INVAL_DEST);
404        SET_FIELD(flit,value,MULTI_INVAL_SRCID);
405        SET_FIELD(flit,value,MULTI_INVAL_UPDT_INDEX);
406        SET_FIELD(flit,value,MULTI_INVAL_NLINE);
407        SET_FIELD(flit,value,MULTI_INVAL_IS_CONFIG);
408        SET_FIELD(flit,value,BRDCAST_IS_CONFIG);
409        SET_FIELD(flit,value,MULTI_INVAL_IS_SHARED);
410        SET_FIELD(flit,value,BRDCAST_IS_SHARED);
411        SET_FIELD(flit,value,MULTI_UPDT_DEST);
412        SET_FIELD(flit,value,MULTI_UPDT_SRCID);
413        SET_FIELD(flit,value,CC_UPDT_IVT_INDEX);
414        SET_FIELD(flit,value,MULTI_UPDT_WORD_INDEX);
415        SET_FIELD(flit,value,MULTI_UPDT_NLINE);
416        SET_FIELD(flit,value,MULTI_UPDT_BE);
417        SET_FIELD(flit,value,MULTI_UPDT_DATA);
418        SET_FIELD(flit,value,CLACK_TYPE);
419        SET_FIELD(flit,value,CLACK_DEST);
420        SET_FIELD(flit,value,CLACK_SET);
421        SET_FIELD(flit,value,CLACK_WAY);
422        SET_FIELD(flit,value,BROADCAST_BOX);
423        SET_FIELD(flit,value,BROADCAST_SRCID);
424        SET_FIELD(flit,value,BROADCAST_NLINE);
425
426        default: assert(false && "Incorrect DHCCP DSPIN field");
427      }
428    }
429};
430
431#undef GET_FIELD
432#undef SET_FIELD
433
434}} // end namespace soclib::caba
435
436#endif
437// Local Variables:
438// tab-width: 2
439// c-basic-offset: 2
440// c-file-offsets:((innamespace . 0)(inline-open . 0))
441// indent-tabs-mode: nil
442// End:
443
444// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
Note: See TracBrowser for help on using the repository browser.