source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/src/Parameters.cpp @ 111

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

1) Decod_queue : multi implementation (one_fifo, multi_fifo)
2) Issue_queue : multi implementation (in_order, out_of_order)
3) Direction : Add Meta predictor
4) Context_State : re add Branch_complete, More priority to Load miss (is not speculative)
5) Return_Address_Stack : update reg_PREDICT pointer on decod miss prediction
6) UPT : Fix bug in multi event
7) Prediction_glue : in read_stack case, insert in UPT pc_next
8) Rename select : when rob have an event (need flush), read_r{a,b,c} and write_r{d,e} is set at 0

  • Property svn:keywords set to Id
File size: 16.8 KB
Line 
1/*
2 * $Id: Parameters.cpp 111 2009-02-27 18:37:40Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_Front_end/Front_end/include/Parameters.h"
9#include "Common/include/Max.h"
10
11namespace morpheo {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16
17
18#undef  FUNCTION
19#define FUNCTION "Front_end::Parameters"
20  Parameters::Parameters (uint32_t                nb_context                          ,
21                          uint32_t                nb_decod_unit                       ,
22                          uint32_t                size_general_data                   ,
23                          morpheo::behavioural::custom::custom_information_t (*get_custom_information) (void),
24                          // ifetch_unit                                             
25                          uint32_t              * size_ifetch_queue                   ,
26                          uint32_t              * nb_inst_fetch                       ,
27                          bool                 ** instruction_implemeted              ,
28                          uint32_t              * link_context_to_decod_unit          ,
29                          // decod_unit                                             
30                          uint32_t              * size_decod_queue                    ,//[nb_decod_unit]
31                          decod_unit::decod_queue::Tdecod_queue_scheme_t
32                                                * decod_queue_scheme                  ,//[nb_decod_unit]
33                          uint32_t              * nb_inst_decod                       ,//[nb_decod_unit]
34                          uint32_t              * nb_context_select                   ,//[nb_decod_unit]
35                          Tpriority_t           * context_select_priority             ,//[nb_decod_unit]
36                          Tload_balancing_t     * context_select_load_balancing       ,//[nb_decod_unit]
37                          // prediction_unit                                                 
38                          uint32_t                nb_inst_branch_predict              ,
39                          uint32_t                nb_inst_branch_decod                ,
40                          uint32_t                nb_inst_branch_update               ,
41                          uint32_t                nb_inst_branch_complete             ,
42                          uint32_t                btb_size_queue                      ,
43                          uint32_t                btb_associativity                   ,
44                          uint32_t                btb_size_counter                    ,
45                          Tvictim_t               btb_victim_scheme                   ,
46                          Tpredictor_t            dir_predictor_scheme                ,
47                          bool                  * dir_have_bht                        ,//[3]
48                          uint32_t              * dir_bht_size_shifter                ,//[3]
49                          uint32_t              * dir_bht_nb_shifter                  ,//[3]
50                          bool                  * dir_have_pht                        ,//[3]
51                          uint32_t              * dir_pht_size_counter                ,//[3]
52                          uint32_t              * dir_pht_nb_counter                  ,//[3]
53                          uint32_t              * dir_pht_size_address_share          ,//[3]
54                          uint32_t              * ras_size_queue                      ,
55                          uint32_t              * upt_size_queue                      ,
56                          uint32_t              * ufpt_size_queue                     ,
57                          // context_state                                           
58                          uint32_t                size_nb_inst_commit                 ,
59
60                          uint32_t                nb_thread                           ,
61                          uint32_t              * translate_num_context_to_num_thread ,//[nb_context]                   
62
63                          bool                    is_toplevel):
64    morpheo::behavioural::Parameters()
65  {
66    log_begin(Front_end,FUNCTION);
67
68    _nb_context                          = nb_context                          ;
69    _nb_decod_unit                       = nb_decod_unit                       ;
70//  _size_general_data                   = size_general_data                   ;
71    _get_custom_information              = get_custom_information              ;
72    _nb_thread                           = nb_thread                           ;
73    _translate_num_context_to_num_thread = translate_num_context_to_num_thread ;
74    _size_ifetch_queue                   = size_ifetch_queue                   ;
75    _nb_inst_fetch                       = nb_inst_fetch                       ;
76    _instruction_implemeted              = instruction_implemeted              ;
77    _link_context_to_decod_unit          = link_context_to_decod_unit          ;
78    _size_decod_queue                    = size_decod_queue                    ;
79    _decod_queue_scheme                  = decod_queue_scheme                  ;
80    _nb_inst_decod                       = nb_inst_decod                       ;
81    _nb_context_select                   = nb_context_select                   ;
82    _context_select_priority             = context_select_priority             ;
83    _context_select_load_balancing       = context_select_load_balancing       ;
84    _nb_inst_branch_predict              = nb_inst_branch_predict              ;
85    _nb_inst_branch_decod                = nb_inst_branch_decod                ;
86    _nb_inst_branch_update               = nb_inst_branch_update               ;
87    _nb_inst_branch_complete             = nb_inst_branch_complete             ;
88    _btb_size_queue                      = btb_size_queue                      ;
89    _btb_associativity                   = btb_associativity                   ;
90    _btb_size_counter                    = btb_size_counter                    ;
91    _btb_victim_scheme                   = btb_victim_scheme                   ;
92    _dir_predictor_scheme                = dir_predictor_scheme                ;
93    for (uint32_t i=0; i<3; i++)
94      {
95        _dir_have_bht               [i] = dir_have_bht               [i];
96        _dir_bht_size_shifter       [i] = dir_bht_size_shifter       [i];
97        _dir_bht_nb_shifter         [i] = dir_bht_nb_shifter         [i];
98        _dir_have_pht               [i] = dir_have_pht               [i];
99        _dir_pht_size_counter       [i] = dir_pht_size_counter       [i];
100        _dir_pht_nb_counter         [i] = dir_pht_nb_counter         [i];
101        _dir_pht_size_address_share [i] = dir_pht_size_address_share [i];
102      }
103    _ras_size_queue                      = ras_size_queue                      ;
104    _upt_size_queue                      = upt_size_queue                      ;
105    _ufpt_size_queue                     = ufpt_size_queue                     ;
106
107    test();
108
109//  _size_context_id                     = log2(_nb_context);
110    uint32_t size_instruction_address   = size_general_data - 2;
111
112    _array_size_depth                   = new uint32_t [_nb_context];
113    for (uint32_t i=0; i<_nb_context; i++)
114      _array_size_depth [i] = log2(_upt_size_queue[i]);
115   
116    _array_size_nb_inst_decod = new uint32_t [_nb_decod_unit];
117    for (uint32_t i=0; i<_nb_decod_unit; i++)
118      _array_size_nb_inst_decod [i] = log2(_size_decod_queue[i]+1);
119
120    uint32_t size_nb_inst_decod         = max<uint32_t>(_array_size_nb_inst_decod,_nb_decod_unit);
121
122    _param_ifetch_unit = new behavioural::core::multi_front_end::front_end::ifetch_unit::Parameters * [_nb_context];
123    for (uint32_t i=0; i<_nb_context; ++i)
124      {
125        _param_ifetch_unit [i] = new behavioural::core::multi_front_end::front_end::ifetch_unit::Parameters
126          (_size_ifetch_queue [i]        ,
127           _nb_inst_fetch     [i]        ,
128           log2(_upt_size_queue[i])      ,
129           size_instruction_address      );
130      }
131
132    _param_prediction_unit = new behavioural::core::multi_front_end::front_end::prediction_unit::Parameters
133      (_nb_context                         ,
134       _nb_decod_unit                      ,
135       size_instruction_address            ,
136       _nb_inst_fetch                      ,
137       _nb_inst_decod                      ,
138       _nb_inst_branch_predict             ,
139       _nb_inst_branch_decod               ,
140       _nb_inst_branch_update              ,
141       _nb_inst_branch_complete            ,
142       _btb_size_queue                     ,
143       _btb_associativity                  ,
144       _btb_size_counter                   ,
145       _btb_victim_scheme                  ,
146       _dir_predictor_scheme               ,
147       _dir_have_bht                       ,
148       _dir_bht_size_shifter               ,
149       _dir_bht_nb_shifter                 ,
150       _dir_have_pht                       ,
151       _dir_pht_size_counter               ,
152       _dir_pht_nb_counter                 ,
153       _dir_pht_size_address_share         ,
154       _ras_size_queue                     ,
155       _upt_size_queue                     ,
156       _ufpt_size_queue                    ,
157       _nb_thread                          ,
158       _translate_num_context_to_num_thread
159       );
160
161    _translate_context_id_from_decod_unit= new std::vector<uint32_t> [_nb_decod_unit];
162
163    for (uint32_t i=0; i<_nb_context; ++i)
164      _translate_context_id_from_decod_unit [_link_context_to_decod_unit[i]].push_back(i);
165
166    _decod_unit_nb_context               = new uint32_t    [_nb_decod_unit];
167    _decod_unit_nb_inst_fetch            = new uint32_t *  [_nb_decod_unit];
168    _decod_unit_nb_branch_speculated     = new uint32_t *  [_nb_decod_unit];
169//     _decod_unit_depth                    = new uint32_t *  [_nb_decod_unit];
170    _decod_unit_instruction_implemeted   = new bool     ** [_nb_decod_unit];
171//     _have_port_decod_unit_context_id     = new bool        [_nb_decod_unit];
172    _sum_inst_decod                      = 0;
173   
174    for (uint32_t i=0; i<_nb_decod_unit; ++i)
175      {
176        _sum_inst_decod += _nb_inst_decod [i];
177
178        uint32_t size = _translate_context_id_from_decod_unit [i].size();
179
180        _decod_unit_nb_context             [i] = size;
181        _decod_unit_nb_inst_fetch          [i] = new uint32_t   [size];
182//         _decod_unit_depth                  [i] = new uint32_t   [size];
183        _decod_unit_nb_branch_speculated   [i] = new uint32_t   [size];
184        _decod_unit_instruction_implemeted [i] = new bool     * [size];
185//         _have_port_decod_unit_context_id   [i] = size > 0;
186
187        for (uint32_t j=0; j<size; ++j)
188          {
189            uint32_t x = _translate_context_id_from_decod_unit[i][j];
190
191            _decod_unit_nb_inst_fetch          [i][j] = _nb_inst_fetch  [x];
192            _decod_unit_nb_branch_speculated   [i][j] = _upt_size_queue [x];
193//             _decod_unit_depth                  [i][j] = log2(_upt_size_queue[x]);
194            _decod_unit_instruction_implemeted [i][j] = new bool [NB_INSTRUCTION];
195
196            for (uint32_t k=0; k<NB_INSTRUCTION; ++k)
197              _decod_unit_instruction_implemeted [i][j][k] = _instruction_implemeted [x][k];
198          }
199      }
200
201    log_printf(TRACE,Front_end,FUNCTION,_("Translate"));
202    for (uint32_t i=0; i<_nb_decod_unit; ++i)
203      {
204        uint32_t size = _decod_unit_nb_context [i];
205        log_printf(TRACE,Front_end,FUNCTION,_("Decod_unit [%d], nb_decod_unit_context : %d"),i,size);
206
207        for (uint32_t j=0; j<size; ++j)
208          {
209            log_printf(TRACE,Front_end,FUNCTION,_("  Context [%d] -> Decod_unit_Context [%d]"),j,(_translate_context_id_from_decod_unit [i])[j]);
210            log_printf(TRACE,Front_end,FUNCTION,_("    * decod_unit_nb_inst_fetch        : %d"),_decod_unit_nb_inst_fetch       [i][j]);
211            log_printf(TRACE,Front_end,FUNCTION,_("    * decod_unit_nb_branch_speculated : %d"),_decod_unit_nb_branch_speculated[i][j]);
212          }
213      }
214
215    _param_decod_unit = new behavioural::core::multi_front_end::front_end::decod_unit::Parameters * [_nb_decod_unit];
216    for (uint32_t i=0; i<_nb_decod_unit; ++i)
217      {
218        _param_decod_unit [i] = new behavioural::core::multi_front_end::front_end::decod_unit::Parameters
219          (_decod_unit_nb_context             [i],
220           _decod_unit_nb_inst_fetch          [i],
221           _nb_inst_decod                     [i],
222           _size_decod_queue                  [i],
223           _decod_queue_scheme                [i],
224            size_general_data                    ,
225           _decod_unit_nb_branch_speculated   [i],
226//         _decod_unit_depth                  [i],
227           _nb_context_select                 [i],
228           _context_select_priority           [i],
229           _context_select_load_balancing     [i],
230           _decod_unit_instruction_implemeted [i],
231           _get_custom_information               );
232      }
233
234    _param_context_state = new behavioural::core::multi_front_end::front_end::context_state::Parameters
235      (_nb_context,
236       _nb_decod_unit,
237       _nb_inst_branch_complete,
238       _upt_size_queue,               
239        size_instruction_address,
240       _array_size_nb_inst_decod,           
241        size_nb_inst_commit,         
242       _link_context_to_decod_unit);
243
244    _param_glue = new behavioural::core::multi_front_end::front_end::front_end_glue::Parameters
245      (_nb_context                           ,
246       _nb_decod_unit                        ,
247       _nb_inst_decod                        ,
248       _nb_inst_branch_complete              ,
249       _link_context_to_decod_unit           ,
250       _translate_context_id_from_decod_unit ,
251       size_instruction_address              ,
252       _array_size_depth                     ,
253       _upt_size_queue                       ,//_nb_branch_speculated
254       size_nb_inst_decod
255       );
256
257    if (is_toplevel)
258      {
259        _size_context_id            = log2(_nb_context);
260        _size_instruction_address   = size_instruction_address;
261        _size_general_data          = size_general_data;
262        _size_nb_inst_decod         = size_nb_inst_decod;
263        _size_nb_inst_commit        = size_nb_inst_commit;
264        _size_depth                 = max<uint32_t>(_array_size_depth,_nb_context);
265        _size_ifetch_queue_ptr      = log2(max<uint32_t>(_size_ifetch_queue,_nb_context));
266        _size_inst_ifetch_ptr       = log2(max<uint32_t>(_nb_inst_fetch    ,_nb_context));
267       
268        _have_port_context_id       = _size_context_id      > 0;
269        _have_port_depth            = _size_depth           > 0;
270        _have_port_ifetch_queue_ptr = _size_ifetch_queue_ptr> 0;
271        _have_port_inst_ifetch_ptr  = _size_inst_ifetch_ptr > 0;
272
273        copy ();
274      }
275
276    log_end(Front_end,FUNCTION);
277  };
278 
279// #undef  FUNCTION
280// #define FUNCTION "Front_end::Parameters (copy)"
281//   Parameters::Parameters (Parameters & param)
282//   {
283//     log_begin(Front_end,FUNCTION);
284//     test();
285//     log_end(Front_end,FUNCTION);
286//   };
287
288#undef  FUNCTION
289#define FUNCTION "Front_end::~Parameters"
290  Parameters::~Parameters () 
291  {
292    log_begin(Front_end,FUNCTION);
293   
294    delete [] _param_glue           ;
295    delete [] _param_context_state  ;
296    for (uint32_t i=0; i<_nb_decod_unit; i++)
297      delete [] _param_decod_unit [i];
298    delete [] _param_decod_unit     ;
299    delete [] _param_prediction_unit;
300    for (uint32_t i=0; i<_nb_context; i++)
301      delete [] _param_ifetch_unit [i];
302    delete [] _param_ifetch_unit    ;
303
304//     delete [] _size_ifetch_queue_ptr;
305//     delete [] _size_nb_inst_decod;
306    delete [] _array_size_depth;
307    for (uint32_t i=0; i<_nb_context; ++i)
308      {
309        for (uint32_t j=0; j<_translate_context_id_from_decod_unit [i].size(); ++j)
310          delete [] _decod_unit_instruction_implemeted [i][j];
311
312        delete [] _decod_unit_nb_inst_fetch          [i];
313//         delete [] _decod_unit_depth                  [i];
314        delete [] _decod_unit_nb_branch_speculated   [i];
315        delete [] _decod_unit_instruction_implemeted [i];
316      }
317    delete [] _decod_unit_nb_inst_fetch         ;
318//     delete [] _decod_unit_depth                 ;
319    delete [] _decod_unit_nb_branch_speculated  ;
320    delete [] _decod_unit_instruction_implemeted;
321
322//     delete [] _have_port_decod_unit_context_id;
323    delete [] _decod_unit_nb_context               ;
324    delete [] _translate_context_id_from_decod_unit;
325
326    log_end(Front_end,FUNCTION);
327  };
328
329
330#undef  FUNCTION
331#define FUNCTION "Front_end::copy"
332  void Parameters::copy (void) 
333  {
334    log_begin(Front_end,FUNCTION);
335
336    COPY(_param_glue           );
337    COPY(_param_context_state  );
338    for (uint32_t i=0; i<_nb_decod_unit; i++)
339      {
340        COPY(_param_decod_unit  [i]);
341      }
342    COPY(_param_prediction_unit);
343    for (uint32_t i=0; i<_nb_context; i++)
344    COPY(_param_ifetch_unit [i]);
345
346    log_end(Front_end,FUNCTION);
347  };
348
349}; // end namespace front_end
350}; // end namespace multi_front_end
351}; // end namespace core
352
353}; // end namespace behavioural
354}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.