source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/src/Parameters.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: 23.6 KB
Line 
1/*
2 * $Id: Parameters.cpp 139 2010-07-30 14:47:27Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/include/Parameters.h"
9#include "Common/include/Max.h"
10#include "Behavioural/include/Allocation.h"
11
12namespace morpheo {
13namespace behavioural {
14namespace core {
15namespace multi_ooo_engine {
16namespace ooo_engine {
17
18
19#undef  FUNCTION
20#define FUNCTION "OOO_Engine::Parameters"
21  Parameters::Parameters (uint32_t              nb_front_end                     ,
22                          uint32_t            * nb_context                       ,//[nb_front_end]
23                          uint32_t              nb_rename_unit                   ,
24                          uint32_t              nb_execute_loop                  ,
25                          uint32_t            * nb_inst_decod                    ,//[nb_front_end]
26                          uint32_t            * nb_inst_insert                   ,//[nb_rename_unit]
27                          uint32_t            * nb_inst_retire                   ,//[nb_rename_unit]
28//                        uint32_t              nb_inst_issue                    ,
29                          uint32_t            * nb_inst_execute                  ,//[nb_execute_loop]
30                          uint32_t              nb_inst_reexecute                ,
31                          uint32_t              nb_inst_commit                   ,
32                          uint32_t              nb_inst_branch_complete          ,
33                          uint32_t           ** nb_branch_speculated             ,//[nb_front_end][nb_context]
34                          uint32_t              size_nb_inst_decod               ,
35                          uint32_t              nb_rename_unit_select            ,
36                          uint32_t              nb_execute_loop_select           ,
37                          uint32_t              size_general_data                ,
38                          uint32_t              size_special_data                ,
39                          uint32_t            * link_rename_unit_with_front_end  ,//[nb_front_end]
40                          // Commit
41                          uint32_t              size_re_order_buffer             ,
42                          uint32_t              nb_re_order_buffer_bank          ,
43                          commit_unit::Tretire_ooo_scheme_t
44                                                retire_ooo_scheme                ,
45                          Tpriority_t           commit_priority                  ,
46                          Tload_balancing_t     commit_load_balancing            ,
47                          // Issue
48                          uint32_t              size_issue_queue                 ,
49                          issue_queue::Tissue_queue_scheme_t
50                                                issue_queue_scheme               ,
51                          uint32_t              nb_issue_queue_bank              ,
52                          Tpriority_t           issue_priority                   ,
53                          Tload_balancing_t     issue_load_balancing             ,
54//                           bool               ** table_routing                    ,//[nb_rename_unit][nb_inst_issue]
55//                           bool               ** table_issue_type                 ,//[nb_inst_issue][nb_type]
56                          // Reexecute
57                          uint32_t              size_reexecute_queue             ,
58                          // Rename_unit
59                          Tpriority_t         * rename_select_priority           ,//[nb_rename_unit]
60                          Tload_balancing_t   * rename_select_load_balancing     ,//[nb_rename_unit]
61                          uint32_t            * rename_select_nb_front_end_select,//[nb_rename_unit]
62                          uint32_t            * nb_general_register              ,//[nb_rename_unit]
63                          uint32_t            * nb_special_register              ,//[nb_rename_unit]
64                          Trat_scheme_t       * rat_scheme                       ,//[nb_rename_unit]
65                          uint32_t            * nb_reg_free                      ,//[nb_rename_unit]
66                          uint32_t            * nb_rename_unit_bank              ,//[nb_rename_unit]
67//                        uint32_t            * size_read_counter                ,//[nb_rename_unit]
68                          uint32_t            * nb_load_store_queue              ,//[nb_rename_unit]
69                          uint32_t           ** size_store_queue                 ,//[nb_rename_unit][nb_load_store_queue]
70                          uint32_t           ** size_load_queue                  ,//[nb_rename_unit][nb_load_store_queue]
71                          uint32_t           ** nb_inst_memory                   ,//[nb_rename_unit][nb_load_store_queue]
72                          uint32_t           ** link_load_store_unit_with_thread ,//[nb_front_end][nb_context]
73                          // SPR
74                          bool              *** implement_group                  ,//[nb_front_end][nb_context][NB_GROUP]
75                          // Others
76                          uint32_t              nb_thread                          ,
77                          uint32_t           ** translate_num_context_to_num_thread, //[nb_front_end][nb_context]
78
79                          bool                  is_toplevel
80                          )
81  {
82    log_begin(OOO_Engine,FUNCTION);
83
84    _nb_front_end                      = nb_front_end                     ;
85    _nb_context                        = nb_context                       ;
86    _nb_rename_unit                    = nb_rename_unit                   ;
87    _nb_execute_loop                   = nb_execute_loop                  ;
88    _nb_inst_decod                     = nb_inst_decod                    ;
89    _nb_inst_insert                    = nb_inst_insert                   ;
90    _nb_inst_retire                    = nb_inst_retire                   ;
91//  _nb_inst_issue                     = nb_inst_issue                    ;
92    _nb_inst_execute                   = nb_inst_execute                  ;
93    _nb_inst_reexecute                 = nb_inst_reexecute                ;
94    _nb_inst_commit                    = nb_inst_commit                   ;
95    _nb_inst_branch_complete           = nb_inst_branch_complete          ;
96    _nb_branch_speculated              = nb_branch_speculated             ;
97    _nb_rename_unit_select             = nb_rename_unit_select            ;
98    _nb_execute_loop_select            = nb_execute_loop_select           ;
99//  _size_general_data                 = size_general_data                ;
100//  _size_special_data                 = size_special_data                ;
101    _link_rename_unit_with_front_end   = link_rename_unit_with_front_end  ;
102    _size_re_order_buffer              = size_re_order_buffer             ;
103    _nb_re_order_buffer_bank           = nb_re_order_buffer_bank          ;
104    _retire_ooo_scheme                 = retire_ooo_scheme                ;
105    _commit_priority                   = commit_priority                  ;
106    _commit_load_balancing             = commit_load_balancing            ;
107    _size_issue_queue                  = size_issue_queue                 ;
108    _issue_queue_scheme                = issue_queue_scheme               ;
109    _nb_issue_queue_bank               = nb_issue_queue_bank              ;
110    _issue_priority                    = issue_priority                   ;
111    _issue_load_balancing              = issue_load_balancing             ;
112//  _table_routing                     = table_routing                    ;
113//  _table_issue_type                  = table_issue_type                 ;
114    _size_reexecute_queue              = size_reexecute_queue             ;
115    _rename_select_priority            = rename_select_priority           ;
116    _rename_select_load_balancing      = rename_select_load_balancing     ;
117    _rename_select_nb_front_end_select = rename_select_nb_front_end_select;
118    _nb_general_register               = nb_general_register              ;
119    _nb_special_register               = nb_special_register              ;
120    _rat_scheme                        = rat_scheme                       ;
121    _nb_reg_free                       = nb_reg_free                      ;
122    _nb_rename_unit_bank               = nb_rename_unit_bank              ;
123//  _size_read_counter                 = size_read_counter                ;
124    _nb_load_store_queue               = nb_load_store_queue              ;
125    _size_store_queue                  = size_store_queue                 ;
126    _size_load_queue                   = size_load_queue                  ;
127    _nb_inst_memory                    = nb_inst_memory                   ;
128    _link_load_store_unit_with_thread  = link_load_store_unit_with_thread ;
129    _implement_group                   = implement_group                  ;
130
131    _nb_thread                           = nb_thread                          ;
132    _translate_num_context_to_num_thread = translate_num_context_to_num_thread;
133
134    test();
135
136    log_printf(TRACE,OOO_Engine,FUNCTION,"  * link_front_end_with_rename_unit");
137    _link_front_end_with_rename_unit = new std::vector<uint32_t> [_nb_rename_unit];
138    for (uint32_t i=0; i<_nb_front_end; i++)
139      {
140        uint32_t num_rename_unit = _link_rename_unit_with_front_end[i];
141
142        log_printf(TRACE,OOO_Engine,FUNCTION,"    front_end %d is link with rename_unit %d with id %d",i,num_rename_unit,_link_front_end_with_rename_unit[num_rename_unit].size());
143
144        _link_front_end_with_rename_unit[num_rename_unit].push_back(i);
145      }
146    _rename_unit_size_front_end_id                = new uint32_t    [_nb_rename_unit];
147    _rename_unit_size_context_id                  = new uint32_t    [_nb_rename_unit];
148    _rename_unit_nb_front_end                     = new uint32_t    [_nb_rename_unit];
149    _rename_unit_nb_context                       = new uint32_t *  [_nb_rename_unit];
150    _rename_unit_nb_inst_decod                    = new uint32_t *  [_nb_rename_unit];
151    _rename_unit_link_load_store_unit_with_thread = new uint32_t ** [_nb_rename_unit];
152    _rename_unit_nb_branch_speculated             = new uint32_t ** [_nb_rename_unit];
153   
154    for (uint32_t i=0; i<_nb_rename_unit; i++)
155      {
156        uint32_t x = _link_front_end_with_rename_unit[i].size(); // number of linked front_end
157
158        _rename_unit_nb_front_end                     [i] = x;
159        _rename_unit_nb_context                       [i] = new uint32_t   [x];
160        _rename_unit_nb_inst_decod                    [i] = new uint32_t   [x];
161        _rename_unit_link_load_store_unit_with_thread [i] = new uint32_t * [x];
162        _rename_unit_nb_branch_speculated             [i] = new uint32_t * [x];
163
164        // Scan front_end list
165        std::vector<uint32_t>::iterator it=_link_front_end_with_rename_unit[i].begin();
166        for (uint32_t j=0; j<x; j++)
167          {
168            _rename_unit_nb_context    [i][j] = _nb_context    [*it];
169            _rename_unit_nb_inst_decod [i][j] = _nb_inst_decod [*it];
170            _rename_unit_link_load_store_unit_with_thread [i][j] = new uint32_t [_nb_context [*it]];
171            _rename_unit_nb_branch_speculated             [i][j] = new uint32_t [_nb_context [*it]];
172
173            for (uint32_t k=0; k<_nb_context [*it]; k++)
174              {
175                _rename_unit_link_load_store_unit_with_thread [i][j][k] = _link_load_store_unit_with_thread [*it][k];
176                _rename_unit_nb_branch_speculated             [i][j][k] = _nb_branch_speculated             [*it][k];
177              }
178
179            ++it;           
180          }
181
182        _rename_unit_size_front_end_id                [i] = log2(_rename_unit_nb_front_end [i]);
183        _rename_unit_size_context_id                  [i] = log2(max<uint32_t>(_rename_unit_nb_context [i], _rename_unit_nb_front_end [i]));
184      }
185
186    for (uint32_t i=0; i<_nb_rename_unit; i++)
187      {
188        log_printf(TRACE,OOO_Engine,FUNCTION,"  * Rename_unit [%d]",i);
189        log_printf(TRACE,OOO_Engine,FUNCTION,"    * front_end : %d",_rename_unit_nb_front_end[i]);
190       
191        for (uint32_t j=0; j<_rename_unit_nb_front_end[i]; j++)
192          {
193            log_printf(TRACE,OOO_Engine,FUNCTION,"      * [%d] nb_context : %d, nb_inst_decod : %d",j,_rename_unit_nb_context[i][j],_rename_unit_nb_inst_decod[i][j]);
194
195            for (uint32_t k=0; k<_rename_unit_nb_context[i][j]; ++k)
196              log_printf(TRACE,OOO_Engine,FUNCTION,"        * [%d][%d] link_lsq : %d",j,k,_rename_unit_link_load_store_unit_with_thread[i][j][k]);
197          }
198      }
199
200    ALLOC1(_commit_unit_rat_scheme,Trat_scheme_t,_nb_front_end);
201
202    for (uint32_t num_front_end=0; num_front_end<_nb_front_end; ++num_front_end)
203      _commit_unit_rat_scheme [num_front_end] = rat_scheme [_link_rename_unit_with_front_end [num_front_end]];
204
205    _max_nb_context                = max<uint32_t>(_nb_context,_nb_front_end);
206    _max_branch_speculated         = max<uint32_t>(_nb_branch_speculated,_nb_front_end,_nb_context);
207    _size_rename_id                = log2(_nb_rename_unit);
208//  _size_max_depth                = log2(_max_branch_speculated);
209    uint32_t size_front_end_id     = log2(_nb_front_end);
210    uint32_t size_context_id       = log2(_max_nb_context);
211    uint32_t size_packet_id        = log2(nb_re_order_buffer_bank)+log2(size_re_order_buffer/nb_re_order_buffer_bank);
212    uint32_t size_general_register = log2(max<uint32_t>(_nb_general_register,_nb_rename_unit));
213    uint32_t size_special_register = log2(max<uint32_t>(_nb_special_register,_nb_rename_unit));
214    uint32_t size_store_queue_ptr  = log2(max<uint32_t>(_size_store_queue,_nb_rename_unit,_nb_load_store_queue));
215    uint32_t size_load_queue_ptr   = log2(max<uint32_t>(_size_load_queue ,_nb_rename_unit,_nb_load_store_queue));
216
217    _sum_inst_insert = 0;
218    _sum_inst_retire = 0;
219    for (uint32_t i=0; i<_nb_rename_unit; i++)
220      {
221        _sum_inst_insert += _nb_inst_insert [i];
222        _sum_inst_retire += _nb_inst_retire [i];
223
224        log_printf(TRACE,OOO_Engine,FUNCTION,"  * rename_unit [%d] - nb_inst_insert %d, nb_inst_retire %d", i,_nb_inst_insert [i],_nb_inst_retire [i]);
225      }
226   
227    log_printf(TRACE,OOO_Engine,FUNCTION,"  * sum_inst_insert %d, sum_inst_retire %d",_sum_inst_insert,_sum_inst_retire);
228
229//  _have_port_front_end_id            = _size_front_end_id   > 0;
230//  _have_port_context_id              = _size_context_id     > 0;
231//  _have_port_packet_id               = _size_packet_id      > 0;
232    _have_port_rename_id               = _size_rename_id      > 0;
233//  _have_port_load_queue_ptr          = _size_load_queue_ptr > 0;
234//  _have_port_max_depth               = _size_max_depth      > 0;
235//  _have_port_depth                   = _param_commit_unit->_have_port_depth;
236
237    _param_rename_unit           = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::rename_unit::Parameters * [_nb_rename_unit];
238    for (uint32_t i=0; i<_nb_rename_unit; i++)
239      _param_rename_unit [i] = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::rename_unit::Parameters
240      (
241       _rename_unit_nb_front_end                      [i],
242       _rename_unit_nb_context                        [i],
243       _rename_unit_nb_inst_decod                     [i],
244       _nb_inst_insert                                [i],
245       _nb_inst_retire                                [i],
246       _nb_load_store_queue                           [i],
247       _size_store_queue                              [i],
248       _size_load_queue                               [i],
249       _nb_inst_memory                                [i],
250       _rename_unit_link_load_store_unit_with_thread  [i],
251       _rename_select_priority                        [i],
252       _rename_select_load_balancing                  [i],
253       _rename_select_nb_front_end_select             [i],
254       _max_branch_speculated                            ,
255        size_general_data                                ,
256       _nb_general_register                           [i],
257       _nb_special_register                           [i],
258       _rat_scheme                                    [i],
259       _nb_reg_free                                   [i],
260       _nb_rename_unit_bank                           [i],
261//     _size_read_counter                             [i]
262       _rename_unit_nb_branch_speculated              [i]
263       );
264
265    _param_commit_unit           = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::Parameters 
266      (
267       _nb_front_end            ,
268       _nb_context              ,
269       _nb_rename_unit          ,
270       _size_re_order_buffer    ,
271       _nb_re_order_buffer_bank ,
272       _retire_ooo_scheme       ,
273       _nb_inst_insert          ,
274       _nb_inst_retire          ,
275       _nb_inst_commit          ,
276       _nb_inst_reexecute       ,
277       _nb_inst_branch_complete ,
278       _nb_branch_speculated    ,
279        size_nb_inst_decod      ,
280        size_general_data       ,
281        size_store_queue_ptr    ,
282        size_load_queue_ptr     ,
283        size_general_register   ,
284        size_special_register   ,
285       _commit_unit_rat_scheme  ,
286       _issue_priority          ,
287       _issue_load_balancing    ,
288       _nb_rename_unit_select   ,
289       _nb_thread               ,
290       _translate_num_context_to_num_thread
291       );
292
293
294    _param_issue_queue           = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Parameters 
295      (_max_nb_context          ,
296       _nb_front_end            ,
297       _nb_rename_unit          ,
298       _size_issue_queue        ,
299       _issue_queue_scheme      ,
300       _nb_issue_queue_bank     ,
301        size_packet_id          ,
302        size_general_data       ,
303        size_special_data       ,
304        size_general_register   ,//+_size_rename_id
305        size_special_register   ,//+_size_rename_id
306        size_store_queue_ptr    ,
307        size_load_queue_ptr     ,
308//     _nb_inst_issue           ,
309       _nb_inst_insert          ,
310       _nb_inst_reexecute       ,
311       _nb_rename_unit_select   ,
312       _issue_priority          ,
313       _issue_load_balancing    // ,
314//        _table_routing           ,
315//        _table_issue_type       
316       );
317
318    _nb_inst_issue = _param_issue_queue->_nb_inst_issue;
319
320    _param_reexecute_unit        = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::reexecute_unit::Parameters 
321      ( size_context_id         ,
322        size_front_end_id       ,
323        size_packet_id          ,
324       _size_reexecute_queue    ,
325       _nb_execute_loop         ,
326       _nb_inst_execute         ,
327       _nb_inst_commit          ,
328       _nb_inst_reexecute       ,
329       _nb_execute_loop_select  ,
330       _commit_priority         ,
331       _commit_load_balancing   ,
332        size_general_register   ,//+_size_rename_id
333        size_special_register   ,//+_size_rename_id
334        size_general_data       ,
335        size_special_data       ,
336        size_store_queue_ptr    ,
337        size_load_queue_ptr     
338       );   
339
340    _param_special_register_unit = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::special_register_unit::Parameters 
341      (
342       _nb_front_end          ,
343       _nb_context            ,
344       _nb_inst_reexecute     ,
345       _implement_group       ,
346       _translate_num_context_to_num_thread
347       );
348
349    _param_glue                  = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::ooo_engine_glue::Parameters 
350      (_nb_front_end                     ,
351       _nb_context                       ,
352       _nb_rename_unit                   ,
353       _nb_inst_decod                    ,
354       _nb_inst_insert                   ,
355       _nb_inst_retire                   ,
356        size_general_data                ,
357        size_special_data                ,
358       _link_rename_unit_with_front_end  ,
359       _link_front_end_with_rename_unit  ,
360        size_packet_id                   ,
361        size_general_register            ,
362        size_special_register            ,
363        size_store_queue_ptr             ,
364        size_load_queue_ptr             
365       );
366
367    if (is_toplevel)
368      {
369        _size_front_end_id                 = size_front_end_id;
370        _size_context_id                   = size_context_id  ;
371        _size_depth                        = log2(_max_branch_speculated);
372        _size_instruction_address          = size_general_data-2;
373        _size_general_data                 = size_general_data;
374        _size_special_data                 = size_special_data;
375        _size_general_register             = size_general_register;
376        _size_special_register             = size_special_register;
377        _size_store_queue_ptr              = size_store_queue_ptr ;
378        _size_load_queue_ptr               = size_load_queue_ptr  ;
379        _size_rob_ptr                      = size_packet_id;
380        _size_nb_inst_commit               = log2(size_re_order_buffer)+1;
381        _size_nb_inst_decod                = size_nb_inst_decod;
382
383        _have_port_front_end_id            = _size_front_end_id   > 0;
384        _have_port_context_id              = _size_context_id     > 0;
385        _have_port_rob_ptr                 = _size_rob_ptr        > 0;
386        _have_port_load_queue_ptr          = _size_load_queue_ptr > 0;
387        _have_port_depth                   = _size_depth          > 0;
388       
389        copy();
390      }
391
392
393    log_end(OOO_Engine,FUNCTION);
394  };
395 
396// #undef  FUNCTION
397// #define FUNCTION "OOO_Engine::Parameters (copy)"
398//   Parameters::Parameters (Parameters & param)
399//   {
400//     log_begin(OOO_Engine,FUNCTION);
401//     test();
402//     log_end(OOO_Engine,FUNCTION);
403//   };
404
405#undef  FUNCTION
406#define FUNCTION "OOO_Engine::~Parameters"
407  Parameters::~Parameters (void) 
408  {
409    log_begin(OOO_Engine,FUNCTION);
410
411    for (uint32_t i=0; i<_nb_rename_unit; i++)
412      {
413        for (uint32_t j=0; j<_nb_front_end; j++)
414          delete [] _rename_unit_nb_branch_speculated           [i][j];
415        delete [] _rename_unit_nb_branch_speculated             [i];
416        for (uint32_t j=0; j<_nb_front_end; j++)
417          delete [] _rename_unit_link_load_store_unit_with_thread [i][j];
418        delete [] _rename_unit_link_load_store_unit_with_thread [i];
419        delete [] _rename_unit_nb_inst_decod                    [i];
420        delete [] _rename_unit_nb_context                       [i];
421      }
422   
423    delete [] _rename_unit_nb_branch_speculated            ;
424    delete [] _rename_unit_link_load_store_unit_with_thread;
425    delete [] _rename_unit_nb_inst_decod                   ;
426    delete [] _rename_unit_nb_context                      ;
427    delete [] _rename_unit_nb_front_end                    ;
428    delete [] _rename_unit_size_front_end_id               ;
429    delete [] _rename_unit_size_context_id                 ;
430    delete [] _link_front_end_with_rename_unit             ;
431
432    DELETE1(_commit_unit_rat_scheme,_nb_front_end);
433
434    for (uint32_t i=0; i<_nb_rename_unit; i++)
435    delete    _param_rename_unit [i]      ;
436    delete [] _param_rename_unit          ;
437    delete    _param_commit_unit          ;
438    delete    _param_issue_queue          ;
439    delete    _param_reexecute_unit       ;   
440    delete    _param_special_register_unit;
441    delete    _param_glue                 ;
442   
443    log_end(OOO_Engine,FUNCTION);
444  };
445
446#undef  FUNCTION
447#define FUNCTION "OOO_Engine::copy"
448  void Parameters::copy (void) 
449  {
450    log_begin(OOO_Engine,FUNCTION);
451
452    for (uint32_t i=0; i<_nb_rename_unit; i++)
453    COPY(_param_rename_unit       [i]);
454    COPY(_param_commit_unit          );
455    COPY(_param_issue_queue          );
456    COPY(_param_reexecute_unit       );   
457    COPY(_param_special_register_unit);
458    COPY(_param_glue                 );
459   
460    log_end(OOO_Engine,FUNCTION);
461  };
462
463}; // end namespace ooo_engine
464}; // end namespace multi_ooo_engine
465}; // end namespace core
466
467}; // end namespace behavioural
468}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.