source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/src/Parameters.cpp @ 146

Last change on this file since 146 was 146, checked in by rosiere, 13 years ago

1) Integration of RegisterFile_Internal_Banked in RegisterFile?
2) Erase "read_write" interface in RegisterFile_Monolithic component
3) Add smith predictor parameters in Load_store_pointer_unit.
4) Fix not statistics flags

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