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

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

1) Stat_list : fix retire old and new register bug
2) Stat_list : remove read_counter and valid flag, because validation of destination is in retire step (not in commit step)
3) Model : add class Model (cf Morpheo.sim)
4) Allocation : alloc_interface_begin and alloc_interface_end to delete temporary array.
5) Script : add distexe.sh
6) Add Comparator, Multiplier, Divider. But this component are not implemented
7) Software : add Dhrystone

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