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

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

Erasing useless template parameters for the communication/dspin_dhccp_param class.

Modifying consequently the vci_mem_cache_dspin_coherence class to use the
dspin_dhccp_param class without templates.

Introducing in the vci_mem_cache and the vci_mem_cache_dspin_coherence modules
the state CAS_DIR_HIT_COMPARE.

Before this modification, the comparison between the expected data and the actual
data was done directly in the CAS_DIR_HIT_READ state using the data obtained in the
same cycle from the cache.

Now, the data obtained from the cache is stored in a buffer and the next cycle,
in the CAS_DIR_HIT_COMPARE state, the comparison is made using the data from the
buffer.

This modifications allows to eliminate a critical path obtained in the ASIC
synthesis of the memory cache.

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