source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/SelfTest/src/main.cpp @ 110

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

1) OOO_egine : add stat to depiste low perf source
2) Commit : add stat
3) LSU_Pointer : retire - always ack (else combinatory loop). insert - max nb_inst_memory
4) TopLevel? : add debug_idle_time to stop combinatory loop.
5) Issue_queue : add reexecute_queue, new implementation (routage after issue_queue)
6) Decod / Predictor : add "can_continue"

  • Property svn:keywords set to Id
File size: 20.8 KB
Line 
1/*
2 * $Id: main.cpp 110 2009-02-19 16:31:47Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/SelfTest/include/test.h"
9#include "Behavioural/include/Allocation.h"
10
11#define NB_PARAMS 23
12
13void usage (int argc, char * argv[])
14{
15  err (_("<Usage> %s name_instance list_params.\n"),argv[0]);
16  err (_("list_params is :\n"));
17  err (_(" * nb_front_end                                                            (uint32_t         )\n"));
18  err (_(" * nb_context                        [nb_front_end]                        (uint32_t         )\n"));
19  err (_(" * nb_rename_unit                                                          (uint32_t         )\n"));
20  err (_(" * nb_execute_loop                                                         (uint32_t         )\n"));
21  err (_(" * nb_inst_decod                     [nb_front_end]                        (uint32_t         )\n"));
22  err (_(" * nb_inst_insert                    [nb_rename_unit]                      (uint32_t         )\n"));
23  err (_(" * nb_inst_retire                    [nb_rename_unit]                      (uint32_t         )\n"));
24  err (_(" * nb_inst_issue                                                           (uint32_t         )\n"));
25  err (_(" * nb_inst_execute                   [nb_execute_loop]                     (uint32_t         )\n"));
26  err (_(" * nb_inst_reexecute                                                       (uint32_t         )\n"));
27  err (_(" * nb_inst_commit                                                          (uint32_t         )\n"));
28  err (_(" * nb_inst_branch_complete                                                 (uint32_t         )\n"));
29  err (_(" * nb_branch_speculated              [nb_front_end][nb_context]            (uint32_t         )\n"));
30  err (_(" * size_nb_inst_decod                                                      (uint32_t         )\n"));
31  err (_(" * nb_rename_unit_select                                                   (uint32_t         )\n"));
32  err (_(" * nb_execute_loop_select                                                  (uint32_t         )\n"));
33  err (_(" * size_general_data                                                       (uint32_t         )\n"));
34  err (_(" * size_special_data                                                       (uint32_t         )\n"));
35  err (_(" * link_rename_unit_with_front_end   [nb_front_end]                        (uint32_t         )\n"));
36  err (_(" * size_re_order_buffer                                                    (uint32_t         )\n"));
37  err (_(" * nb_re_order_buffer_bank                                                 (uint32_t         )\n"));
38  err (_(" * commit_priority                                                         (Tpriority_t      )\n"));
39  err (_(" * commit_load_balancing                                                   (Tload_balancing_t)\n"));
40  err (_(" * size_issue_queue                                                        (uint32_t         )\n"));
41  err (_(" * nb_issue_queue_bank                                                     (uint32_t         )\n"));
42  err (_(" * issue_priority                                                          (Tpriority_t      )\n"));
43  err (_(" * issue_load_balancing                                                    (Tload_balancing_t)\n"));
44  err (_(" * table_routing                     [nb_rename_unit][nb_inst_issue]       (bool             )\n"));
45  err (_(" * table_issue_type                  [nb_inst_issue][nb_type]              (bool             )\n"));
46  err (_("   * TYPE_ALU    \n"));
47  err (_("   * TYPE_SHIFT  \n"));
48  err (_("   * TYPE_MOVE   \n"));
49  err (_("   * TYPE_TEST   \n"));
50  err (_("   * TYPE_MUL    \n"));
51  err (_("   * TYPE_DIV    \n"));
52  err (_("   * TYPE_EXTEND \n"));
53  err (_("   * TYPE_FIND   \n"));
54  err (_("   * TYPE_SPECIAL\n"));
55  err (_("   * TYPE_CUSTOM \n"));
56  err (_("   * TYPE_BRANCH \n"));
57  err (_("   * TYPE_MEMORY \n"));
58  err (_(" * size_reexecute_queue                                                    (uint32_t         )\n"));
59  err (_(" * reexecute_priority                                                      (Tpriority_t      )\n"));
60  err (_(" * reexecute_load_balancing                                                (Tload_balancing_t)\n"));
61  err (_(" * rename_select_priority            [nb_rename_unit]                      (Tpriority_t      )\n"));
62  err (_(" * rename_select_load_balancing      [nb_rename_unit]                      (Tload_balancing_t)\n"));
63  err (_(" * rename_select_nb_front_end_select [nb_rename_unit]                      (uint32_t         )\n"));
64  err (_(" * nb_general_register               [nb_rename_unit]                      (uint32_t         )\n"));
65  err (_(" * nb_special_register               [nb_rename_unit]                      (uint32_t         )\n"));
66  err (_(" * nb_reg_free                       [nb_rename_unit]                      (uint32_t         )\n"));
67  err (_(" * nb_rename_unit_bank               [nb_rename_unit]                      (uint32_t         )\n"));
68  err (_(" * size_read_counter                 [nb_rename_unit]                      (uint32_t         )\n"));
69  err (_(" * nb_load_store_queue               [nb_rename_unit]                      (uint32_t         )\n"));
70  err (_(" * size_store_queue                  [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
71  err (_(" * size_load_queue                   [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
72  err (_(" * nb_inst_memory                    [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
73  err (_(" * link_load_store_unit_with_thread  [nb_front_end][nb_context]            (uint32_t         )\n"));
74
75  exit (1);
76}
77
78#ifndef SYSTEMC
79int main    (int argc, char * argv[])
80#else
81int sc_main (int argc, char * argv[])
82#endif
83{
84  if (argc <= static_cast<int>(2+NB_PARAMS))
85    usage (argc, argv);
86
87  uint32_t _sum_nb_context          = 0;
88  uint32_t _sum_nb_load_store_queue = 0;
89
90  uint32_t x = 1;
91
92  string name = argv[x++];
93
94  uint32_t              _nb_front_end                      = fromString<uint32_t         >(argv[x++]);
95
96  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end))
97    usage (argc, argv);
98
99  uint32_t            * _nb_context                        = new uint32_t [_nb_front_end];
100  for (uint32_t i=0; i<_nb_front_end; i++)
101    {
102      _nb_context [i] = fromString<uint32_t>(argv[x++]);
103      _sum_nb_context += _nb_context [i];
104    }
105  uint32_t              _nb_rename_unit                    = fromString<uint32_t         >(argv[x++]);
106  uint32_t              _nb_execute_loop                   = fromString<uint32_t         >(argv[x++]);
107  uint32_t            * _nb_inst_decod                     = new uint32_t [_nb_front_end];
108  for (uint32_t i=0; i<_nb_front_end; i++)
109    _nb_inst_decod [i] = fromString<uint32_t>(argv[x++]);
110
111  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+12*_nb_rename_unit+_nb_execute_loop))
112    usage (argc, argv);
113
114  uint32_t            * _nb_inst_insert                    = new uint32_t [_nb_rename_unit];
115  uint32_t            * _nb_inst_retire                    = new uint32_t [_nb_rename_unit];
116  for (uint32_t i=0; i<_nb_rename_unit; i++)
117    _nb_inst_insert [i] = fromString<uint32_t>(argv[x++]);
118  for (uint32_t i=0; i<_nb_rename_unit; i++)
119    _nb_inst_retire [i] = fromString<uint32_t>(argv[x++]);
120
121  uint32_t              _nb_inst_issue                     = fromString<uint32_t         >(argv[x++]);
122  uint32_t            * _nb_inst_execute                   = new uint32_t [_nb_execute_loop];
123  for (uint32_t i=0; i<_nb_execute_loop; i++)
124    _nb_inst_execute [i] = fromString<uint32_t>(argv[x++]);
125  uint32_t              _nb_inst_reexecute                 = fromString<uint32_t         >(argv[x++]);
126  uint32_t              _nb_inst_commit                    = fromString<uint32_t         >(argv[x++]);
127  uint32_t              _nb_inst_branch_complete           = fromString<uint32_t         >(argv[x++]);
128  uint32_t           ** _nb_branch_speculated              = new uint32_t * [_nb_front_end];
129  for (uint32_t i=0; i<_nb_front_end; i++)
130    {
131      _nb_branch_speculated [i] = new uint32_t [_nb_context[i]];
132      for (uint32_t j=0; j<_nb_context[i]; j++)
133        _nb_branch_speculated [i][j] = fromString<uint32_t>(argv[x++]);
134    }
135  uint32_t              _size_nb_inst_decod                = fromString<uint32_t         >(argv[x++]);
136  uint32_t              _nb_rename_unit_select             = fromString<uint32_t         >(argv[x++]);
137  uint32_t              _nb_execute_loop_select            = fromString<uint32_t         >(argv[x++]);
138  uint32_t              _size_general_data                 = fromString<uint32_t         >(argv[x++]);
139  uint32_t              _size_special_data                 = fromString<uint32_t         >(argv[x++]);
140  uint32_t            * _link_rename_unit_with_front_end   = new uint32_t [_nb_front_end];
141  for (uint32_t i=0; i<_nb_front_end; i++)
142    _link_rename_unit_with_front_end [i] = fromString<uint32_t>(argv[x++]);
143  uint32_t              _size_re_order_buffer              = fromString<uint32_t         >(argv[x++]);
144  uint32_t              _nb_re_order_buffer_bank           = fromString<uint32_t         >(argv[x++]);
145  Tpriority_t           _commit_priority                   = fromString<Tpriority_t      >(argv[x++]);
146  Tload_balancing_t     _commit_load_balancing             = fromString<Tload_balancing_t>(argv[x++]);
147  uint32_t              _size_issue_queue                  = fromString<uint32_t         >(argv[x++]);
148  uint32_t              _nb_issue_queue_bank               = fromString<uint32_t         >(argv[x++]);
149  Tpriority_t           _issue_priority                    = fromString<Tpriority_t      >(argv[x++]);
150  Tload_balancing_t     _issue_load_balancing              = fromString<Tload_balancing_t>(argv[x++]);
151  bool               ** _table_routing                     = new bool * [_nb_rename_unit];
152  for (uint32_t i=0; i<_nb_rename_unit; i++)
153    {
154      _table_routing [i] = new bool [_nb_inst_issue];
155      for (uint32_t j=0; j<_nb_inst_issue; j++)
156        _table_routing [i][j] = fromString<bool>(argv[x++]);
157    }
158
159  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+11*_nb_rename_unit+_nb_execute_loop+_nb_rename_unit*_nb_inst_issue+12*_nb_inst_issue))
160    usage (argc, argv);
161 
162  bool               ** _table_issue_type                  = new bool * [_nb_inst_issue];
163  for (uint32_t i=0; i<_nb_inst_issue; i++)   
164    {
165      _table_issue_type [i] = new bool [MAX_TYPE];
166      for (uint32_t j=0; j<MAX_TYPE; j++)
167        _table_issue_type [i][j] = false;
168
169      _table_issue_type [i][TYPE_ALU    ] = fromString<bool>(argv[x++]);
170      _table_issue_type [i][TYPE_SHIFT  ] = fromString<bool>(argv[x++]);
171      _table_issue_type [i][TYPE_MOVE   ] = fromString<bool>(argv[x++]);
172      _table_issue_type [i][TYPE_TEST   ] = fromString<bool>(argv[x++]);
173      _table_issue_type [i][TYPE_MUL    ] = fromString<bool>(argv[x++]);
174      _table_issue_type [i][TYPE_DIV    ] = fromString<bool>(argv[x++]);
175      _table_issue_type [i][TYPE_EXTEND ] = fromString<bool>(argv[x++]);
176      _table_issue_type [i][TYPE_FIND   ] = fromString<bool>(argv[x++]);
177      _table_issue_type [i][TYPE_SPECIAL] = fromString<bool>(argv[x++]);
178      _table_issue_type [i][TYPE_CUSTOM ] = fromString<bool>(argv[x++]);
179      _table_issue_type [i][TYPE_BRANCH ] = fromString<bool>(argv[x++]);
180      _table_issue_type [i][TYPE_MEMORY ] = fromString<bool>(argv[x++]);
181    }
182 
183  uint32_t              _size_reexecute_queue              = fromString<uint32_t         >(argv[x++]);
184  Tpriority_t           _reexecute_priority                = fromString<Tpriority_t      >(argv[x++]);
185  Tload_balancing_t     _reexecute_load_balancing          = fromString<Tload_balancing_t>(argv[x++]);
186
187  Tpriority_t         * _rename_select_priority            = new Tpriority_t       [_nb_rename_unit];
188  Tload_balancing_t   * _rename_select_load_balancing      = new Tload_balancing_t [_nb_rename_unit];
189  uint32_t            * _rename_select_nb_front_end_select = new uint32_t          [_nb_rename_unit];
190  uint32_t            * _nb_general_register               = new uint32_t          [_nb_rename_unit];
191  uint32_t            * _nb_special_register               = new uint32_t          [_nb_rename_unit];
192  uint32_t            * _nb_reg_free                       = new uint32_t          [_nb_rename_unit];
193  uint32_t            * _nb_rename_unit_bank               = new uint32_t          [_nb_rename_unit];
194  uint32_t            * _size_read_counter                 = new uint32_t          [_nb_rename_unit];
195  uint32_t            * _nb_load_store_queue               = new uint32_t          [_nb_rename_unit];
196
197  for (uint32_t i=0; i<_nb_rename_unit; i++)
198    _rename_select_priority            [i] = fromString<Tpriority_t      >(argv[x++]);
199  for (uint32_t i=0; i<_nb_rename_unit; i++)
200    _rename_select_load_balancing      [i] = fromString<Tload_balancing_t>(argv[x++]);
201  for (uint32_t i=0; i<_nb_rename_unit; i++)
202    _rename_select_nb_front_end_select [i] = fromString<uint32_t         >(argv[x++]);
203  for (uint32_t i=0; i<_nb_rename_unit; i++)
204    _nb_general_register               [i] = fromString<uint32_t         >(argv[x++]);
205  for (uint32_t i=0; i<_nb_rename_unit; i++)
206    _nb_special_register               [i] = fromString<uint32_t         >(argv[x++]);
207  for (uint32_t i=0; i<_nb_rename_unit; i++)
208    _nb_reg_free                       [i] = fromString<uint32_t         >(argv[x++]);
209  for (uint32_t i=0; i<_nb_rename_unit; i++)
210    _nb_rename_unit_bank               [i] = fromString<uint32_t         >(argv[x++]);
211  for (uint32_t i=0; i<_nb_rename_unit; i++)
212    _size_read_counter                 [i] = fromString<uint32_t         >(argv[x++]);
213  for (uint32_t i=0; i<_nb_rename_unit; i++)
214    {
215    _nb_load_store_queue               [i] = fromString<uint32_t         >(argv[x++]);
216    _sum_nb_load_store_queue += _nb_load_store_queue [i];
217    }
218
219  if (argc != static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+11*_nb_rename_unit+_nb_execute_loop+_nb_rename_unit*_nb_inst_issue+12*_nb_inst_issue+3*_sum_nb_load_store_queue))
220    usage (argc, argv);
221
222
223  uint32_t           ** _size_store_queue                  = new uint32_t * [_nb_rename_unit];
224  for (uint32_t i=0; i<_nb_rename_unit; i++)
225    {
226      _size_store_queue [i] = new uint32_t [_nb_load_store_queue[i]];
227      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
228        _size_store_queue [i][j] = fromString<uint32_t>(argv[x++]);
229    }
230
231  uint32_t           ** _size_load_queue                  = new uint32_t * [_nb_rename_unit];
232  for (uint32_t i=0; i<_nb_rename_unit; i++)
233    {
234      _size_load_queue [i] = new uint32_t [_nb_load_store_queue[i]];
235      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
236        _size_load_queue [i][j] = fromString<uint32_t>(argv[x++]);
237    }
238
239  uint32_t           ** _nb_inst_memory                   = new uint32_t * [_nb_rename_unit];
240  for (uint32_t i=0; i<_nb_rename_unit; i++)
241    {
242      _nb_inst_memory  [i] = new uint32_t [_nb_load_store_queue[i]];
243      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
244        _nb_inst_memory  [i][j] = fromString<uint32_t>(argv[x++]);
245    }
246
247  uint32_t           ** _link_load_store_unit_with_thread  = new uint32_t * [_nb_front_end];
248  for (uint32_t i=0; i<_nb_front_end; i++)
249    {
250      _link_load_store_unit_with_thread [i] = new uint32_t [_nb_context[i]];
251      for (uint32_t j=0; j<_nb_context[i]; j++)
252        _link_load_store_unit_with_thread [i][j] = fromString<uint32_t>(argv[x++]);
253    }
254
255  bool     *** _implement_group       = new bool ** [_nb_front_end];
256  for (uint32_t i=0; i<_nb_front_end; i++)
257    {
258      _implement_group [i] = new bool * [_nb_context[i]];
259      for (uint32_t j=0; j<_nb_context[i]; j++)
260        {
261          _implement_group [i][j] = new bool [NB_GROUP];
262
263          for (uint32_t k=0; k<NB_GROUP; k++)
264            _implement_group [i][j][k] = false;
265
266          _implement_group [i][j][GROUP_SYSTEM_AND_CONTROL] = true;
267          _implement_group [i][j][GROUP_DCACHE            ] = true;
268        }
269    }
270
271  uint32_t          _nb_thread                          ;
272  uint32_t       ** _translate_num_context_to_num_thread; //[nb_front_end][nb_context]
273
274  ALLOC2(_translate_num_context_to_num_thread,uint32_t,_nb_front_end,_nb_context[it1]);
275
276  _nb_thread = 0;
277  for (uint32_t i=0; i<_nb_front_end; i++)
278    for (uint32_t j=0; j<_nb_context [i]; j++)
279      _translate_num_context_to_num_thread [i][j] = _nb_thread ++;
280
281  int _return = EXIT_SUCCESS;
282  try 
283    {
284      morpheo::behavioural::core::multi_ooo_engine::ooo_engine::Parameters * param = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::Parameters
285        (
286         _nb_front_end                     ,
287         _nb_context                       ,
288         _nb_rename_unit                   ,
289         _nb_execute_loop                  ,
290         _nb_inst_decod                    ,
291         _nb_inst_insert                   ,
292         _nb_inst_retire                   ,
293         _nb_inst_issue                    ,
294         _nb_inst_execute                  ,
295         _nb_inst_reexecute                ,
296         _nb_inst_commit                   ,
297         _nb_inst_branch_complete          ,
298         _nb_branch_speculated             ,
299         _size_nb_inst_decod               ,
300         _nb_rename_unit_select            ,
301         _nb_execute_loop_select           ,
302         _size_general_data                ,
303         _size_special_data                ,
304         _link_rename_unit_with_front_end  ,
305         _size_re_order_buffer             ,
306         _nb_re_order_buffer_bank          ,
307         _commit_priority                  ,
308         _commit_load_balancing            ,
309         _size_issue_queue                 ,
310         _nb_issue_queue_bank              ,
311         _issue_priority                   ,
312         _issue_load_balancing             ,
313         _table_routing                    ,
314         _table_issue_type                 ,
315         _size_reexecute_queue             ,
316         _reexecute_priority               ,
317         _reexecute_load_balancing         ,
318         _rename_select_priority           ,
319         _rename_select_load_balancing     ,
320         _rename_select_nb_front_end_select,
321         _nb_general_register              ,
322         _nb_special_register              ,
323         _nb_reg_free                      ,
324         _nb_rename_unit_bank              ,
325         _size_read_counter                ,
326         _nb_load_store_queue              ,
327         _size_store_queue                 ,
328         _size_load_queue                  ,
329         _nb_inst_memory                   ,
330         _link_load_store_unit_with_thread ,
331         _implement_group                  ,
332         _nb_thread                          ,
333         _translate_num_context_to_num_thread,
334         true //is_toplevel
335         );
336     
337      msg(_("%s"),param->print(0).c_str());
338     
339      test (name,param);
340
341      delete param;
342    }
343  catch (morpheo::ErrorMorpheo & error)
344    {
345      msg (_("<%s> :\n%s"),name.c_str(), error.what ());
346      _return = EXIT_FAILURE;
347    }
348
349  try 
350    {
351      if (_return == EXIT_SUCCESS)
352        TEST_OK("OOO_Engine : no error");
353      else
354        TEST_KO("OOO_Engine : a lot of error");
355    }
356  catch (morpheo::ErrorMorpheo & error)
357    {
358//       msg (_("<%s> :\n%s"),name.c_str(), error.what ());
359      _return = EXIT_FAILURE;
360    }
361
362  DELETE2(_translate_num_context_to_num_thread,_nb_front_end,_nb_context[it1]);
363
364  for (uint32_t i=0; i<_nb_front_end; i++)
365    {
366      for (uint32_t j=0; j<_nb_context[i]; j++)
367        delete [] _implement_group [i][j];
368      delete [] _implement_group [i];
369    }
370  delete [] _implement_group;
371
372  for (uint32_t i=0; i<_nb_front_end; i++)
373    delete [] _link_load_store_unit_with_thread [i];
374  delete [] _link_load_store_unit_with_thread;
375
376  for (uint32_t i=0; i<_nb_rename_unit; i++)
377    delete [] _nb_inst_memory  [i];
378  delete [] _nb_inst_memory ;
379
380  for (uint32_t i=0; i<_nb_rename_unit; i++)
381    delete [] _size_load_queue [i];
382  delete [] _size_load_queue;
383
384  for (uint32_t i=0; i<_nb_rename_unit; i++)
385    delete []_size_store_queue [i];
386  delete []_size_store_queue;
387
388  delete [] _nb_load_store_queue               ;
389  delete [] _size_read_counter                 ;
390  delete [] _nb_rename_unit_bank               ;
391  delete [] _nb_reg_free                       ;
392  delete [] _nb_special_register               ;
393  delete [] _nb_general_register               ;
394  delete [] _rename_select_nb_front_end_select ;
395  delete [] _rename_select_load_balancing      ;
396  delete [] _rename_select_priority            ;
397
398  for (uint32_t i=0; i<_nb_inst_issue; i++)   
399    delete [] _table_issue_type [i];
400  delete [] _table_issue_type; 
401
402  for (uint32_t i=0; i<_nb_rename_unit; i++)
403    delete [] _table_routing [i];
404  delete [] _table_routing;
405
406  delete [] _link_rename_unit_with_front_end;
407
408  for (uint32_t i=0; i<_nb_front_end; i++)
409    delete [] _nb_branch_speculated [i];
410  delete [] _nb_branch_speculated;
411 
412  delete [] _nb_inst_execute;
413  delete [] _nb_inst_retire ;
414  delete [] _nb_inst_insert ;
415  delete [] _nb_inst_decod  ;
416  delete [] _nb_context     ;
417
418  return (_return);
419}
Note: See TracBrowser for help on using the repository browser.