source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Execute_queue/SelfTest/src/test.cpp @ 73

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

add two component :

  • Write Queue (in Moore version)
  • Execute Queue

add macro to help the interface allocation : Allocation.h

File size: 16.0 KB
Line 
1/*
2 * $Id$
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Execute_queue/SelfTest/include/test.h"
10#include "Common/include/Test.h"
11#include "Behavioural/include/Allocation.h"
12#include "Common/include/BitManipulation.h"
13
14#define NB_ITERATION  1
15#define CYCLE_MAX     (128*NB_ITERATION)
16
17#define LABEL(str...)                                                   \
18  {                                                                     \
19    msg (_("{%d} "),static_cast<uint32_t>(sc_simulation_time()));       \
20    msg (str);                                                          \
21    msg (_("\n"));                                                      \
22  } while(0)
23
24#define SC_START(cycle_offset)                                                       \
25  do                                                                                 \
26    {                                                                                \
27      /*cout << "SC_START (begin)" << endl;*/                                        \
28                                                                                     \
29      uint32_t cycle_current = static_cast<uint32_t>(sc_simulation_time());          \
30      if (cycle_offset != 0)                                                         \
31        {                                                                            \
32          cout << "##########[ cycle "<< cycle_current+cycle_offset << " ]" << endl; \
33        }                                                                            \
34                                                                                     \
35      if (cycle_current > CYCLE_MAX)                                                 \
36        {                                                                            \
37          TEST_KO("Maximal cycles Reached");                                         \
38        }                                                                            \
39                                                                                     \
40      sc_start(cycle_offset);                                                        \
41                                                                                     \
42      /*cout << "SC_START (end  )" << endl;*/                                        \
43    } while(0)
44
45  class entry_t
46  {
47  public  : Tcontext_t         _context_id   ;
48  public  : Tcontext_t         _front_end_id ;
49  public  : Tcontext_t         _ooo_engine_id;
50  public  : Tpacket_t          _packet_id    ;
51//public  : Toperation_t       _operation    ;
52//public  : Ttype_t            _type         ;
53  public  : Tspecial_data_t    _flags        ;
54  public  : Texception_t       _exception    ;
55  public  : Tcontrol_t         _no_sequence  ;
56  public  : Tgeneral_data_t    _address      ;
57   
58  public  : entry_t (Tcontext_t         context_id   ,
59                     Tcontext_t         front_end_id ,
60                     Tcontext_t         ooo_engine_id,
61                     Tpacket_t          packet_id    ,
62                     //Toperation_t       operation    ,
63                     //Ttype_t            type         ,
64                     Tspecial_data_t    flags        ,
65                     Texception_t       exception    ,
66                     Tcontrol_t         no_sequence  ,
67                     Tgeneral_data_t    address      )
68    {
69      _context_id    = context_id   ;
70      _front_end_id  = front_end_id ;
71      _ooo_engine_id = ooo_engine_id;
72      _packet_id     = packet_id    ;
73    //_operation     = operation    ;
74    //_type          = type         ;
75      _flags         = flags        ;
76      _exception     = exception    ;
77      _no_sequence   = no_sequence  ;
78      _address       = address      ;
79    };
80
81    friend std::ostream& operator<< (std::ostream& output_stream,
82                                     entry_t & x)
83    {
84      output_stream << " * _context_id    : " << toString(x._context_id   ) << std::endl
85                    << " * _front_end_id  : " << toString(x._front_end_id ) << std::endl
86                    << " * _ooo_engine_id : " << toString(x._ooo_engine_id) << std::endl
87                    << " * _packet_id     : " << toString(x._packet_id    ) << std::endl
88                  //<< " * _operation     : " << toString(x._operation    ) << std::endl
89                  //<< " * _type          : " << toString(x._type         ) << std::endl
90                    << " * _flags         : " << toString(x._flags        ) << std::endl
91                    << " * _exception     : " << toString(x._exception    ) << std::endl
92                    << " * _no_sequence   : " << toString(x._no_sequence  ) << std::endl
93                    << " * _address       : " << toString(x._address      ) << std::endl;
94
95      return output_stream;
96    }
97  };
98
99
100
101
102void test (string name,
103           morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_write_unit::write_unit::execute_queue::Parameters * _param)
104{
105  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
106
107#ifdef STATISTICS
108  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
109#endif
110
111  Execute_queue * _Execute_queue = new Execute_queue (name.c_str(),
112#ifdef STATISTICS
113                                             _parameters_statistics,
114#endif
115                                             _param);
116 
117#ifdef SYSTEMC
118  /*********************************************************************
119   * Déclarations des signaux
120   *********************************************************************/
121  string rename;
122
123  sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);         
124  sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
125
126  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_VAL           ," in_EXECUTE_QUEUE_IN_VAL"           , Tcontrol_t        );
127  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_IN_ACK           ,"out_EXECUTE_QUEUE_IN_ACK"           , Tcontrol_t        );
128  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_CONTEXT_ID    ," in_EXECUTE_QUEUE_IN_CONTEXT_ID"    , Tcontext_t        );
129  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_FRONT_END_ID  ," in_EXECUTE_QUEUE_IN_FRONT_END_ID"  , Tcontext_t        );
130  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID ," in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID" , Tcontext_t        );
131  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_PACKET_ID     ," in_EXECUTE_QUEUE_IN_PACKET_ID"     , Tpacket_t         );
132//ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_OPERATION     ," in_EXECUTE_QUEUE_IN_OPERATION"     , Toperation_t      );
133//ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_TYPE          ," in_EXECUTE_QUEUE_IN_TYPE"          , Ttype_t           );
134  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_FLAGS         ," in_EXECUTE_QUEUE_IN_FLAGS"         , Tspecial_data_t   );
135  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_EXCEPTION     ," in_EXECUTE_QUEUE_IN_EXCEPTION"     , Texception_t      );
136  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_NO_SEQUENCE   ," in_EXECUTE_QUEUE_IN_NO_SEQUENCE"   , Tcontrol_t        );
137  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_ADDRESS       ," in_EXECUTE_QUEUE_IN_ADDRESS"       , Tgeneral_data_t   );
138  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_VAL          ,"out_EXECUTE_QUEUE_OUT_VAL"          , Tcontrol_t        );
139  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_OUT_ACK          ," in_EXECUTE_QUEUE_OUT_ACK"          , Tcontrol_t        );
140  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ,"out_EXECUTE_QUEUE_OUT_CONTEXT_ID"   , Tcontext_t        );
141  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_FRONT_END_ID ,"out_EXECUTE_QUEUE_OUT_FRONT_END_ID" , Tcontext_t        );
142  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID,"out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID", Tcontext_t        );
143  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_PACKET_ID    ,"out_EXECUTE_QUEUE_OUT_PACKET_ID"    , Tpacket_t         );
144//ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_OPERATION    ,"out_EXECUTE_QUEUE_OUT_OPERATION"    , Toperation_t      );
145//ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_TYPE         ,"out_EXECUTE_QUEUE_OUT_TYPE"         , Ttype_t           );
146  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_FLAGS        ,"out_EXECUTE_QUEUE_OUT_FLAGS"        , Tspecial_data_t   );
147  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_EXCEPTION    ,"out_EXECUTE_QUEUE_OUT_EXCEPTION"    , Texception_t      );
148  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ,"out_EXECUTE_QUEUE_OUT_NO_SEQUENCE"  , Tcontrol_t        );
149  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_ADDRESS      ,"out_EXECUTE_QUEUE_OUT_ADDRESS"      , Tgeneral_data_t   );
150
151 
152  /********************************************************
153   * Instanciation
154   ********************************************************/
155 
156  msg(_("<%s> : Instanciation of _Execute_queue.\n"),name.c_str());
157
158  (*(_Execute_queue->in_CLOCK))        (*(in_CLOCK));
159  (*(_Execute_queue->in_NRESET))       (*(in_NRESET));
160
161  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_VAL           );
162  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_IN_ACK           );
163  if (_param->_have_port_context_id)
164  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_CONTEXT_ID    );
165  if (_param->_have_port_front_end_id)
166  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_FRONT_END_ID  );
167  if (_param->_have_port_ooo_engine_id)
168  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID );
169  if (_param->_have_port_packet_id)
170  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_PACKET_ID     );
171//INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_OPERATION     );
172//INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_TYPE          );
173  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_FLAGS         );
174  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_EXCEPTION     );
175  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_NO_SEQUENCE   );
176  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_ADDRESS       );
177
178  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_VAL          );
179  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_OUT_ACK          );
180  if (_param->_have_port_context_id)
181  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_CONTEXT_ID   );
182  if (_param->_have_port_front_end_id)
183  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_FRONT_END_ID );
184  if (_param->_have_port_ooo_engine_id)
185  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID);
186  if (_param->_have_port_packet_id)
187  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_PACKET_ID    );
188//INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_OPERATION    );
189//INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_TYPE         );
190  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_FLAGS        );
191  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_EXCEPTION    );
192  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  );
193  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_ADDRESS      );
194
195  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
196   
197  Time * _time = new Time();
198
199  /********************************************************
200   * Simulation - Begin
201   ********************************************************/
202
203  // Initialisation
204
205  const uint32_t seed = 0;
206//const uint32_t seed = static_cast<uint32_t>(time(NULL));
207
208  const  int32_t percent_transaction_execute_queue_in  = 75;
209  const  int32_t percent_transaction_execute_queue_out = 75;
210
211  entry_t *       request [_param->_nb_packet];
212
213  srand(seed);
214
215  SC_START(0);
216  LABEL("Initialisation");
217
218  LABEL("Reset");
219  in_NRESET->write(0);
220  SC_START(5);
221  in_NRESET->write(1); 
222
223  LABEL("Loop of Test");
224
225  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
226    {
227      LABEL("Iteration %d",iteration);
228
229      for (uint32_t i=0; i<_param->_nb_packet; i++)
230        {
231          request [i] = new entry_t (range<Tcontext_t        >(rand(),_param->_size_context_id      ),
232                                     range<Tcontext_t        >(rand(),_param->_size_front_end_id    ),
233                                     range<Tcontext_t        >(rand(),_param->_size_ooo_engine_id   ),
234                                     i,
235                                   //range<Toperation_t      >(rand(),_param->_size_operation       ),
236                                   //range<Ttype_t           >(rand(),_param->_size_type            ),
237                                     range<Tspecial_data_t   >(rand(),_param->_size_special_data    ),
238                                     range<Texception_t      >(rand(),_param->_size_exception       ),
239                                     range<Tcontrol_t        >(rand(),1                             ),
240                                     range<Tgeneral_data_t   >(rand(),_param->_size_general_data    ));
241        }
242
243            uint32_t nb_request_in  = 0;
244      uint32_t nb_request_out = 0;
245     
246      while (nb_request_out < _param->_nb_packet)
247      {
248        bool val = (((rand()%100)<percent_transaction_execute_queue_in) and
249                    (nb_request_in < _param->_nb_packet));
250       
251        in_EXECUTE_QUEUE_IN_VAL          ->write(val);
252        if (val)
253          {
254            in_EXECUTE_QUEUE_IN_CONTEXT_ID   ->write(request [nb_request_in]->_context_id   );
255            in_EXECUTE_QUEUE_IN_FRONT_END_ID ->write(request [nb_request_in]->_front_end_id );
256            in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID->write(request [nb_request_in]->_ooo_engine_id);
257            in_EXECUTE_QUEUE_IN_PACKET_ID    ->write(request [nb_request_in]->_packet_id    );
258          //in_EXECUTE_QUEUE_IN_OPERATION    ->write(request [nb_request_in]->_operation    );
259          //in_EXECUTE_QUEUE_IN_TYPE         ->write(request [nb_request_in]->_type         );
260            in_EXECUTE_QUEUE_IN_FLAGS        ->write(request [nb_request_in]->_flags        );
261            in_EXECUTE_QUEUE_IN_EXCEPTION    ->write(request [nb_request_in]->_exception    );
262            in_EXECUTE_QUEUE_IN_NO_SEQUENCE  ->write(request [nb_request_in]->_no_sequence  );
263            in_EXECUTE_QUEUE_IN_ADDRESS      ->write(request [nb_request_in]->_address      );
264          }
265        in_EXECUTE_QUEUE_OUT_ACK         ->write((rand()%100)<percent_transaction_execute_queue_out);
266           
267        SC_START(0);
268
269       
270        // ======================================================================
271        // ======================================================================
272        // ======================================================================
273        if ( in_EXECUTE_QUEUE_IN_VAL->read() and
274            out_EXECUTE_QUEUE_IN_ACK->read())
275          {
276            LABEL(" * Accepted EXECUTE_QUEUE_IN  [%d]",nb_request_in);
277//          std::cout << *request [nb_request_in] << std::endl;
278
279            nb_request_in ++;
280          }
281       
282        // ======================================================================
283        // ======================================================================
284        // ======================================================================
285        if (out_EXECUTE_QUEUE_OUT_VAL->read() and
286             in_EXECUTE_QUEUE_OUT_ACK->read())
287          {
288            Tcontext_t packet;
289            if (_param->_have_port_packet_id)
290              packet = out_EXECUTE_QUEUE_OUT_PACKET_ID->read();
291            else
292              packet = 0;
293
294            LABEL(" * Accepted EXECUTE_QUEUE_OUT [%d]",packet);
295//          std::cout << *request [packet] << std::endl;
296
297            if (_param->_have_port_context_id)
298            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ->read(), request [packet]->_context_id   );
299            if (_param->_have_port_front_end_id)
300            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_FRONT_END_ID ->read(), request [packet]->_front_end_id );
301            if (_param->_have_port_ooo_engine_id)
302            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID->read(), request [packet]->_ooo_engine_id);
303          //TEST(Toperation_t   , out_EXECUTE_QUEUE_OUT_OPERATION    ->read(), request [packet]->_operation    );
304          //TEST(Ttype_t        , out_EXECUTE_QUEUE_OUT_TYPE         ->read(), request [packet]->_type         );
305            TEST(Tcontrol_t     , out_EXECUTE_QUEUE_OUT_FLAGS        ->read(), request [packet]->_flags        );
306            TEST(Texception_t   , out_EXECUTE_QUEUE_OUT_EXCEPTION    ->read(), request [packet]->_exception    );
307            TEST(Tcontrol_t     , out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ->read(), request [packet]->_no_sequence  );
308            TEST(Tgeneral_data_t, out_EXECUTE_QUEUE_OUT_ADDRESS      ->read(), request [packet]->_address      );
309
310            nb_request_out ++;
311          }
312
313        SC_START(1);
314      }
315    }
316
317  /********************************************************
318   * Simulation - End
319   ********************************************************/
320
321  TEST_OK ("End of Simulation");
322  delete _time;
323
324  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
325
326  delete in_CLOCK;
327  delete in_NRESET;
328
329  delete     in_EXECUTE_QUEUE_IN_VAL           ;
330  delete    out_EXECUTE_QUEUE_IN_ACK           ;
331  delete     in_EXECUTE_QUEUE_IN_CONTEXT_ID    ;
332  delete     in_EXECUTE_QUEUE_IN_FRONT_END_ID  ;
333  delete     in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID ;
334  delete     in_EXECUTE_QUEUE_IN_PACKET_ID     ;
335//delete     in_EXECUTE_QUEUE_IN_OPERATION     ;
336//delete     in_EXECUTE_QUEUE_IN_TYPE          ;
337  delete     in_EXECUTE_QUEUE_IN_FLAGS         ;
338  delete     in_EXECUTE_QUEUE_IN_EXCEPTION     ;
339  delete     in_EXECUTE_QUEUE_IN_NO_SEQUENCE   ;
340  delete     in_EXECUTE_QUEUE_IN_ADDRESS       ;
341
342  delete    out_EXECUTE_QUEUE_OUT_VAL          ;
343  delete     in_EXECUTE_QUEUE_OUT_ACK          ;
344  delete    out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ;
345  delete    out_EXECUTE_QUEUE_OUT_FRONT_END_ID ;
346  delete    out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID;
347  delete    out_EXECUTE_QUEUE_OUT_PACKET_ID    ;
348//delete    out_EXECUTE_QUEUE_OUT_OPERATION    ;
349//delete    out_EXECUTE_QUEUE_OUT_TYPE         ;
350  delete    out_EXECUTE_QUEUE_OUT_FLAGS        ;
351  delete    out_EXECUTE_QUEUE_OUT_EXCEPTION    ;
352  delete    out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ;
353  delete    out_EXECUTE_QUEUE_OUT_ADDRESS      ;
354#endif
355
356  delete _Execute_queue;
357#ifdef STATISTICS
358  delete _parameters_statistics;
359#endif
360}
Note: See TracBrowser for help on using the repository browser.