source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Stat_List_unit/src/Stat_List_unit_transition.cpp @ 145

Last change on this file since 145 was 145, checked in by rosiere, 14 years ago

1) add test with SPECINT2K
2) new config of Selftest
3) modif RAT to support multiple depth_save ... but not finish (need fix Update Prediction Table)
4) add Function_pointer but need fix

  • Property svn:keywords set to Id
File size: 18.7 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Stat_List_unit_transition.cpp 145 2010-10-13 18:15:51Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Stat_List_unit/include/Stat_List_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace rename_unit {
17namespace register_translation_unit {
18namespace stat_list_unit {
19
20 
21#if (DEBUG >= DEBUG_TRACE)
22# define dump_stat_list                                                 \
23  do                                                                    \
24    {                                                                   \
25      log_printf(TRACE,Stat_List_unit,FUNCTION,"  * Dump Stat List");   \
26      log_printf(TRACE,Stat_List_unit,FUNCTION,"    * reg_GPR_PTR_FREE : %d",reg_GPR_PTR_FREE); \
27      log_printf(TRACE,Stat_List_unit,FUNCTION,"    * reg_SPR_PTR_FREE : %d",reg_SPR_PTR_FREE); \
28                                                                        \
29      for (uint32_t i=0; i<_param->_nb_bank; i++)                       \
30        for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++) \
31          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * GPR[%.4d][%.5d] (%.5d) - free %.1d, link %.1d, use %.1d", \
32                     i,                                                 \
33                     j,                                                 \
34                     (i<<_param->_shift_gpr)|j,                         \
35                     gpr_stat_list[i][j]._is_free,                      \
36                     gpr_stat_list[i][j]._is_link,                      \
37                     gpr_stat_list[i][j]._is_use                        \
38                     );                                                 \
39      for (uint32_t i=0; i<_param->_nb_bank; i++)                       \
40        for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++) \
41          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * SPR[%.4d][%.5d] (%.5d) - free %.1d, link %.1d, use %.1d", \
42                     i,                                                 \
43                     j,                                                 \
44                     (i<<_param->_shift_spr)|j,                         \
45                     spr_stat_list[i][j]._is_free,                      \
46                     spr_stat_list[i][j]._is_link,                      \
47                     spr_stat_list[i][j]._is_use                        \
48                     );                                                 \
49    }                                                                   \
50  while (0)
51#else
52# define dump_stat_list
53#endif
54
55
56#undef  FUNCTION
57#define FUNCTION "Stat_List_unit::transition"
58  void Stat_List_unit::transition (void)
59  {
60    log_begin(Stat_List_unit,FUNCTION);
61    log_function(Stat_List_unit,FUNCTION,_name.c_str());
62
63    if (PORT_READ(in_NRESET) == 0)
64      {
65        uint32_t gpr = 0;
66        uint32_t spr = 0;
67       
68        for (uint32_t i=0; i<_param->_nb_bank; i++)
69          {
70            for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
71              gpr_stat_list [i][j].reset((gpr++)<_param->_nb_gpr_use_init);
72            for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
73              spr_stat_list [i][j].reset((spr++)<_param->_nb_spr_use_init);
74          }
75        reg_GPR_PTR_FREE = 0;
76        reg_SPR_PTR_FREE = 0;
77      }
78    else
79      {
80#ifdef DEBUG_TEST
81        {
82          uint32_t free_list_nb_gpr_free     = PORT_READ(in_INFO_NB_GPR_FREE);
83          uint32_t free_list_nb_spr_free     = PORT_READ(in_INFO_NB_SPR_FREE);
84          uint32_t stat_list_nb_gpr_free     = 0;
85          uint32_t stat_list_nb_spr_free     = 0;
86          uint32_t stat_list_nb_gpr_can_free = 0;
87          uint32_t stat_list_nb_spr_can_free = 0;
88          uint32_t stat_list_nb_gpr_link     = 0;
89          uint32_t stat_list_nb_spr_link     = 0;
90          uint32_t stat_list_nb_gpr_use      = 0;
91          uint32_t stat_list_nb_spr_use      = 0;
92
93          for (uint32_t i=0; i<_param->_nb_bank; i++)
94            {
95              for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
96                {
97                  if (gpr_stat_list [i][j]._is_free)
98                    stat_list_nb_gpr_free ++;
99                  if (gpr_stat_list [i][j]._is_link)
100                    stat_list_nb_gpr_link ++;
101                  if (gpr_stat_list [i][j]._is_use)
102                    stat_list_nb_gpr_use ++;
103                  if (gpr_stat_list [i][j].can_free())
104                    stat_list_nb_gpr_can_free ++;
105                }
106              for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
107                {
108                  if (spr_stat_list [i][j]._is_free)
109                    stat_list_nb_spr_free ++;
110                  if (spr_stat_list [i][j]._is_link)
111                    stat_list_nb_spr_link ++;
112                  if (spr_stat_list [i][j]._is_use)
113                    stat_list_nb_spr_use ++;
114                  if (spr_stat_list [i][j].can_free())
115                    stat_list_nb_spr_can_free ++;
116                }
117            }
118
119          uint32_t  nb_gpr_free = stat_list_nb_gpr_free+stat_list_nb_gpr_can_free;
120          uint32_t  nb_spr_free = stat_list_nb_spr_free+stat_list_nb_spr_can_free;
121          uint32_t _nb_gpr_free = (_param->_nb_general_register - _param->_nb_gpr_use_init); 
122          uint32_t _nb_spr_free = (_param->_nb_special_register - _param->_nb_spr_use_init); 
123          uint32_t  nb_gpr_link = stat_list_nb_gpr_link - _param->_nb_gpr_use_init;
124          uint32_t  nb_spr_link = stat_list_nb_spr_link - _param->_nb_spr_use_init;
125          uint32_t  nb_gpr_use  = stat_list_nb_gpr_use - _param->_nb_gpr_use_init;
126          uint32_t  nb_spr_use  = stat_list_nb_spr_use - _param->_nb_spr_use_init;
127
128          log_printf(TRACE,Stat_List_unit,FUNCTION,"  * nb_gpr_free : stat_list %d - free_list %d - free %d, link %d (%d), use %d (%d)",stat_list_nb_gpr_free,free_list_nb_gpr_free,nb_gpr_free,nb_gpr_link,stat_list_nb_gpr_link,nb_gpr_use,stat_list_nb_gpr_use);
129          log_printf(TRACE,Stat_List_unit,FUNCTION,"  * nb_spr_free : stat_list %d - free_list %d - free %d, link %d (%d), use %d (%d)",stat_list_nb_spr_free,free_list_nb_spr_free,nb_spr_free,nb_spr_link,stat_list_nb_spr_link,nb_spr_use,stat_list_nb_spr_use);
130
131          bool error_nb_gpr_free     = (free_list_nb_gpr_free != stat_list_nb_gpr_free);
132          bool error_nb_spr_free     = (free_list_nb_spr_free != stat_list_nb_spr_free);
133          bool error_rob_nb_gpr_free = (PORT_READ(in_INFO_ROB_EMPTY) and (nb_gpr_free != _nb_gpr_free));
134          bool error_rob_nb_spr_free = (PORT_READ(in_INFO_ROB_EMPTY) and (nb_spr_free != _nb_spr_free));
135
136          std::string list_gpr_not_free;
137          std::string list_spr_not_free;
138
139
140          if (error_nb_gpr_free or
141              error_rob_nb_gpr_free)
142            for (uint32_t i=0; i<_param->_nb_bank; i++)
143              for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
144                if (not (gpr_stat_list [i][j]._is_free or gpr_stat_list [i][j].can_free()))
145                  list_gpr_not_free+=toString((i<<_param->_shift_gpr)|j)+" ";   
146
147          if (error_nb_spr_free or
148              error_rob_nb_spr_free)
149            for (uint32_t i=0; i<_param->_nb_bank; i++)
150              for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
151                if (not (spr_stat_list [i][j]._is_free or spr_stat_list [i][j].can_free()))
152                  list_spr_not_free+=toString((i<<_param->_shift_spr)|j)+" ";   
153
154          if (error_nb_gpr_free     or
155              error_nb_spr_free     or
156              error_rob_nb_gpr_free or
157              error_rob_nb_spr_free)
158            dump_stat_list;
159
160          if (error_nb_gpr_free)
161            throw ERRORMORPHEO(FUNCTION,toString(_("Number of free general register is not valid. %d in Stat_List and %d in Free_list. (GPR not free : %s)\n"),stat_list_nb_gpr_free,free_list_nb_gpr_free,list_gpr_not_free.c_str()));
162          if (error_nb_spr_free)
163            throw ERRORMORPHEO(FUNCTION,toString(_("Number of free general register is not valid. %d in Stat_List and %d in Free_list. (SPR not free : %s)\n"),stat_list_nb_spr_free,free_list_nb_spr_free,list_spr_not_free.c_str()));
164          if (error_rob_nb_gpr_free)
165            throw ERRORMORPHEO(FUNCTION,toString(_("Rob is empty but they have %d general registers free or can_free and must be %d registers. (GPR not free : %s)"),nb_gpr_free,_nb_gpr_free,list_gpr_not_free.c_str()));
166
167          if (error_rob_nb_spr_free)
168            throw ERRORMORPHEO(FUNCTION,toString(_("Rob is empty but they have %d special registers free or can_free and must be %d registers. (SPR not free : %s)"),nb_spr_free,_nb_spr_free,list_gpr_not_free.c_str()));
169        }
170#endif
171
172        // =====================================================
173        // =====[ INSERT ]======================================
174        // =====================================================
175        for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
176          if (PORT_READ(in_INSERT_VAL[i]) and internal_INSERT_ACK[i])
177            {
178              log_printf(TRACE,Stat_List_unit,FUNCTION,"  * INSERT [%d]",i);
179             
180//            if (PORT_READ(in_INSERT_READ_RA [i]))
181//              {
182//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RA_PHY [i]);
183
184//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RA  - num_reg     : %d",num_reg);
185
186//                uint32_t bank = num_reg >> _param->_shift_gpr;
187//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
188//                gpr_stat_list [bank][reg].insert_read();
189//              }
190
191//            if (PORT_READ(in_INSERT_READ_RB [i]))
192//              {
193//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RB_PHY [i]);
194
195//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RB  - num_reg     : %d",num_reg);
196
197//                uint32_t bank = num_reg >> _param->_shift_gpr;
198//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
199//                gpr_stat_list [bank][reg].insert_read();
200//              }
201
202//            if (PORT_READ(in_INSERT_READ_RC [i]))
203//              {
204//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RC_PHY [i]);
205
206//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RC  - num_reg     : %d",num_reg);
207
208//                uint32_t bank = num_reg >> _param->_shift_spr;
209//                uint32_t reg  = num_reg  & _param->_mask_spr ;
210//                spr_stat_list [bank][reg].insert_read();
211//              }
212
213              if (PORT_READ(in_INSERT_WRITE_RD [i]))
214                {
215                  {
216                    Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RD_PHY_OLD [i]);
217                   
218                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - num_reg old : %d",num_reg);
219                   
220                    uint32_t bank = num_reg >> _param->_shift_gpr;
221                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
222                    gpr_stat_list [bank][reg].insert_write_old();
223                  }
224                  {
225                    Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RD_PHY_NEW [i]);
226                   
227                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - num_reg new : %d",num_reg);
228                   
229                    uint32_t bank = num_reg >> _param->_shift_gpr;
230                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
231                    gpr_stat_list [bank][reg].insert_write_new();
232                  }
233                }
234
235              if (PORT_READ(in_INSERT_WRITE_RE [i]))
236                {
237                  {
238                    Tspecial_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RE_PHY_OLD [i]);
239                   
240                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - num_reg old : %d",num_reg);
241                   
242                    uint32_t bank = num_reg >> _param->_shift_spr;
243                    uint32_t reg  = num_reg  & _param->_mask_spr ;
244                    spr_stat_list [bank][reg].insert_write_old();
245                  }
246                  {
247                    Tspecial_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RE_PHY_NEW [i]);
248                   
249                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - num_reg new : %d",num_reg);
250                   
251                    uint32_t bank = num_reg >> _param->_shift_spr;
252                    uint32_t reg  = num_reg  & _param->_mask_spr ;
253                    spr_stat_list [bank][reg].insert_write_new();
254                  }
255                }
256            }
257
258        // =====================================================
259        // =====[ RETIRE ]======================================
260        // =====================================================
261        for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
262          if (PORT_READ(in_RETIRE_VAL[i]) and internal_RETIRE_ACK[i])
263            {
264              log_printf(TRACE,Stat_List_unit,FUNCTION,"  * RETIRE [%d]",i);
265
266              Tcontrol_t restore = PORT_READ(in_RETIRE_RESTORE [i]);
267
268              log_printf(TRACE,Stat_List_unit,FUNCTION,"    * restore : %d",restore);
269
270//            if (PORT_READ(in_RETIRE_READ_RA [i]))
271//              {
272//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RA_PHY [i]);
273
274//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RA  - num_reg     : %d",num_reg);
275
276//                uint32_t bank = num_reg >> _param->_shift_gpr;
277//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
278//                gpr_stat_list [bank][reg].retire_read();
279//              }
280
281//            if (PORT_READ(in_RETIRE_READ_RB [i]))
282//              {
283//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RB_PHY [i]);
284
285//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RB  - num_reg     : %d",num_reg);
286
287//                uint32_t bank = num_reg >> _param->_shift_gpr;
288//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
289//                gpr_stat_list [bank][reg].retire_read();
290//              }
291
292//            if (PORT_READ(in_RETIRE_READ_RC [i]))
293//              {
294//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RC_PHY [i]);
295
296//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RC  - num_reg     : %d",num_reg);
297
298//                uint32_t bank = num_reg >> _param->_shift_spr;
299//                uint32_t reg  = num_reg  & _param->_mask_spr ;
300//                spr_stat_list [bank][reg].retire_read();
301//              }
302
303              if (PORT_READ(in_RETIRE_WRITE_RD [i]))
304                {
305                  Tcontrol_t restore_old = PORT_READ(in_RETIRE_RESTORE_RD_PHY_OLD [i]);
306
307                  log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - restore_old : %d",restore_old);
308
309                  {
310                    Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RD_PHY_OLD [i]);
311
312                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_old : %d",num_reg);
313                 
314                    uint32_t bank = num_reg >> _param->_shift_gpr;
315                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
316                    gpr_stat_list [bank][reg].retire_write_old(restore, restore_old);
317                  }
318                  {
319                    Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RD_PHY_NEW [i]);
320
321                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_new : %d",num_reg);
322
323                    uint32_t bank = num_reg >> _param->_shift_gpr;
324                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
325                    gpr_stat_list [bank][reg].retire_write_new(restore, restore_old);
326                  }
327                }
328
329              if (PORT_READ(in_RETIRE_WRITE_RE [i]))
330                {
331                  Tcontrol_t restore_old = PORT_READ(in_RETIRE_RESTORE_RE_PHY_OLD [i]);
332
333                  log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - restore_old : %d",restore_old);
334
335                  {
336                    Tspecial_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RE_PHY_OLD [i]);
337
338                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_old : %d",num_reg);
339
340                    uint32_t bank = num_reg >> _param->_shift_spr;
341                    uint32_t reg  = num_reg  & _param->_mask_spr ;
342                    spr_stat_list [bank][reg].retire_write_old(restore, restore_old);
343                  }
344                  {
345                    Tspecial_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RE_PHY_NEW [i]);
346
347                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_new : %d",num_reg);
348
349                    uint32_t bank = num_reg >> _param->_shift_spr;
350                    uint32_t reg  = num_reg  & _param->_mask_spr ;
351                    spr_stat_list [bank][reg].retire_write_new(restore, restore_old);
352                  }
353                }
354            }
355
356        for (uint32_t i=0; i<_param->_nb_reg_free; i++)
357          {
358            // =====================================================
359            // =====[ PUSH_GPR ]====================================
360            // =====================================================
361            if (internal_PUSH_GPR_VAL [i] and PORT_READ(in_PUSH_GPR_ACK [i]))
362              gpr_stat_list[internal_PUSH_GPR_NUM_BANK [i]][internal_PUSH_GPR_NUM_REG [i]].free();
363           
364            // =====================================================
365            // =====[ PUSH_SPR ]====================================
366            // =====================================================
367            if (internal_PUSH_SPR_VAL [i] and PORT_READ(in_PUSH_SPR_ACK [i]))
368              spr_stat_list[internal_PUSH_SPR_NUM_BANK [i]][internal_PUSH_SPR_NUM_REG [i]].free();
369          }
370
371        // Update pointer
372        reg_GPR_PTR_FREE = ((reg_GPR_PTR_FREE==0)?_param->_nb_general_register_by_bank:reg_GPR_PTR_FREE)-1;
373        reg_SPR_PTR_FREE = ((reg_SPR_PTR_FREE==0)?_param->_nb_special_register_by_bank:reg_SPR_PTR_FREE)-1;
374      }
375
376
377    dump_stat_list;
378
379
380#ifdef DEBUG_TEST
381# if 0
382    {
383      uint32_t size_rob   = 64;
384      uint32_t nb_context = 1;
385     
386      {
387        uint32_t nb_is_link = 0;
388        uint32_t nb_reg = 32;
389        for (uint32_t i=0; i<_param->_nb_bank; i++)
390          for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
391            if (gpr_stat_list[i][j]._is_link)
392              nb_is_link ++;
393       
394        log_printf(TRACE,Stat_List_unit,FUNCTION,"    * nb_GPR_IS_LINK   : %d",nb_is_link);
395       
396        if (nb_is_link > size_rob+nb_context*nb_reg)
397          throw ERRORMORPHEO(FUNCTION,toString(_("They are %d linked gpr register, but max is size_rob+nb_context*%d = %d+%d*%d = %d"),nb_is_link,nb_reg,size_rob,nb_context,nb_reg,size_rob+nb_context*nb_reg));
398      }
399     
400      {
401        uint32_t nb_is_link = 0;
402        uint32_t nb_reg = 2;
403        for (uint32_t i=0; i<_param->_nb_bank; i++)
404          for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
405            if (spr_stat_list[i][j]._is_link)
406              nb_is_link ++;
407       
408        log_printf(TRACE,Stat_List_unit,FUNCTION,"    * nb_SPR_IS_LINK   : %d",nb_is_link);
409       
410        if (nb_is_link > size_rob+nb_context*nb_reg)
411          throw ERRORMORPHEO(FUNCTION,toString(_("They are %d linked spr register, but max is size_rob+nb_context*%d = %d+%d*%d = %d"),nb_is_link,nb_reg,size_rob,nb_context,nb_reg,size_rob+nb_context*nb_reg));
412      }
413    }
414# endif
415#endif
416               
417
418#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
419    end_cycle ();
420#endif
421
422    log_end(Stat_List_unit,FUNCTION);
423  };
424
425}; // end namespace stat_list_unit
426}; // end namespace register_translation_unit
427}; // end namespace rename_unit
428}; // end namespace ooo_engine
429}; // end namespace multi_ooo_engine
430}; // end namespace core
431
432}; // end namespace behavioural
433}; // end namespace morpheo             
434#endif
Note: See TracBrowser for help on using the repository browser.