source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/SelfTest/src/test.cpp @ 78

Last change on this file since 78 was 78, checked in by rosiere, 16 years ago

Add :

  • Execute_loop (must be test systemC)
  • Prediction
    • Direction : predifined scheme
    • Branch Target Buffer
  • iFetch_unit
    • ifetch_queue
    • pc management
  • Decod_unit
    • coming soon : support for custom operation
  • Rename_unit
    • RAT
    • Free_list
    • Dependence RAW check
    • Load store unit pointer
  • New Environnement (hierarchy_memory will remove in a next version)


Modif :

  • Manage Custom Operation
  • All component in execute_loop to use the new statistics management

Not Finish :

  • Return Address Stack
  • Environnement
File size: 27.0 KB
Line 
1/*
2 * $Id$
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/SelfTest/include/test.h"
10#include "Common/include/Test.h"
11#include "Common/include/BitManipulation.h"
12#include "Behavioural/include/Allocation.h"
13#include <list>
14#include <set>
15
16#define NB_ITERATION  1
17#define CYCLE_MAX     (128*NB_ITERATION)
18
19#define LABEL(str...)                                                   \
20  {                                                                     \
21    msg (_("{%d} "),static_cast<uint32_t>(sc_simulation_time()));       \
22    msg (str);                                                          \
23    msg (_("\n"));                                                      \
24  } while(0)
25
26#define SC_START(cycle_offset)                                                       \
27  do                                                                                 \
28    {                                                                                \
29      /*cout << "SC_START (begin)" << endl;*/                                        \
30                                                                                     \
31      uint32_t cycle_current = static_cast<uint32_t>(sc_simulation_time());          \
32      if (cycle_offset != 0)                                                         \
33        {                                                                            \
34          cout << "##########[ cycle "<< cycle_current+cycle_offset << " ]" << endl; \
35        }                                                                            \
36                                                                                     \
37      if (cycle_current > CYCLE_MAX)                                                 \
38        {                                                                            \
39          TEST_KO("Maximal cycles Reached");                                         \
40        }                                                                            \
41                                                                                     \
42      sc_start(cycle_offset);                                                        \
43                                                                                     \
44      /*cout << "SC_START (end  )" << endl;*/                                        \
45    } while(0)
46
47
48class entry_t 
49{
50public : Tcontext_t         _context_id           ;
51public : Tcontext_t         _front_end_id         ;
52public : Tcontext_t         _ooo_engine_id        ;
53public : Tpacket_t          _packet_id            ;
54public : Toperation_t       _operation            ;
55public : Ttype_t            _type                 ;
56public : Tlsq_ptr_t         _store_queue_ptr_write;
57public : Tlsq_ptr_t         _load_queue_ptr_write ;
58public : Tcontrol_t         _has_immediat         ;
59public : Tgeneral_data_t    _immediat             ;
60public : Tgeneral_data_t    _data_ra              ;
61public : Tgeneral_data_t    _data_rb              ;
62public : Tspecial_data_t    _data_rc              ;
63public : Tcontrol_t         _write_rd             ;
64public : Tgeneral_address_t _num_reg_rd           ;
65public : Tcontrol_t         _write_re             ;
66public : Tspecial_address_t _num_reg_re           ;
67
68public : entry_t (Tcontext_t         context_id           ,
69                  Tcontext_t         front_end_id         ,
70                  Tcontext_t         ooo_engine_id        ,
71                  Tpacket_t          packet_id            ,
72                  Toperation_t       operation            ,
73                  Ttype_t            type                 ,
74                  Tlsq_ptr_t         store_queue_ptr_write,
75                  Tlsq_ptr_t         load_queue_ptr_write ,
76                  Tcontrol_t         has_immediat         ,
77                  Tgeneral_data_t    immediat             ,
78                  Tgeneral_data_t    data_ra              ,
79                  Tgeneral_data_t    data_rb              ,
80                  Tspecial_data_t    data_rc              ,
81                  Tcontrol_t         write_rd             ,
82                  Tgeneral_address_t num_reg_rd           ,
83                  Tcontrol_t         write_re             ,
84                  Tspecial_address_t num_reg_re           )
85  {
86    _context_id            = context_id           ;
87    _front_end_id          = front_end_id         ;
88    _ooo_engine_id         = ooo_engine_id        ;
89    _packet_id             = packet_id            ;
90    _operation             = operation            ;
91    _type                  = type                 ;
92    _store_queue_ptr_write = store_queue_ptr_write;
93    _load_queue_ptr_write  = load_queue_ptr_write ;
94    _has_immediat          = has_immediat         ;
95    _immediat              = immediat             ;
96    _data_ra               = data_ra              ;
97    _data_rb               = data_rb              ;
98    _data_rc               = data_rc              ;
99    _write_rd              = write_rd             ;
100    _num_reg_rd            = num_reg_rd           ;
101    _write_re              = write_re             ;
102    _num_reg_re            = num_reg_re           ;
103  }
104};
105
106void test (string name,
107           morpheo::behavioural::core::multi_execute_loop::execute_loop::network::read_unit_to_execution_unit::Parameters * _param)
108{
109  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
110
111#ifdef STATISTICS
112  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
113#endif
114
115  Read_unit_to_Execution_unit * _Read_unit_to_Execution_unit = new Read_unit_to_Execution_unit (name.c_str(),
116#ifdef STATISTICS
117                                             _parameters_statistics,
118#endif
119                                             _param);
120 
121#ifdef SYSTEMC
122  /*********************************************************************
123   * Déclarations des signaux
124   *********************************************************************/
125  string rename;
126
127  sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);         
128  sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
129
130  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_VAL                  ," in_READ_UNIT_OUT_VAL"                  ,Tcontrol_t        ,_param->_nb_read_unit);
131  ALLOC1_SC_SIGNAL(out_READ_UNIT_OUT_ACK                  ,"out_READ_UNIT_OUT_ACK"                  ,Tcontrol_t        ,_param->_nb_read_unit);
132  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_CONTEXT_ID           ," in_READ_UNIT_OUT_CONTEXT_ID"           ,Tcontext_t        ,_param->_nb_read_unit);
133  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_FRONT_END_ID         ," in_READ_UNIT_OUT_FRONT_END_ID"         ,Tcontext_t        ,_param->_nb_read_unit);
134  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_OOO_ENGINE_ID        ," in_READ_UNIT_OUT_OOO_ENGINE_ID"        ,Tcontext_t        ,_param->_nb_read_unit);
135  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_PACKET_ID            ," in_READ_UNIT_OUT_PACKET_ID"            ,Tpacket_t         ,_param->_nb_read_unit);
136  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_OPERATION            ," in_READ_UNIT_OUT_OPERATION"            ,Toperation_t      ,_param->_nb_read_unit);
137  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_TYPE                 ," in_READ_UNIT_OUT_TYPE"                 ,Ttype_t           ,_param->_nb_read_unit);
138  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE," in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE",Tlsq_ptr_t        ,_param->_nb_read_unit);
139  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ," in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE" ,Tlsq_ptr_t        ,_param->_nb_read_unit);
140  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_HAS_IMMEDIAT         ," in_READ_UNIT_OUT_HAS_IMMEDIAT"         ,Tcontrol_t        ,_param->_nb_read_unit);
141  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_IMMEDIAT             ," in_READ_UNIT_OUT_IMMEDIAT"             ,Tgeneral_data_t   ,_param->_nb_read_unit);
142  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RA              ," in_READ_UNIT_OUT_DATA_RA"              ,Tgeneral_data_t   ,_param->_nb_read_unit);
143  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RB              ," in_READ_UNIT_OUT_DATA_RB"              ,Tgeneral_data_t   ,_param->_nb_read_unit);
144  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RC              ," in_READ_UNIT_OUT_DATA_RC"              ,Tspecial_data_t   ,_param->_nb_read_unit);
145  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_WRITE_RD             ," in_READ_UNIT_OUT_WRITE_RD"             ,Tcontrol_t        ,_param->_nb_read_unit);
146  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_NUM_REG_RD           ," in_READ_UNIT_OUT_NUM_REG_RD"           ,Tgeneral_address_t,_param->_nb_read_unit);
147  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_WRITE_RE             ," in_READ_UNIT_OUT_WRITE_RE"             ,Tcontrol_t        ,_param->_nb_read_unit);
148  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_NUM_REG_RE           ," in_READ_UNIT_OUT_NUM_REG_RE"           ,Tspecial_address_t,_param->_nb_read_unit);
149  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_VAL                  ,"out_EXECUTE_UNIT_IN_VAL"                  ,Tcontrol_t        ,_param->_nb_execute_unit);
150  ALLOC1_SC_SIGNAL( in_EXECUTE_UNIT_IN_ACK                  ," in_EXECUTE_UNIT_IN_ACK"                  ,Tcontrol_t        ,_param->_nb_execute_unit);
151  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_CONTEXT_ID           ,"out_EXECUTE_UNIT_IN_CONTEXT_ID"           ,Tcontext_t        ,_param->_nb_execute_unit);
152  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_FRONT_END_ID         ,"out_EXECUTE_UNIT_IN_FRONT_END_ID"         ,Tcontext_t        ,_param->_nb_execute_unit);
153  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ,"out_EXECUTE_UNIT_IN_OOO_ENGINE_ID"        ,Tcontext_t        ,_param->_nb_execute_unit);
154  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_PACKET_ID            ,"out_EXECUTE_UNIT_IN_PACKET_ID"            ,Tpacket_t         ,_param->_nb_execute_unit);
155  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_OPERATION            ,"out_EXECUTE_UNIT_IN_OPERATION"            ,Toperation_t      ,_param->_nb_execute_unit);
156  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_TYPE                 ,"out_EXECUTE_UNIT_IN_TYPE"                 ,Ttype_t           ,_param->_nb_execute_unit);
157  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE,"out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE",Tlsq_ptr_t        ,_param->_nb_execute_unit);
158  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ,"out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE" ,Tlsq_ptr_t        ,_param->_nb_execute_unit);
159  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ,"out_EXECUTE_UNIT_IN_HAS_IMMEDIAT"         ,Tcontrol_t        ,_param->_nb_execute_unit);
160  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_IMMEDIAT             ,"out_EXECUTE_UNIT_IN_IMMEDIAT"             ,Tgeneral_data_t   ,_param->_nb_execute_unit);
161  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RA              ,"out_EXECUTE_UNIT_IN_DATA_RA"              ,Tgeneral_data_t   ,_param->_nb_execute_unit);
162  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RB              ,"out_EXECUTE_UNIT_IN_DATA_RB"              ,Tgeneral_data_t   ,_param->_nb_execute_unit);
163  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RC              ,"out_EXECUTE_UNIT_IN_DATA_RC"              ,Tspecial_data_t   ,_param->_nb_execute_unit);
164  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_WRITE_RD             ,"out_EXECUTE_UNIT_IN_WRITE_RD"             ,Tcontrol_t        ,_param->_nb_execute_unit);
165  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_NUM_REG_RD           ,"out_EXECUTE_UNIT_IN_NUM_REG_RD"           ,Tgeneral_address_t,_param->_nb_execute_unit);
166  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_WRITE_RE             ,"out_EXECUTE_UNIT_IN_WRITE_RE"             ,Tcontrol_t        ,_param->_nb_execute_unit);
167  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_NUM_REG_RE           ,"out_EXECUTE_UNIT_IN_NUM_REG_RE"           ,Tspecial_address_t,_param->_nb_execute_unit);
168 
169 
170  /********************************************************
171   * Instanciation
172   ********************************************************/
173 
174  msg(_("<%s> : Instanciation of _Read_unit_to_Execution_unit.\n"),name.c_str());
175
176  (*(_Read_unit_to_Execution_unit->in_CLOCK))        (*(in_CLOCK));
177  (*(_Read_unit_to_Execution_unit->in_NRESET))       (*(in_NRESET));
178
179  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_VAL                  ,_param->_nb_read_unit);
180  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_READ_UNIT_OUT_ACK                  ,_param->_nb_read_unit);
181  if (_param->_have_port_context_id)
182  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_CONTEXT_ID           ,_param->_nb_read_unit);
183  if (_param->_have_port_front_end_id)
184  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_FRONT_END_ID         ,_param->_nb_read_unit);
185  if (_param->_have_port_ooo_engine_id)
186  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_OOO_ENGINE_ID        ,_param->_nb_read_unit);
187  if (_param->_have_port_packet_id)
188  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_PACKET_ID            ,_param->_nb_read_unit);
189  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_OPERATION            ,_param->_nb_read_unit);
190  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_TYPE                 ,_param->_nb_read_unit);
191  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE,_param->_nb_read_unit);
192  if (_param->_have_port_load_queue_ptr)
193  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ,_param->_nb_read_unit);
194  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_HAS_IMMEDIAT         ,_param->_nb_read_unit);
195  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_IMMEDIAT             ,_param->_nb_read_unit);
196  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RA              ,_param->_nb_read_unit);
197  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RB              ,_param->_nb_read_unit);
198  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RC              ,_param->_nb_read_unit);
199  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_WRITE_RD             ,_param->_nb_read_unit);
200  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_NUM_REG_RD           ,_param->_nb_read_unit);
201  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_WRITE_RE             ,_param->_nb_read_unit);
202  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_NUM_REG_RE           ,_param->_nb_read_unit);
203
204  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_VAL                  ,_param->_nb_execute_unit);
205  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_EXECUTE_UNIT_IN_ACK                  ,_param->_nb_execute_unit);
206  if (_param->_have_port_context_id)
207  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_CONTEXT_ID           ,_param->_nb_execute_unit);
208  if (_param->_have_port_front_end_id)
209  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_FRONT_END_ID         ,_param->_nb_execute_unit);
210  if (_param->_have_port_ooo_engine_id)
211  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ,_param->_nb_execute_unit);
212  if (_param->_have_port_packet_id)
213  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_PACKET_ID            ,_param->_nb_execute_unit);
214  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_OPERATION            ,_param->_nb_execute_unit);
215  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_TYPE                 ,_param->_nb_execute_unit);
216  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE,_param->_nb_execute_unit);
217  if (_param->_have_port_load_queue_ptr)
218  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ,_param->_nb_execute_unit);
219  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ,_param->_nb_execute_unit);
220  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_IMMEDIAT             ,_param->_nb_execute_unit);
221  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RA              ,_param->_nb_execute_unit);
222  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RB              ,_param->_nb_execute_unit);
223  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RC              ,_param->_nb_execute_unit);
224  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_WRITE_RD             ,_param->_nb_execute_unit);
225  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_NUM_REG_RD           ,_param->_nb_execute_unit);
226  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_WRITE_RE             ,_param->_nb_execute_unit);
227  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_NUM_REG_RE           ,_param->_nb_execute_unit);
228
229  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
230   
231  Time * _time = new Time();
232
233  /********************************************************
234   * Simulation - Begin
235   ********************************************************/
236
237  // Initialisation
238
239  const uint32_t seed = 0;
240// const uint32_t seed = static_cast<uint32_t>(time(NULL));
241
242  srand(seed);
243
244  const  int32_t percent_transaction_in  = 75;
245  const  int32_t percent_transaction_out = 75;
246
247  set<Tcontext_t> read_unit_thread [_param->_nb_read_unit];
248  set<Ttype_t   > read_unit_type   [_param->_nb_read_unit][_param->_nb_thread];
249 
250  for (uint32_t i=0; i<_param->_nb_read_unit; i++)
251    for (uint32_t j=0; j<_param->_nb_execute_unit; j++)
252      if (_param->_table_routing[i][j])
253        for (uint32_t k=0; k<_param->_nb_thread; k++)
254          if (_param->_table_execute_thread[j][k])
255            {
256              read_unit_thread [i].insert(k);
257             
258              for (uint32_t l=0; l<_param->_nb_type; l++)
259                if (_param->_table_execute_type[j][l])
260                  read_unit_type [i][k].insert(l);
261            }
262  //bool ** _table_routing       ; //array [nb_read_unit][nb_execute_unit]
263  //bool ** _table_execute_type  ; //array [nb_execute_unit][nb_type]
264  //bool ** _table_execute_thread; //array [nb_execute_unit][nb_thread]
265 
266  SC_START(0);
267  LABEL("Initialisation");
268
269  LABEL("Reset");
270  in_NRESET->write(0);
271  SC_START(5);
272  in_NRESET->write(1); 
273
274  LABEL("Loop of Test");
275
276  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
277    {
278      LABEL("Iteration %d",iteration);
279
280      list<entry_t> request [_param->_nb_read_unit];
281
282      uint32_t nb_request_in;
283      for (nb_request_in=0; nb_request_in < _param->_nb_packet; )
284        for (uint32_t i=0; i<_param->_nb_read_unit; i++)
285          {
286            if (nb_request_in >= _param->_nb_packet)
287              break;
288
289            Tcontext_t context_id   ;
290            Tcontext_t front_end_id ;
291            Tcontext_t ooo_engine_id;
292            Tcontext_t num_thread   ;
293
294            // Find compatible thread
295            do
296              {
297                context_id    = range<Tcontext_t> (rand(), _param->_size_context_id   );
298                front_end_id  = range<Tcontext_t> (rand(), _param->_size_front_end_id );
299                ooo_engine_id = range<Tcontext_t> (rand(), _param->_size_ooo_engine_id);
300                num_thread    = get_num_thread (context_id   , _param->_size_context_id   ,
301                                                front_end_id , _param->_size_front_end_id ,
302                                                ooo_engine_id, _param->_size_ooo_engine_id);
303              }
304            while (read_unit_thread[i].find(num_thread) == read_unit_thread[i].end());
305
306            Ttype_t    type;
307           
308            // Find a compatible type
309            do
310              {
311                type = range<Ttype_t> (rand(), _param->_size_type);
312              }
313            while (read_unit_type[i][num_thread].find(type) == read_unit_type[i][num_thread].end());
314
315            request[i].push_back(entry_t (context_id   ,
316                                          front_end_id ,
317                                          ooo_engine_id,
318                                          nb_request_in,
319                                          range<Toperation_t      > (rand(), _param->_size_operation       ),
320                                          type,
321                                          range<Tlsq_ptr_t        > (rand(), _param->_size_store_queue     ),
322                                          range<Tlsq_ptr_t        > (rand(), _param->_size_load_queue      ),
323                                          range<Tcontrol_t        > (rand(), 2                             ),
324                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
325                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
326                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
327                                          range<Tspecial_data_t   > (rand(), _param->_size_special_data    ),
328                                          range<Tcontrol_t        > (rand(), 2                             ),
329                                          range<Tgeneral_address_t> (rand(), _param->_size_general_register),
330                                          range<Tcontrol_t        > (rand(), 2                             ),
331                                          range<Tspecial_address_t> (rand(), _param->_size_special_register)
332                                          ));
333
334            nb_request_in++;
335          }
336
337      uint32_t   nb_request_out = 0;
338
339      while (nb_request_out < nb_request_in)
340        {
341          for (uint32_t i=0; i<_param->_nb_read_unit; i++)
342            {
343              bool val = not request[i].empty() and ((rand()%100) < percent_transaction_in);
344               
345              in_READ_UNIT_OUT_VAL [i]->write(val);
346
347              if (val)
348                {
349                  in_READ_UNIT_OUT_CONTEXT_ID           [i] ->write(request[i].front()._context_id           );
350                  in_READ_UNIT_OUT_FRONT_END_ID         [i] ->write(request[i].front()._front_end_id         );
351                  in_READ_UNIT_OUT_OOO_ENGINE_ID        [i] ->write(request[i].front()._ooo_engine_id        );
352                  in_READ_UNIT_OUT_PACKET_ID            [i] ->write(request[i].front()._packet_id            );
353                  in_READ_UNIT_OUT_OPERATION            [i] ->write(request[i].front()._operation            );
354                  in_READ_UNIT_OUT_TYPE                 [i] ->write(request[i].front()._type                 );
355                  in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE[i] ->write(request[i].front()._store_queue_ptr_write);
356                  if (_param->_have_port_load_queue_ptr)
357                  in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE [i] ->write(request[i].front()._load_queue_ptr_write );
358                  in_READ_UNIT_OUT_HAS_IMMEDIAT         [i] ->write(request[i].front()._has_immediat         );
359                  in_READ_UNIT_OUT_IMMEDIAT             [i] ->write(request[i].front()._immediat             );
360                  in_READ_UNIT_OUT_DATA_RA              [i] ->write(request[i].front()._data_ra              );
361                  in_READ_UNIT_OUT_DATA_RB              [i] ->write(request[i].front()._data_rb              );
362                  in_READ_UNIT_OUT_DATA_RC              [i] ->write(request[i].front()._data_rc              );
363                  in_READ_UNIT_OUT_WRITE_RD             [i] ->write(request[i].front()._write_rd             );
364                  in_READ_UNIT_OUT_NUM_REG_RD           [i] ->write(request[i].front()._num_reg_rd           );
365                  in_READ_UNIT_OUT_WRITE_RE             [i] ->write(request[i].front()._write_re             );
366                  in_READ_UNIT_OUT_NUM_REG_RE           [i] ->write(request[i].front()._num_reg_re           );
367                }
368            }
369
370          for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
371            in_EXECUTE_UNIT_IN_ACK [i]->write((rand()%100) < percent_transaction_out);
372
373          SC_START(0);
374
375          for (uint32_t i=0; i<_param->_nb_read_unit; i++)
376            if (in_READ_UNIT_OUT_VAL [i]->read() and out_READ_UNIT_OUT_ACK [i]->read())
377              {
378                LABEL("READ_UNIT_OUT   [%d] - Transaction accepted",i);
379              }
380
381          for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
382            if (out_EXECUTE_UNIT_IN_VAL [i]->read() and in_EXECUTE_UNIT_IN_ACK [i]->read())
383              {
384                LABEL("EXECUTE_UNIT_IN [%d] - Transaction accepted (%d)",i,nb_request_out);
385                nb_request_out ++;
386               
387                Tpacket_t packet = (_param->_have_port_packet_id)?out_EXECUTE_UNIT_IN_PACKET_ID[i]->read():0;
388                LABEL("  * packet           : %d",packet);             
389                uint32_t read_unit;
390
391                // find read_unit
392                for (read_unit=0; read_unit<_param->_nb_read_unit; read_unit++)
393                  if (packet == ((_param->_have_port_packet_id)?request[read_unit].front()._packet_id:0))
394                    break;
395
396                LABEL("  * read_unit source : %d",read_unit);
397
398                if (_param->_have_port_packet_id)
399                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_PACKET_ID            [i]->read(), request[read_unit].front()._packet_id            );
400
401                // Authorised link ? read_unit -> execute_unit
402                TEST(bool, _param->_table_routing[read_unit][i], true);
403
404                if (_param->_have_port_context_id)
405                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_CONTEXT_ID           [i]->read(), request[read_unit].front()._context_id           );
406                if (_param->_have_port_front_end_id)
407                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_FRONT_END_ID         [i]->read(), request[read_unit].front()._front_end_id         );
408                if (_param->_have_port_ooo_engine_id)
409                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        [i]->read(), request[read_unit].front()._ooo_engine_id        );
410                TEST(Toperation_t      ,out_EXECUTE_UNIT_IN_OPERATION            [i]->read(), request[read_unit].front()._operation            );
411                TEST(Ttype_t           ,out_EXECUTE_UNIT_IN_TYPE                 [i]->read(), request[read_unit].front()._type                 );
412                TEST(Tlsq_ptr_t        ,out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE[i]->read(), request[read_unit].front()._store_queue_ptr_write);
413                if (_param->_have_port_load_queue_ptr)
414                TEST(Tlsq_ptr_t        ,out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE [i]->read(), request[read_unit].front()._load_queue_ptr_write );
415                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         [i]->read(), request[read_unit].front()._has_immediat         );
416                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_IMMEDIAT             [i]->read(), request[read_unit].front()._immediat             );
417                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_DATA_RA              [i]->read(), request[read_unit].front()._data_ra              );
418                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_DATA_RB              [i]->read(), request[read_unit].front()._data_rb              );
419                TEST(Tspecial_data_t   ,out_EXECUTE_UNIT_IN_DATA_RC              [i]->read(), request[read_unit].front()._data_rc              );
420                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_WRITE_RD             [i]->read(), request[read_unit].front()._write_rd             );
421                TEST(Tgeneral_address_t,out_EXECUTE_UNIT_IN_NUM_REG_RD           [i]->read(), request[read_unit].front()._num_reg_rd           );
422                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_WRITE_RE             [i]->read(), request[read_unit].front()._write_re             );
423                TEST(Tspecial_address_t,out_EXECUTE_UNIT_IN_NUM_REG_RE           [i]->read(), request[read_unit].front()._num_reg_re           );
424               
425                request[read_unit].pop_front();
426              }
427          SC_START(1);
428        }
429
430    }
431
432  /********************************************************
433   * Simulation - End
434   ********************************************************/
435
436  TEST_OK ("End of Simulation");
437  delete _time;
438
439  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
440
441  delete in_CLOCK;
442  delete in_NRESET;
443 
444  delete []  in_READ_UNIT_OUT_VAL                  ;
445  delete [] out_READ_UNIT_OUT_ACK                  ;
446  delete []  in_READ_UNIT_OUT_CONTEXT_ID           ;
447  delete []  in_READ_UNIT_OUT_FRONT_END_ID         ;
448  delete []  in_READ_UNIT_OUT_OOO_ENGINE_ID        ;
449  delete []  in_READ_UNIT_OUT_PACKET_ID            ;
450  delete []  in_READ_UNIT_OUT_OPERATION            ;
451  delete []  in_READ_UNIT_OUT_TYPE                 ;
452  delete []  in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE;
453  delete []  in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ;
454  delete []  in_READ_UNIT_OUT_HAS_IMMEDIAT         ;
455  delete []  in_READ_UNIT_OUT_IMMEDIAT             ;
456  delete []  in_READ_UNIT_OUT_DATA_RA              ;
457  delete []  in_READ_UNIT_OUT_DATA_RB              ;
458  delete []  in_READ_UNIT_OUT_DATA_RC              ;
459  delete []  in_READ_UNIT_OUT_WRITE_RD             ;
460  delete []  in_READ_UNIT_OUT_NUM_REG_RD           ;
461  delete []  in_READ_UNIT_OUT_WRITE_RE             ;
462  delete []  in_READ_UNIT_OUT_NUM_REG_RE           ;
463
464  delete [] out_EXECUTE_UNIT_IN_VAL                  ;
465  delete []  in_EXECUTE_UNIT_IN_ACK                  ;
466  delete [] out_EXECUTE_UNIT_IN_CONTEXT_ID           ;
467  delete [] out_EXECUTE_UNIT_IN_FRONT_END_ID         ;
468  delete [] out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ;
469  delete [] out_EXECUTE_UNIT_IN_PACKET_ID            ;
470  delete [] out_EXECUTE_UNIT_IN_OPERATION            ;
471  delete [] out_EXECUTE_UNIT_IN_TYPE                 ;
472  delete [] out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE;
473  delete [] out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ;
474  delete [] out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ;
475  delete [] out_EXECUTE_UNIT_IN_IMMEDIAT             ;
476  delete [] out_EXECUTE_UNIT_IN_DATA_RA              ;
477  delete [] out_EXECUTE_UNIT_IN_DATA_RB              ;
478  delete [] out_EXECUTE_UNIT_IN_DATA_RC              ;
479  delete [] out_EXECUTE_UNIT_IN_WRITE_RD             ;
480  delete [] out_EXECUTE_UNIT_IN_NUM_REG_RD           ;
481  delete [] out_EXECUTE_UNIT_IN_WRITE_RE             ;
482  delete [] out_EXECUTE_UNIT_IN_NUM_REG_RE           ;
483
484#endif
485
486  delete _Read_unit_to_Execution_unit;
487#ifdef STATISTICS
488  delete _parameters_statistics;
489#endif
490}
Note: See TracBrowser for help on using the repository browser.