source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Icache_Access/SelfTest/src/test.cpp @ 88

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

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 14.7 KB
Line 
1/*
2 * $Id: test.cpp 88 2008-12-10 18:31:39Z rosiere $
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
9#include "Behavioural/Core/Icache_Access/SelfTest/include/test.h"
10#include "Behavioural/include/Allocation.h"
11
12typedef struct
13{
14  uint32_t front_end;
15  uint32_t context;
16} thread_id_t;
17
18void test (string name,
19           morpheo::behavioural::core::icache_access::Parameters * _param)
20{
21  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
22
23#ifdef STATISTICS
24  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,CYCLE_MAX);
25#endif
26
27  Tusage_t _usage = USE_ALL;
28
29//   _usage = usage_unset(_usage,USE_SYSTEMC              );
30//   _usage = usage_unset(_usage,USE_VHDL                 );
31//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
32//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
33//   _usage = usage_unset(_usage,USE_POSITION             );
34//   _usage = usage_unset(_usage,USE_STATISTICS           );
35//   _usage = usage_unset(_usage,USE_INFORMATION          );
36
37  Icache_Access * _Icache_Access = new Icache_Access
38    (name.c_str(),
39#ifdef STATISTICS
40     _parameters_statistics,
41#endif
42     _param,
43     _usage);
44 
45#ifdef SYSTEMC
46  if (usage_is_set(_usage,USE_SYSTEMC))
47    {
48  /*********************************************************************
49   * Déclarations des signaux
50   *********************************************************************/
51  string rename;
52
53  sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);         
54  sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
55
56  ALLOC1_SC_SIGNAL(out_ICACHE_REQ_VAL         ,"out_ICACHE_REQ_VAL         ",Tcontrol_t           ,_param->_nb_icache_port);
57  ALLOC1_SC_SIGNAL( in_ICACHE_REQ_ACK         ," in_ICACHE_REQ_ACK         ",Tcontrol_t           ,_param->_nb_icache_port);
58  ALLOC1_SC_SIGNAL(out_ICACHE_REQ_THREAD_ID   ,"out_ICACHE_REQ_THREAD_ID   ",Tcontext_t           ,_param->_nb_icache_port);
59  ALLOC1_SC_SIGNAL(out_ICACHE_REQ_PACKET_ID   ,"out_ICACHE_REQ_PACKET_ID   ",Tpacket_t            ,_param->_nb_icache_port);
60  ALLOC1_SC_SIGNAL(out_ICACHE_REQ_ADDRESS     ,"out_ICACHE_REQ_ADDRESS     ",Ticache_address_t    ,_param->_nb_icache_port);
61  ALLOC1_SC_SIGNAL(out_ICACHE_REQ_TYPE        ,"out_ICACHE_REQ_TYPE        ",Ticache_type_t       ,_param->_nb_icache_port);
62  ALLOC1_SC_SIGNAL( in_ICACHE_RSP_VAL         ," in_ICACHE_RSP_VAL         ",Tcontrol_t           ,_param->_nb_icache_port);
63  ALLOC1_SC_SIGNAL(out_ICACHE_RSP_ACK         ,"out_ICACHE_RSP_ACK         ",Tcontrol_t           ,_param->_nb_icache_port);
64  ALLOC1_SC_SIGNAL( in_ICACHE_RSP_THREAD_ID   ," in_ICACHE_RSP_THREAD_ID   ",Tcontext_t           ,_param->_nb_icache_port);
65  ALLOC1_SC_SIGNAL( in_ICACHE_RSP_PACKET_ID   ," in_ICACHE_RSP_PACKET_ID   ",Tpacket_t            ,_param->_nb_icache_port);
66  ALLOC2_SC_SIGNAL( in_ICACHE_RSP_INSTRUCTION ," in_ICACHE_RSP_INSTRUCTION ",Ticache_instruction_t,_param->_nb_icache_port,_param->_icache_nb_instruction[it1]);
67  ALLOC1_SC_SIGNAL( in_ICACHE_RSP_ERROR       ," in_ICACHE_RSP_ERROR       ",Ticache_error_t      ,_param->_nb_icache_port);
68  ALLOC2_SC_SIGNAL( in_CONTEXT_REQ_VAL        ," in_CONTEXT_REQ_VAL        ",Tcontrol_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
69  ALLOC2_SC_SIGNAL(out_CONTEXT_REQ_ACK        ,"out_CONTEXT_REQ_ACK        ",Tcontrol_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
70//ALLOC2_SC_SIGNAL( in_CONTEXT_REQ_THREAD_ID  ," in_CONTEXT_REQ_THREAD_ID  ",Tcontext_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
71  ALLOC2_SC_SIGNAL( in_CONTEXT_REQ_PACKET_ID  ," in_CONTEXT_REQ_PACKET_ID  ",Tpacket_t            ,_param->_nb_front_end,_param->_nb_context[it1]);
72  ALLOC2_SC_SIGNAL( in_CONTEXT_REQ_ADDRESS    ," in_CONTEXT_REQ_ADDRESS    ",Ticache_address_t    ,_param->_nb_front_end,_param->_nb_context[it1]);
73  ALLOC2_SC_SIGNAL( in_CONTEXT_REQ_TYPE       ," in_CONTEXT_REQ_TYPE       ",Ticache_type_t       ,_param->_nb_front_end,_param->_nb_context[it1]);
74  ALLOC2_SC_SIGNAL(out_CONTEXT_RSP_VAL        ,"out_CONTEXT_RSP_VAL        ",Tcontrol_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
75  ALLOC2_SC_SIGNAL( in_CONTEXT_RSP_ACK        ," in_CONTEXT_RSP_ACK        ",Tcontrol_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
76//ALLOC2_SC_SIGNAL(out_CONTEXT_RSP_THREAD_ID  ,"out_CONTEXT_RSP_THREAD_ID  ",Tcontext_t           ,_param->_nb_front_end,_param->_nb_context[it1]);
77  ALLOC2_SC_SIGNAL(out_CONTEXT_RSP_PACKET_ID  ,"out_CONTEXT_RSP_PACKET_ID  ",Tpacket_t            ,_param->_nb_front_end,_param->_nb_context[it1]);
78  ALLOC3_SC_SIGNAL(out_CONTEXT_RSP_INSTRUCTION,"out_CONTEXT_RSP_INSTRUCTION",Ticache_instruction_t,_param->_nb_front_end,_param->_nb_context[it1],_param->_nb_instruction[it1][it2]);
79  ALLOC2_SC_SIGNAL(out_CONTEXT_RSP_ERROR      ,"out_CONTEXT_RSP_ERROR      ",Ticache_error_t      ,_param->_nb_front_end,_param->_nb_context[it1]);
80 
81  /********************************************************
82   * Instanciation
83   ********************************************************/
84 
85  msg(_("<%s> : Instanciation of _Icache_Access.\n"),name.c_str());
86
87  (*(_Icache_Access->in_CLOCK))        (*(in_CLOCK));
88  (*(_Icache_Access->in_NRESET))       (*(in_NRESET));
89
90  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_REQ_VAL         ,_param->_nb_icache_port);
91  INSTANCE1_SC_SIGNAL(_Icache_Access, in_ICACHE_REQ_ACK         ,_param->_nb_icache_port);
92  if (_param->_have_port_icache_thread_id)
93  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_REQ_THREAD_ID   ,_param->_nb_icache_port);
94  if (_param->_have_port_icache_packet_id)
95  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_REQ_PACKET_ID   ,_param->_nb_icache_port);
96  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_REQ_ADDRESS     ,_param->_nb_icache_port);
97  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_REQ_TYPE        ,_param->_nb_icache_port);
98  INSTANCE1_SC_SIGNAL(_Icache_Access, in_ICACHE_RSP_VAL         ,_param->_nb_icache_port);
99  INSTANCE1_SC_SIGNAL(_Icache_Access,out_ICACHE_RSP_ACK         ,_param->_nb_icache_port);
100  if (_param->_have_port_icache_thread_id)
101  INSTANCE1_SC_SIGNAL(_Icache_Access, in_ICACHE_RSP_THREAD_ID   ,_param->_nb_icache_port);
102  if (_param->_have_port_icache_packet_id)
103  INSTANCE1_SC_SIGNAL(_Icache_Access, in_ICACHE_RSP_PACKET_ID   ,_param->_nb_icache_port);
104  INSTANCE2_SC_SIGNAL(_Icache_Access, in_ICACHE_RSP_INSTRUCTION ,_param->_nb_icache_port,_param->_icache_nb_instruction[it1]);
105  INSTANCE1_SC_SIGNAL(_Icache_Access, in_ICACHE_RSP_ERROR       ,_param->_nb_icache_port);
106  INSTANCE2_SC_SIGNAL(_Icache_Access, in_CONTEXT_REQ_VAL        ,_param->_nb_front_end,_param->_nb_context[it1]);
107  INSTANCE2_SC_SIGNAL(_Icache_Access,out_CONTEXT_REQ_ACK        ,_param->_nb_front_end,_param->_nb_context[it1]);
108//INSTANCE2_SC_SIGNAL(_Icache_Access, in_CONTEXT_REQ_THREAD_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
109  INSTANCE2_SC_SIGNAL(_Icache_Access, in_CONTEXT_REQ_ADDRESS    ,_param->_nb_front_end,_param->_nb_context[it1]);
110  INSTANCE2_SC_SIGNAL(_Icache_Access, in_CONTEXT_REQ_TYPE       ,_param->_nb_front_end,_param->_nb_context[it1]);
111  INSTANCE2_SC_SIGNAL(_Icache_Access,out_CONTEXT_RSP_VAL        ,_param->_nb_front_end,_param->_nb_context[it1]);
112  INSTANCE2_SC_SIGNAL(_Icache_Access, in_CONTEXT_RSP_ACK        ,_param->_nb_front_end,_param->_nb_context[it1]);
113//INSTANCE2_SC_SIGNAL(_Icache_Access,out_CONTEXT_RSP_THREAD_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
114  INSTANCE3_SC_SIGNAL(_Icache_Access,out_CONTEXT_RSP_INSTRUCTION,_param->_nb_front_end,_param->_nb_context[it1],_param->_nb_instruction[it1][it2]);
115  INSTANCE2_SC_SIGNAL(_Icache_Access,out_CONTEXT_RSP_ERROR      ,_param->_nb_front_end,_param->_nb_context[it1]);
116
117  for (uint32_t i=0; i<_param->_nb_front_end; ++i)
118    for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
119      if (_param->_have_port_packet_id [i][j])
120        {
121        INSTANCE_SC_SIGNAL(_Icache_Access, in_CONTEXT_REQ_PACKET_ID [i][j]);
122        INSTANCE_SC_SIGNAL(_Icache_Access,out_CONTEXT_RSP_PACKET_ID [i][j]);
123      }
124
125  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
126   
127  Time * _time = new Time();
128
129  /********************************************************
130   * Simulation - Begin
131   ********************************************************/
132
133  // Initialisation
134
135  const uint32_t seed = 0;
136//const uint32_t seed = static_cast<uint32_t>(time(NULL));
137
138  srand(seed);
139
140  const  int32_t percent_transaction_req = 75;
141  const  int32_t percent_transaction_rsp = 75;
142
143  thread_id_t link_cache_rsp    [_param->_nb_icache_port][_param->_nb_front_end*_param->_max_nb_context];
144  uint32_t    nb_link_cache_rsp [_param->_nb_icache_port];
145 
146  for (uint32_t i=0; i<_param->_nb_icache_port; i++)
147    nb_link_cache_rsp [i] = 0;
148
149  for (uint32_t i=0; i<_param->_nb_front_end; i++)
150    for (uint32_t j=0; j<_param->_nb_context [i]; j++)
151      {
152        uint32_t x = _param->_table_routing [i][j];
153       
154        link_cache_rsp [x][nb_link_cache_rsp[x]].front_end = i;
155        link_cache_rsp [x][nb_link_cache_rsp[x]].context   = j;
156        nb_link_cache_rsp[x] ++;
157      }
158
159  SC_START(0);
160  LABEL("Initialisation");
161
162  LABEL("Reset");
163  in_NRESET->write(0);
164  SC_START(5);
165  in_NRESET->write(1); 
166
167  LABEL("Loop of Test");
168
169  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
170    {
171      LABEL("Iteration %d",iteration);
172
173      for (uint32_t i=0; i<_param->_nb_icache_port; i++)
174        {
175          in_ICACHE_REQ_ACK       [i]->write((rand()%100)<percent_transaction_req);
176
177          uint32_t z = rand()%nb_link_cache_rsp[i];
178          uint32_t x = link_cache_rsp[i][z].front_end;
179          uint32_t y = link_cache_rsp[i][z].context  ;
180         
181          in_ICACHE_RSP_VAL       [i]->write((rand()%100)<percent_transaction_rsp);
182          in_ICACHE_RSP_THREAD_ID [i]->write(_param->_translate_context_to_thread[x][y]);
183          in_ICACHE_RSP_PACKET_ID [i]->write(0);
184          in_ICACHE_RSP_ERROR     [i]->write(0);
185         
186          for (uint32_t j=0; j<_param->_icache_nb_instruction[i]; j++)
187          in_ICACHE_RSP_INSTRUCTION [i][j]->write(0);
188        }
189
190      for (uint32_t i=0; i<_param->_nb_front_end; i++)
191        for (uint32_t j=0; j<_param->_nb_context [i]; j++)
192          {
193            in_CONTEXT_REQ_VAL        [i][j]->write((rand()%100)<percent_transaction_req);
194            in_CONTEXT_REQ_ADDRESS    [i][j]->write(0);
195            in_CONTEXT_REQ_PACKET_ID  [i][j]->write(0);
196            in_CONTEXT_REQ_TYPE       [i][j]->write(0);
197
198            in_CONTEXT_RSP_ACK        [i][j]->write((rand()%100)<percent_transaction_rsp);
199          }
200
201      SC_START(0);
202
203      int32_t nb_request = 0;
204      int32_t nb_respons = 0;
205
206      for (uint32_t i=0; i<_param->_nb_icache_port; i++)
207        {
208          if (out_ICACHE_REQ_VAL [i]->read() and  in_ICACHE_REQ_ACK [i]->read())
209            {
210              LABEL("ICACHE_REQ  [%d] - Transaction Accepted.",i);
211
212              nb_request ++;
213            }
214          if ( in_ICACHE_RSP_VAL [i]->read() and out_ICACHE_RSP_ACK [i]->read())
215            {
216              LABEL("ICACHE_RSP  [%d] - Transaction Accepted.",i);
217
218              nb_respons ++;
219            }
220        }
221
222      for (uint32_t i=0; i<_param->_nb_front_end; i++)
223        for (uint32_t j=0; j<_param->_nb_context [i]; j++)
224          {
225            if (in_CONTEXT_REQ_VAL [i][j]->read() and out_CONTEXT_REQ_ACK [i][j]->read())
226              {
227                LABEL("CONTEXT_REQ [%d][%d] - Transaction Accepted.",i,j);
228               
229                uint32_t x=_param->_table_routing[i][j];
230               
231                TEST(Tcontrol_t,out_ICACHE_REQ_VAL[x]->read(), 1);
232                TEST(Tcontrol_t, in_ICACHE_REQ_ACK[x]->read(), 1);
233               
234                TEST(Tcontext_t       ,out_ICACHE_REQ_THREAD_ID [x]->read(), _param->_translate_context_to_thread[i][j]);
235                TEST(Tpacket_t        ,out_ICACHE_REQ_PACKET_ID [x]->read(), 0);
236                TEST(Ticache_address_t,out_ICACHE_REQ_ADDRESS   [x]->read(), 0);
237                TEST(Ticache_type_t   ,out_ICACHE_REQ_TYPE      [x]->read(), 0);
238               
239                nb_request --;
240              }
241
242            if (out_CONTEXT_RSP_VAL [i][j]->read() and  in_CONTEXT_RSP_ACK [i][j]->read())
243              {
244                LABEL("CONTEXT_RSP [%d][%d] - Transaction Accepted.",i,j);
245
246//   public    : SC_OUT(Tcontrol_t           )  *** out_CONTEXT_RSP_VAL        ;//[nb_front_end][nb_context]
247// //public    : SC_OUT(Tcontext_t           )  *** out_CONTEXT_RSP_THREAD_ID  ;//[nb_front_end][nb_context]
248//   public    : SC_OUT(Tpacket_t            )  *** out_CONTEXT_RSP_PACKET_ID  ;//[nb_front_end][nb_context]
249//   public    : SC_OUT(Ticache_instruction_t) **** out_CONTEXT_RSP_INSTRUCTION;//[nb_front_end][nb_context][nb_instruction]
250//   public    : SC_OUT(Ticache_error_t      )  *** out_CONTEXT_RSP_ERROR      ;//[nb_front_end][nb_context]
251
252                nb_respons --;
253              }
254          }
255     
256      TEST(int32_t, nb_request, 0);
257      TEST(int32_t, nb_respons, 0);
258
259      SC_START(1);
260    }
261
262  /********************************************************
263   * Simulation - End
264   ********************************************************/
265
266  TEST_OK ("End of Simulation");
267  delete _time;
268
269  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
270
271  delete in_CLOCK;
272  delete in_NRESET;
273
274  DELETE1_SC_SIGNAL(out_ICACHE_REQ_VAL         ,_param->_nb_icache_port);
275  DELETE1_SC_SIGNAL( in_ICACHE_REQ_ACK         ,_param->_nb_icache_port);
276  DELETE1_SC_SIGNAL(out_ICACHE_REQ_THREAD_ID   ,_param->_nb_icache_port);
277  DELETE1_SC_SIGNAL(out_ICACHE_REQ_PACKET_ID   ,_param->_nb_icache_port);
278  DELETE1_SC_SIGNAL(out_ICACHE_REQ_ADDRESS     ,_param->_nb_icache_port);
279  DELETE1_SC_SIGNAL(out_ICACHE_REQ_TYPE        ,_param->_nb_icache_port);
280  DELETE1_SC_SIGNAL( in_ICACHE_RSP_VAL         ,_param->_nb_icache_port);
281  DELETE1_SC_SIGNAL(out_ICACHE_RSP_ACK         ,_param->_nb_icache_port);
282  DELETE1_SC_SIGNAL( in_ICACHE_RSP_THREAD_ID   ,_param->_nb_icache_port);
283  DELETE1_SC_SIGNAL( in_ICACHE_RSP_PACKET_ID   ,_param->_nb_icache_port);
284  DELETE2_SC_SIGNAL( in_ICACHE_RSP_INSTRUCTION ,_param->_nb_icache_port,_param->_icache_nb_instruction[it1]);
285  DELETE1_SC_SIGNAL( in_ICACHE_RSP_ERROR       ,_param->_nb_icache_port);
286  DELETE2_SC_SIGNAL( in_CONTEXT_REQ_VAL        ,_param->_nb_front_end,_param->_nb_context[it1]);
287  DELETE2_SC_SIGNAL(out_CONTEXT_REQ_ACK        ,_param->_nb_front_end,_param->_nb_context[it1]);
288//DELETE2_SC_SIGNAL( in_CONTEXT_REQ_THREAD_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
289  DELETE2_SC_SIGNAL( in_CONTEXT_REQ_PACKET_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
290  DELETE2_SC_SIGNAL( in_CONTEXT_REQ_ADDRESS    ,_param->_nb_front_end,_param->_nb_context[it1]);
291  DELETE2_SC_SIGNAL( in_CONTEXT_REQ_TYPE       ,_param->_nb_front_end,_param->_nb_context[it1]);
292  DELETE2_SC_SIGNAL(out_CONTEXT_RSP_VAL        ,_param->_nb_front_end,_param->_nb_context[it1]);
293  DELETE2_SC_SIGNAL( in_CONTEXT_RSP_ACK        ,_param->_nb_front_end,_param->_nb_context[it1]);
294//DELETE2_SC_SIGNAL(out_CONTEXT_RSP_THREAD_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
295  DELETE2_SC_SIGNAL(out_CONTEXT_RSP_PACKET_ID  ,_param->_nb_front_end,_param->_nb_context[it1]);
296  DELETE3_SC_SIGNAL(out_CONTEXT_RSP_INSTRUCTION,_param->_nb_front_end,_param->_nb_context[it1],_param->_nb_instruction[it1][it2]);
297  DELETE2_SC_SIGNAL(out_CONTEXT_RSP_ERROR      ,_param->_nb_front_end,_param->_nb_context[it1]);
298
299    }
300#endif
301
302  delete _Icache_Access;
303#ifdef STATISTICS
304  delete _parameters_statistics;
305#endif
306}
Note: See TracBrowser for help on using the repository browser.