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

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

Updating width of the way index in DSPIN coherence flits.
Using 2 bits instead of 4.

Updating packet formats in comments of the dspin_dhccp_param
definition file.

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