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 @ 139

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