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

Last change on this file since 118 was 118, checked in by rosiere, 15 years ago

1) Stat List : scan all queue to find free register
2) Write_queue : test "genMealy" add bypass [0]
3) Functionnal_unit : add const parameters to add or not the pipeline_in
4) Load Store Unit : if load make an exception, free nb_check
5) Debug, change test to add model

  • Property svn:keywords set to Id
File size: 12.6 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Stat_List_unit_transition.cpp 118 2009-05-20 22:01:32Z 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  {
25    log_begin(Stat_List_unit,FUNCTION);
26    log_function(Stat_List_unit,FUNCTION,_name.c_str());
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          }
40        reg_GPR_PTR_FREE = 0;
41        reg_SPR_PTR_FREE = 0;
42      }
43    else
44      {
45        // =====================================================
46        // =====[ INSERT ]======================================
47        // =====================================================
48        for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
49          if (PORT_READ(in_INSERT_VAL[i]) and internal_INSERT_ACK[i])
50            {
51              log_printf(TRACE,Stat_List_unit,FUNCTION,"  * INSERT [%d]",i);
52             
53//            if (PORT_READ(in_INSERT_READ_RA [i]))
54//              {
55//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RA_PHY [i]);
56
57//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RA  - num_reg     : %d",num_reg);
58
59//                uint32_t bank = num_reg >> _param->_shift_gpr;
60//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
61//                gpr_stat_list [bank][reg].insert_read();
62//              }
63
64//            if (PORT_READ(in_INSERT_READ_RB [i]))
65//              {
66//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RB_PHY [i]);
67
68//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RB  - num_reg     : %d",num_reg);
69
70//                uint32_t bank = num_reg >> _param->_shift_gpr;
71//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
72//                gpr_stat_list [bank][reg].insert_read();
73//              }
74
75//            if (PORT_READ(in_INSERT_READ_RC [i]))
76//              {
77//                Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RC_PHY [i]);
78
79//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RC  - num_reg     : %d",num_reg);
80
81//                uint32_t bank = num_reg >> _param->_shift_spr;
82//                uint32_t reg  = num_reg  & _param->_mask_spr ;
83//                spr_stat_list [bank][reg].insert_read();
84//              }
85
86              if (PORT_READ(in_INSERT_WRITE_RD [i]))
87                {
88                  {
89                    Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RD_PHY_OLD [i]);
90                   
91                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - num_reg old : %d",num_reg);
92                   
93                    uint32_t bank = num_reg >> _param->_shift_gpr;
94                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
95                    gpr_stat_list [bank][reg].insert_write_old();
96                  }
97                  {
98                    Tgeneral_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RD_PHY_NEW [i]);
99                   
100                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - num_reg new : %d",num_reg);
101                   
102                    uint32_t bank = num_reg >> _param->_shift_gpr;
103                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
104                    gpr_stat_list [bank][reg].insert_write_new();
105                  }
106                }
107
108              if (PORT_READ(in_INSERT_WRITE_RE [i]))
109                {
110                  {
111                    Tspecial_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RE_PHY_OLD [i]);
112                   
113                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - num_reg old : %d",num_reg);
114                   
115                    uint32_t bank = num_reg >> _param->_shift_spr;
116                    uint32_t reg  = num_reg  & _param->_mask_spr ;
117                    spr_stat_list [bank][reg].insert_write_old();
118                  }
119                  {
120                    Tspecial_address_t num_reg = PORT_READ(in_INSERT_NUM_REG_RE_PHY_NEW [i]);
121                   
122                    log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - num_reg new : %d",num_reg);
123                   
124                    uint32_t bank = num_reg >> _param->_shift_spr;
125                    uint32_t reg  = num_reg  & _param->_mask_spr ;
126                    spr_stat_list [bank][reg].insert_write_new();
127                  }
128                }
129            }
130
131        // =====================================================
132        // =====[ RETIRE ]======================================
133        // =====================================================
134        for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
135          if (PORT_READ(in_RETIRE_VAL[i]) and internal_RETIRE_ACK[i])
136            {
137              log_printf(TRACE,Stat_List_unit,FUNCTION,"  * RETIRE [%d]",i);
138
139              Tcontrol_t restore = PORT_READ(in_RETIRE_RESTORE [i]);
140
141              log_printf(TRACE,Stat_List_unit,FUNCTION,"    * restore : %d",restore);
142
143//            if (PORT_READ(in_RETIRE_READ_RA [i]))
144//              {
145//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RA_PHY [i]);
146
147//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RA  - num_reg     : %d",num_reg);
148
149//                uint32_t bank = num_reg >> _param->_shift_gpr;
150//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
151//                gpr_stat_list [bank][reg].retire_read();
152//              }
153
154//            if (PORT_READ(in_RETIRE_READ_RB [i]))
155//              {
156//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RB_PHY [i]);
157
158//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RB  - num_reg     : %d",num_reg);
159
160//                uint32_t bank = num_reg >> _param->_shift_gpr;
161//                uint32_t reg  = num_reg  & _param->_mask_gpr ;
162//                gpr_stat_list [bank][reg].retire_read();
163//              }
164
165//            if (PORT_READ(in_RETIRE_READ_RC [i]))
166//              {
167//                Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RC_PHY [i]);
168
169//                   log_printf(TRACE,Stat_List_unit,FUNCTION,"    * READ_RC  - num_reg     : %d",num_reg);
170
171//                uint32_t bank = num_reg >> _param->_shift_spr;
172//                uint32_t reg  = num_reg  & _param->_mask_spr ;
173//                spr_stat_list [bank][reg].retire_read();
174//              }
175
176              if (PORT_READ(in_RETIRE_WRITE_RD [i]))
177                {
178                  Tcontrol_t restore_old = PORT_READ(in_RETIRE_RESTORE_RD_PHY_OLD [i]);
179
180                  log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RD - restore_old : %d",restore_old);
181
182                  {
183                    Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RD_PHY_OLD [i]);
184
185                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_old : %d",num_reg);
186                 
187                    uint32_t bank = num_reg >> _param->_shift_gpr;
188                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
189                    gpr_stat_list [bank][reg].retire_write_old(restore, restore_old);
190                  }
191                  {
192                    Tgeneral_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RD_PHY_NEW [i]);
193
194                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_new : %d",num_reg);
195
196                    uint32_t bank = num_reg >> _param->_shift_gpr;
197                    uint32_t reg  = num_reg  & _param->_mask_gpr ;
198                    gpr_stat_list [bank][reg].retire_write_new(restore, restore_old);
199                  }
200                }
201
202              if (PORT_READ(in_RETIRE_WRITE_RE [i]))
203                {
204                  Tcontrol_t restore_old = PORT_READ(in_RETIRE_RESTORE_RE_PHY_OLD [i]);
205
206                  log_printf(TRACE,Stat_List_unit,FUNCTION,"    * WRITE_RE - restore_old : %d",restore_old);
207
208                  {
209                    Tspecial_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RE_PHY_OLD [i]);
210
211                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_old : %d",num_reg);
212
213                    uint32_t bank = num_reg >> _param->_shift_spr;
214                    uint32_t reg  = num_reg  & _param->_mask_spr ;
215                    spr_stat_list [bank][reg].retire_write_old(restore, restore_old);
216                  }
217                  {
218                    Tspecial_address_t num_reg = PORT_READ(in_RETIRE_NUM_REG_RE_PHY_NEW [i]);
219
220                    log_printf(TRACE,Stat_List_unit,FUNCTION,"                 num_reg_new : %d",num_reg);
221
222                    uint32_t bank = num_reg >> _param->_shift_spr;
223                    uint32_t reg  = num_reg  & _param->_mask_spr ;
224                    spr_stat_list [bank][reg].retire_write_new(restore, restore_old);
225                  }
226                }
227            }
228
229        for (uint32_t i=0; i<_param->_nb_reg_free; i++)
230          {
231            // =====================================================
232            // =====[ PUSH_GPR ]====================================
233            // =====================================================
234            if (internal_PUSH_GPR_VAL [i] and PORT_READ(in_PUSH_GPR_ACK [i]))
235              gpr_stat_list[internal_PUSH_GPR_NUM_BANK [i]][internal_PUSH_GPR_NUM_REG [i]].free();
236           
237            // =====================================================
238            // =====[ PUSH_SPR ]====================================
239            // =====================================================
240            if (internal_PUSH_SPR_VAL [i] and PORT_READ(in_PUSH_SPR_ACK [i]))
241              spr_stat_list[internal_PUSH_SPR_NUM_BANK [i]][internal_PUSH_SPR_NUM_REG [i]].free();
242          }
243
244        // Update pointer
245        reg_GPR_PTR_FREE = ((reg_GPR_PTR_FREE==0)?_param->_nb_general_register_by_bank:reg_GPR_PTR_FREE)-1;
246        reg_SPR_PTR_FREE = ((reg_SPR_PTR_FREE==0)?_param->_nb_special_register_by_bank:reg_SPR_PTR_FREE)-1;
247      }
248
249
250#if (DEBUG >= DEBUG_TRACE)
251    {
252      log_printf(TRACE,Stat_List_unit,FUNCTION,"  * Dump Stat List");
253      log_printf(TRACE,Stat_List_unit,FUNCTION,"    * reg_GPR_PTR_FREE : %d",reg_GPR_PTR_FREE);
254      log_printf(TRACE,Stat_List_unit,FUNCTION,"    * reg_SPR_PTR_FREE : %d",reg_SPR_PTR_FREE);
255     
256      for (uint32_t i=0; i<_param->_nb_bank; i++)
257        for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
258          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * GPR[%.4d][%.5d] (%.5d) - free %.1d, link %.1d",
259                     i,
260                     j,
261                     (i<<_param->_shift_gpr)|j,
262                     gpr_stat_list[i][j]._is_free,
263                     gpr_stat_list[i][j]._is_link// ,
264//                      gpr_stat_list[i][j]._is_valid,
265//                      gpr_stat_list[i][j]._counter
266                     );
267      for (uint32_t i=0; i<_param->_nb_bank; i++)
268        for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
269          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * SPR[%.4d][%.5d] (%.5d) - free %.1d, link %.1d",
270                     i,
271                     j,
272                     (i<<_param->_shift_spr)|j,
273                     spr_stat_list[i][j]._is_free,
274                     spr_stat_list[i][j]._is_link// ,
275//                      spr_stat_list[i][j]._is_valid,
276//                      spr_stat_list[i][j]._counter
277                     );
278    }
279#endif
280
281#ifdef DEBUG_TEST
282# if 0
283    {
284      uint32_t size_rob   = 64;
285      uint32_t nb_context = 1;
286     
287      {
288        uint32_t nb_is_link = 0;
289        uint32_t nb_reg = 32;
290        for (uint32_t i=0; i<_param->_nb_bank; i++)
291          for (uint32_t j=0; j<_param->_nb_general_register_by_bank; j++)
292            if (gpr_stat_list[i][j]._is_link)
293              nb_is_link ++;
294       
295        log_printf(TRACE,Stat_List_unit,FUNCTION,"    * nb_GPR_IS_LINK   : %d",nb_is_link);
296       
297        if (nb_is_link > size_rob+nb_context*nb_reg)
298          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));
299      }
300     
301      {
302        uint32_t nb_is_link = 0;
303        uint32_t nb_reg = 2;
304        for (uint32_t i=0; i<_param->_nb_bank; i++)
305          for (uint32_t j=0; j<_param->_nb_special_register_by_bank; j++)
306            if (spr_stat_list[i][j]._is_link)
307              nb_is_link ++;
308       
309        log_printf(TRACE,Stat_List_unit,FUNCTION,"    * nb_SPR_IS_LINK   : %d",nb_is_link);
310       
311        if (nb_is_link > size_rob+nb_context*nb_reg)
312          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));
313      }
314    }
315# endif
316#endif
317               
318
319#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
320    end_cycle ();
321#endif
322
323    log_end(Stat_List_unit,FUNCTION);
324  };
325
326}; // end namespace stat_list_unit
327}; // end namespace register_translation_unit
328}; // end namespace rename_unit
329}; // end namespace ooo_engine
330}; // end namespace multi_ooo_engine
331}; // end namespace core
332
333}; // end namespace behavioural
334}; // end namespace morpheo             
335#endif
Note: See TracBrowser for help on using the repository browser.