source: trunk/IPs/systemC/Environment/selftest/main.cpp @ 85

Last change on this file since 85 was 81, checked in by rosiere, 16 years ago
  • Finish Environment (and test)
  • Continue predictor_unit
  • Add external tools
  • svn keyword "Id" set
  • Property svn:keywords set to Id
File size: 46.6 KB
Line 
1#include <iostream>
2#include "../include/Environment.h"
3
4using namespace std;
5using namespace environment;
6
7#define _TEST_IMEMORY_ true
8#define _TEST_DMEMORY_ true
9#define _TEST_TTY_     true
10#define _TEST_RAMLOCK_ true
11#define _TEST_SIM2OS_  true
12
13#define TEST(x,y)                               \
14  {                                             \
15    cout << "Line " << __LINE__ << " : ";       \
16    if (x==y)                                   \
17      {                                         \
18        cout << "Test OK" << endl;              \
19      }                                         \
20    else                                        \
21      {                                         \
22        cout << "Test KO" << endl;              \
23        exit (EXIT_FAILURE);                    \
24      }                                         \
25  } while (0)
26
27int sc_main (int argc, char * argv[])
28{
29  cout << "<main> Begin" << endl;
30
31  {
32    uint32_t    nb_entity = 2;
33   
34    uint32_t  * iaccess_nb_context    = new uint32_t [nb_entity];
35    uint32_t  * iaccess_nb_instruction= new uint32_t [nb_entity];
36    uint32_t  * iaccess_nb_packet     = new uint32_t [nb_entity];
37    uint32_t  * iaccess_size_address  = new uint32_t [nb_entity];
38    uint32_t  * iaccess_size_data     = new uint32_t [nb_entity];
39   
40    uint32_t  * daccess_nb_context    = new uint32_t [nb_entity];
41    uint32_t  * daccess_nb_packet     = new uint32_t [nb_entity];
42    uint32_t  * daccess_size_address  = new uint32_t [nb_entity];
43    uint32_t  * daccess_size_data     = new uint32_t [nb_entity];
44
45    uint32_t  * buffer_irsp_size      = new uint32_t [nb_entity];
46    uint32_t  * buffer_drsp_size      = new uint32_t [nb_entity];
47
48    for (uint32_t i=0; i<nb_entity; i++)
49      {
50        iaccess_nb_context     [i] = 4;
51        iaccess_nb_instruction [i] = 4;
52        iaccess_nb_packet      [i] = 4;
53        iaccess_size_address   [i] = 32;
54        iaccess_size_data      [i] = 32;
55
56        daccess_nb_context     [i] =  4;
57        daccess_nb_packet      [i] =  4;
58        daccess_size_address   [i] = 32;
59        daccess_size_data      [i] = 32;
60
61        buffer_irsp_size       [i] = 8;
62        buffer_drsp_size       [i] = 8;
63      }
64   
65    uint32_t * cache_shared_nb_line       = new uint32_t [1];
66    uint32_t * cache_shared_size_line     = new uint32_t [1];
67    uint32_t * cache_shared_size_word     = new uint32_t [1];
68    uint32_t * cache_shared_associativity = new uint32_t [1];
69    uint32_t * cache_shared_hit_latence   = new uint32_t [1];
70    uint32_t * cache_shared_miss_penality = new uint32_t [1];
71
72    cache_shared_nb_line       [0] = 8 ;
73    cache_shared_size_line     [0] = 8 ;
74    cache_shared_size_word     [0] = 4 ;
75    cache_shared_associativity [0] = 4 ;
76    cache_shared_hit_latence   [0] = 2 ;
77    cache_shared_miss_penality [0] = 5 ;
78
79    uint32_t  * icache_nb_level      = new uint32_t   [nb_entity];
80    uint32_t  * icache_nb_port       = new uint32_t   [nb_entity];
81    uint32_t ** icache_nb_line       = new uint32_t * [nb_entity];
82    uint32_t ** icache_size_line     = new uint32_t * [nb_entity];
83    uint32_t ** icache_size_word     = new uint32_t * [nb_entity];
84    uint32_t ** icache_associativity = new uint32_t * [nb_entity];
85    uint32_t ** icache_hit_latence   = new uint32_t * [nb_entity];
86    uint32_t ** icache_miss_penality = new uint32_t * [nb_entity];
87
88    for (uint32_t i=0; i<nb_entity; i++)
89      {
90        icache_nb_level      [i]    = 1;
91        icache_nb_port       [i]    = 2;
92        icache_nb_line       [i]    = new uint32_t [1];
93        icache_size_line     [i]    = new uint32_t [1];
94        icache_size_word     [i]    = new uint32_t [1];
95        icache_associativity [i]    = new uint32_t [1];
96        icache_hit_latence   [i]    = new uint32_t [1];
97        icache_miss_penality [i]    = new uint32_t [1];
98       
99        icache_nb_line       [i][0] = 8;
100        icache_size_line     [i][0] = 8;
101        icache_size_word     [i][0] = 4;
102        icache_associativity [i][0] = 1;
103        icache_hit_latence   [i][0] = 1;
104        icache_miss_penality [i][0] = 3;
105      }
106
107    uint32_t  * dcache_nb_level      = new uint32_t   [nb_entity];
108    uint32_t  * dcache_nb_port       = new uint32_t   [nb_entity];
109    uint32_t ** dcache_nb_line       = new uint32_t * [nb_entity];
110    uint32_t ** dcache_size_line     = new uint32_t * [nb_entity];
111    uint32_t ** dcache_size_word     = new uint32_t * [nb_entity];
112    uint32_t ** dcache_associativity = new uint32_t * [nb_entity];
113    uint32_t ** dcache_hit_latence   = new uint32_t * [nb_entity];
114    uint32_t ** dcache_miss_penality = new uint32_t * [nb_entity];
115
116    for (uint32_t i=0; i<nb_entity; i++)
117      {
118        dcache_nb_level      [i]    = 1;
119        dcache_nb_port       [i]    = 2;
120        dcache_nb_line       [i]    = new uint32_t [1];
121        dcache_size_line     [i]    = new uint32_t [1];
122        dcache_size_word     [i]    = new uint32_t [1];
123        dcache_associativity [i]    = new uint32_t [1];
124        dcache_hit_latence   [i]    = new uint32_t [1];
125        dcache_miss_penality [i]    = new uint32_t [1];
126       
127        dcache_nb_line       [i][0] = 8;
128        dcache_size_line     [i][0] = 8;
129        dcache_size_word     [i][0] = 4;
130        dcache_associativity [i][0] = 1;
131        dcache_hit_latence   [i][0] = 1;
132        dcache_miss_penality [i][0] = 3;
133      }
134
135    uint32_t   nb_component_tty = 1;
136    uint32_t * tty_address = new uint32_t [nb_component_tty];
137    uint32_t * nb_tty      = new uint32_t [nb_component_tty];
138    tty_address [0] = 0xa0000000;
139    nb_tty      [0] = 4;
140    string  ** name_tty    = new string * [nb_component_tty];
141    name_tty [0]    = new string [nb_tty[0]];
142    name_tty [0][0] = "tty_0_0";
143    name_tty [0][1] = "tty_0_1";
144    name_tty [0][2] = "tty_0_2";
145    name_tty [0][3] = "tty_0_3";
146
147    uint32_t   nb_component_ramlock = 1;
148    uint32_t * ramlock_address = new uint32_t [nb_component_ramlock];
149    uint32_t * nb_lock         = new uint32_t [nb_component_ramlock];
150    ramlock_address [0] = 0xb0000000;
151    nb_lock         [0] = 10;
152
153    uint32_t sim2os_address = 0xc0000000;
154    uint32_t sim2os_size    = 0x00001000;
155    SOCLIB_SEGMENT_TABLE * segtable = new SOCLIB_SEGMENT_TABLE;
156    segtable->setMSBNumber    (8);
157    segtable->setDefaultTarget(0,0);
158   
159    //shared data segment
160    const int TEXT_BASE          = 0x00000000;
161    const int DATA_CACHED_BASE   = 0x10000000;
162    const int DATA_UNCACHED_BASE = 0x40000000;
163   
164    const int TEXT_SIZE          = 0x4000;
165    const int DATA_CACHED_SIZE   = 0x4000;
166    const int DATA_UNCACHED_SIZE = 0x4000;
167   
168    // Add a segment    ,name      ,address of base   ,size              ,global index,local index,uncache
169    segtable->addSegment("text"    ,TEXT_BASE         ,TEXT_SIZE         ,0           ,0          ,false);
170    segtable->addSegment("data"    ,DATA_CACHED_BASE  ,DATA_CACHED_SIZE  ,0           ,0          ,false);
171    segtable->addSegment("data_unc",DATA_UNCACHED_BASE,DATA_UNCACHED_SIZE,0           ,0          ,true );
172
173
174    Parameters * param = new Parameters
175      (nb_entity,
176       
177       iaccess_nb_context,
178       iaccess_nb_instruction,
179       iaccess_nb_packet,
180       iaccess_size_address,
181       iaccess_size_data,
182       
183       daccess_nb_context,
184       daccess_nb_packet,
185       daccess_size_address,
186       daccess_size_data,
187
188       buffer_irsp_size,
189       buffer_drsp_size,
190       
191       icache_nb_level     ,
192       icache_nb_port      ,
193       icache_nb_line      ,
194       icache_size_line    ,
195       icache_size_word    ,
196       icache_associativity,
197       icache_hit_latence  ,
198       icache_miss_penality,
199       dcache_nb_level     ,
200       dcache_nb_port      ,
201       dcache_nb_line      ,
202       dcache_size_line    ,
203       dcache_size_word    ,
204       dcache_associativity,
205       dcache_hit_latence  ,
206       dcache_miss_penality,
207       1                             ,
208//        cache_shared_nb_port          ,
209       cache_shared_nb_line          ,
210       cache_shared_size_line        ,
211       cache_shared_size_word        ,
212       cache_shared_associativity    ,
213       cache_shared_hit_latence      ,
214       cache_shared_miss_penality    ,
215       
216       nb_component_tty,
217       tty_address,
218       nb_tty,
219       name_tty,
220       false,
221       
222       nb_component_ramlock,
223       ramlock_address,
224       nb_lock,
225       
226       sim2os_address,
227       sim2os_size,
228       segtable
229       );
230
231    segtable->print();
232
233    Environment * env = new Environment ("environment",param);
234
235    const char * filename = "Data/selftest/data/soft.x";
236    const char * sections_text  []  = {".text",NULL}; 
237    const char * sections_data  []  = {".data",".rodata",".bss",".sdata",".sbss", NULL}; 
238
239    env->init("text"   , filename, sections_text);
240    env->init("data"   , filename, sections_data);
241
242//     cout << "<main> Press <Enter> to stop the test" << endl;
243//     getchar();
244
245    //==============================================================================
246    //===== [ DECLARATION ]=========================================================
247    //==============================================================================
248
249    sc_clock                           * CLOCK                 = new sc_clock  ("clock", 1.0, 0.5);
250    sc_signal<bool>                    * NRESET                = new sc_signal<bool> ("NRESET");
251
252    sc_signal<Tcontrol_t           >  *** ICACHE_REQ_VAL        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
253    sc_signal<Tcontrol_t           >  *** ICACHE_REQ_ACK        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
254    sc_signal<Ticache_context_t    >  *** ICACHE_REQ_CONTEXT_ID = new sc_signal<Ticache_context_t    >  ** [nb_entity];
255    sc_signal<Ticache_packet_t     >  *** ICACHE_REQ_PACKET_ID  = new sc_signal<Ticache_packet_t     >  ** [nb_entity];
256    sc_signal<Ticache_address_t    >  *** ICACHE_REQ_ADDRESS    = new sc_signal<Ticache_address_t    >  ** [nb_entity];
257    sc_signal<Ticache_type_t       >  *** ICACHE_REQ_TYPE       = new sc_signal<Ticache_type_t       >  ** [nb_entity];
258
259    sc_signal<Tcontrol_t           >  *** ICACHE_RSP_VAL        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
260    sc_signal<Tcontrol_t           >  *** ICACHE_RSP_ACK        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
261    sc_signal<Ticache_context_t    >  *** ICACHE_RSP_CONTEXT_ID = new sc_signal<Ticache_context_t    >  ** [nb_entity];
262    sc_signal<Ticache_packet_t     >  *** ICACHE_RSP_PACKET_ID  = new sc_signal<Ticache_packet_t     >  ** [nb_entity];
263    sc_signal<Ticache_instruction_t> **** ICACHE_RSP_INSTRUCTION= new sc_signal<Ticache_instruction_t> *** [nb_entity];//[nb_instruction]
264    sc_signal<Ticache_error_t      >  *** ICACHE_RSP_ERROR      = new sc_signal<Ticache_error_t      >  ** [nb_entity];
265
266    sc_signal<Tcontrol_t           >  *** DCACHE_REQ_VAL        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
267    sc_signal<Tcontrol_t           >  *** DCACHE_REQ_ACK        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
268    sc_signal<Tdcache_context_t    >  *** DCACHE_REQ_CONTEXT_ID = new sc_signal<Tdcache_context_t    >  ** [nb_entity];
269    sc_signal<Tdcache_packet_t     >  *** DCACHE_REQ_PACKET_ID  = new sc_signal<Tdcache_packet_t     >  ** [nb_entity];
270    sc_signal<Tdcache_address_t    >  *** DCACHE_REQ_ADDRESS    = new sc_signal<Tdcache_address_t    >  ** [nb_entity];
271    sc_signal<Tdcache_type_t       >  *** DCACHE_REQ_TYPE       = new sc_signal<Tdcache_type_t       >  ** [nb_entity];
272    sc_signal<Tdcache_data_t       >  *** DCACHE_REQ_WDATA      = new sc_signal<Tdcache_data_t       >  ** [nb_entity];
273
274    sc_signal<Tcontrol_t           >  *** DCACHE_RSP_VAL        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
275    sc_signal<Tcontrol_t           >  *** DCACHE_RSP_ACK        = new sc_signal<Tcontrol_t           >  ** [nb_entity];
276    sc_signal<Tdcache_context_t    >  *** DCACHE_RSP_CONTEXT_ID = new sc_signal<Tdcache_context_t    >  ** [nb_entity];
277    sc_signal<Tdcache_packet_t     >  *** DCACHE_RSP_PACKET_ID  = new sc_signal<Tdcache_packet_t     >  ** [nb_entity];
278    sc_signal<Tdcache_data_t       >  *** DCACHE_RSP_RDATA      = new sc_signal<Tdcache_data_t       >  ** [nb_entity];
279    sc_signal<Tdcache_error_t      >  *** DCACHE_RSP_ERROR      = new sc_signal<Tdcache_error_t      >  ** [nb_entity];
280
281    for (uint32_t i=0; i<nb_entity; i++)
282      {
283        ICACHE_REQ_VAL        [i] = new sc_signal<Tcontrol_t           >  * [icache_nb_port[i]];
284        ICACHE_REQ_ACK        [i] = new sc_signal<Tcontrol_t           >  * [icache_nb_port[i]];
285        ICACHE_REQ_CONTEXT_ID [i] = new sc_signal<Ticache_context_t    >  * [icache_nb_port[i]];
286        ICACHE_REQ_PACKET_ID  [i] = new sc_signal<Ticache_packet_t     >  * [icache_nb_port[i]];
287        ICACHE_REQ_ADDRESS    [i] = new sc_signal<Ticache_address_t    >  * [icache_nb_port[i]];
288        ICACHE_REQ_TYPE       [i] = new sc_signal<Ticache_type_t       >  * [icache_nb_port[i]];
289
290        ICACHE_RSP_VAL        [i] = new sc_signal<Tcontrol_t           >  * [icache_nb_port[i]];
291        ICACHE_RSP_ACK        [i] = new sc_signal<Tcontrol_t           >  * [icache_nb_port[i]];
292        ICACHE_RSP_CONTEXT_ID [i] = new sc_signal<Ticache_context_t    >  * [icache_nb_port[i]];
293        ICACHE_RSP_PACKET_ID  [i] = new sc_signal<Ticache_packet_t     >  * [icache_nb_port[i]];
294        ICACHE_RSP_INSTRUCTION[i] = new sc_signal<Ticache_instruction_t> ** [icache_nb_port[i]];//[nb_instruction]
295        ICACHE_RSP_ERROR      [i] = new sc_signal<Ticache_error_t      >  * [icache_nb_port[i]];
296       
297        for (uint32_t j=0; j<icache_nb_port[i]; j++)
298          {
299            ICACHE_REQ_VAL         [i][j] = new sc_signal<Tcontrol_t           > ("");
300            ICACHE_REQ_ACK         [i][j] = new sc_signal<Tcontrol_t           > ("");
301            ICACHE_REQ_CONTEXT_ID  [i][j] = new sc_signal<Ticache_context_t    > ("");
302            ICACHE_REQ_PACKET_ID   [i][j] = new sc_signal<Ticache_packet_t     > ("");
303            ICACHE_REQ_ADDRESS     [i][j] = new sc_signal<Ticache_address_t    > ("");
304            ICACHE_REQ_TYPE        [i][j] = new sc_signal<Ticache_type_t       > ("");
305           
306            ICACHE_RSP_VAL         [i][j] = new sc_signal<Tcontrol_t           > ("");
307            ICACHE_RSP_ACK         [i][j] = new sc_signal<Tcontrol_t           > ("");
308            ICACHE_RSP_CONTEXT_ID  [i][j] = new sc_signal<Ticache_context_t    > ("");
309            ICACHE_RSP_PACKET_ID   [i][j] = new sc_signal<Ticache_packet_t     > ("");
310            ICACHE_RSP_ERROR       [i][j] = new sc_signal<Ticache_error_t      > ("");
311           
312            ICACHE_RSP_INSTRUCTION [i][j] = new sc_signal<Ticache_instruction_t> * [iaccess_nb_instruction[i]];
313           
314            for (uint32_t k=0; k<iaccess_nb_instruction[i]; k++)
315              ICACHE_RSP_INSTRUCTION [i][j][k] = new sc_signal<Ticache_instruction_t> ("");
316
317          }
318       
319        DCACHE_REQ_VAL        [i] = new sc_signal<Tcontrol_t           >  * [dcache_nb_port[i]];
320        DCACHE_REQ_ACK        [i] = new sc_signal<Tcontrol_t           >  * [dcache_nb_port[i]];
321        DCACHE_REQ_CONTEXT_ID [i] = new sc_signal<Tdcache_context_t    >  * [dcache_nb_port[i]];
322        DCACHE_REQ_PACKET_ID  [i] = new sc_signal<Tdcache_packet_t     >  * [dcache_nb_port[i]];
323        DCACHE_REQ_ADDRESS    [i] = new sc_signal<Tdcache_address_t    >  * [dcache_nb_port[i]];
324        DCACHE_REQ_TYPE       [i] = new sc_signal<Tdcache_type_t       >  * [dcache_nb_port[i]];
325        DCACHE_REQ_WDATA      [i] = new sc_signal<Tdcache_data_t       >  * [dcache_nb_port[i]];
326
327        DCACHE_RSP_VAL        [i] = new sc_signal<Tcontrol_t           >  * [dcache_nb_port[i]];
328        DCACHE_RSP_ACK        [i] = new sc_signal<Tcontrol_t           >  * [dcache_nb_port[i]];
329        DCACHE_RSP_CONTEXT_ID [i] = new sc_signal<Tdcache_context_t    >  * [dcache_nb_port[i]];
330        DCACHE_RSP_PACKET_ID  [i] = new sc_signal<Tdcache_packet_t     >  * [dcache_nb_port[i]];
331        DCACHE_RSP_RDATA      [i] = new sc_signal<Tdcache_data_t       >  * [dcache_nb_port[i]];
332        DCACHE_RSP_ERROR      [i] = new sc_signal<Tdcache_error_t      >  * [dcache_nb_port[i]];
333       
334        for (uint32_t j=0; j<dcache_nb_port[i]; j++)
335          {
336            DCACHE_REQ_VAL        [i][j] = new sc_signal<Tcontrol_t           > ("");
337            DCACHE_REQ_ACK        [i][j] = new sc_signal<Tcontrol_t           > ("");
338            DCACHE_REQ_CONTEXT_ID [i][j] = new sc_signal<Tdcache_context_t    > ("");
339            DCACHE_REQ_PACKET_ID  [i][j] = new sc_signal<Tdcache_packet_t     > ("");
340            DCACHE_REQ_ADDRESS    [i][j] = new sc_signal<Tdcache_address_t    > ("");
341            DCACHE_REQ_TYPE       [i][j] = new sc_signal<Tdcache_type_t       > ("");
342            DCACHE_REQ_WDATA      [i][j] = new sc_signal<Tdcache_data_t       > ("");
343           
344            DCACHE_RSP_VAL        [i][j] = new sc_signal<Tcontrol_t           > ("");
345            DCACHE_RSP_ACK        [i][j] = new sc_signal<Tcontrol_t           > ("");
346            DCACHE_RSP_CONTEXT_ID [i][j] = new sc_signal<Tdcache_context_t    > ("");
347            DCACHE_RSP_PACKET_ID  [i][j] = new sc_signal<Tdcache_packet_t     > ("");
348            DCACHE_RSP_RDATA      [i][j] = new sc_signal<Tdcache_data_t       > ("");
349            DCACHE_RSP_ERROR      [i][j] = new sc_signal<Tdcache_error_t      > ("");
350          }
351      }
352   
353    //==============================================================================
354    //===== [ INSTANCE ]============================================================
355    //==============================================================================
356
357    // instance
358    (*(env->CLOCK )) (*(CLOCK ));
359    (*(env->NRESET)) (*(NRESET));
360
361    for (uint32_t i=0; i<nb_entity; i++)
362      {
363        for (uint32_t j=0; j<icache_nb_port[i]; j++)
364          {
365            (*(env->ICACHE_REQ_VAL         [i][j])) (*(ICACHE_REQ_VAL         [i][j]));
366            (*(env->ICACHE_REQ_ACK         [i][j])) (*(ICACHE_REQ_ACK         [i][j]));
367            (*(env->ICACHE_REQ_CONTEXT_ID  [i][j])) (*(ICACHE_REQ_CONTEXT_ID  [i][j]));
368            (*(env->ICACHE_REQ_PACKET_ID   [i][j])) (*(ICACHE_REQ_PACKET_ID   [i][j]));
369            (*(env->ICACHE_REQ_ADDRESS     [i][j])) (*(ICACHE_REQ_ADDRESS     [i][j]));
370            (*(env->ICACHE_REQ_TYPE        [i][j])) (*(ICACHE_REQ_TYPE        [i][j]));
371
372            (*(env->ICACHE_RSP_VAL         [i][j])) (*(ICACHE_RSP_VAL         [i][j]));
373            (*(env->ICACHE_RSP_ACK         [i][j])) (*(ICACHE_RSP_ACK         [i][j]));
374            (*(env->ICACHE_RSP_CONTEXT_ID  [i][j])) (*(ICACHE_RSP_CONTEXT_ID  [i][j]));
375            (*(env->ICACHE_RSP_PACKET_ID   [i][j])) (*(ICACHE_RSP_PACKET_ID   [i][j]));
376            (*(env->ICACHE_RSP_ERROR       [i][j])) (*(ICACHE_RSP_ERROR       [i][j]));
377           
378            for (uint32_t k=0; k<iaccess_nb_instruction[i]; k++)
379              (*(env->ICACHE_RSP_INSTRUCTION [i][j][k])) (*(ICACHE_RSP_INSTRUCTION [i][j][k]));
380
381          }
382       
383        for (uint32_t j=0; j<dcache_nb_port[i]; j++)
384          {
385            (*(env->DCACHE_REQ_VAL        [i][j])) (*(DCACHE_REQ_VAL        [i][j]));
386            (*(env->DCACHE_REQ_ACK        [i][j])) (*(DCACHE_REQ_ACK        [i][j]));
387            (*(env->DCACHE_REQ_CONTEXT_ID [i][j])) (*(DCACHE_REQ_CONTEXT_ID [i][j]));
388            (*(env->DCACHE_REQ_PACKET_ID  [i][j])) (*(DCACHE_REQ_PACKET_ID  [i][j]));
389            (*(env->DCACHE_REQ_ADDRESS    [i][j])) (*(DCACHE_REQ_ADDRESS    [i][j]));
390            (*(env->DCACHE_REQ_TYPE       [i][j])) (*(DCACHE_REQ_TYPE       [i][j]));
391            (*(env->DCACHE_REQ_WDATA      [i][j])) (*(DCACHE_REQ_WDATA      [i][j]));
392
393            (*(env->DCACHE_RSP_VAL        [i][j])) (*(DCACHE_RSP_VAL        [i][j]));
394            (*(env->DCACHE_RSP_ACK        [i][j])) (*(DCACHE_RSP_ACK        [i][j]));
395            (*(env->DCACHE_RSP_CONTEXT_ID [i][j])) (*(DCACHE_RSP_CONTEXT_ID [i][j]));
396            (*(env->DCACHE_RSP_PACKET_ID  [i][j])) (*(DCACHE_RSP_PACKET_ID  [i][j]));
397            (*(env->DCACHE_RSP_RDATA      [i][j])) (*(DCACHE_RSP_RDATA      [i][j]));
398            (*(env->DCACHE_RSP_ERROR      [i][j])) (*(DCACHE_RSP_ERROR      [i][j]));
399          }
400      }
401
402    //==============================================================================
403    //===== [ INIT ]================================================================
404    //==============================================================================
405
406    const uint32_t seed = 0;
407//  const uint32_t seed = static_cast<uint32_t>(time(NULL));
408    srand(seed);
409
410    sc_start(0);
411    // reset
412    NRESET->write(0);
413    sc_start(5);
414    NRESET->write(1);
415    sc_start(1);
416
417//     cout << *env << endl;
418
419    //==============================================================================
420    //===== [ ICACHE ]==============================================================
421    //==============================================================================
422
423    if (_TEST_IMEMORY_)
424      {
425        cout << "Test : ICACHE" << endl;
426        // Test no respons
427       
428        for (uint32_t i = 0; i < param->nb_entity; i++)
429          for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
430            {
431              TEST(ICACHE_RSP_VAL [i][j]->read(), 0);
432              ICACHE_RSP_ACK [i][j]->write(0);
433            }
434       
435        for (uint32_t i = 0; i < param->nb_entity; i++)
436          for (uint32_t j=0; j<param->dcache_dedicated_nb_port [i]; j++)
437            {
438              TEST(DCACHE_RSP_VAL [i][j]->read(), 0);
439              DCACHE_RSP_ACK [i][j]->write(0);
440            }
441       
442        const int32_t percent_transaction_icache_req = 75;
443        const int32_t percent_transaction_icache_rsp = 75;
444       
445        uint32_t packet_req = 0;
446        uint32_t packet_rsp = 0;
447       
448        Ticache_address_t addr_max = 0xf0;
449       
450        do
451          {
452            Ticache_packet_t packet_req_next = packet_req;
453           
454            Ticache_address_t addr = (packet_req_next << 2);
455            for (uint32_t i=0; i<param->nb_entity; i++)
456              for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
457                {
458                  ICACHE_REQ_VAL        [i][j]->write((addr < addr_max) and ((rand()%100)<percent_transaction_icache_req));
459                  ICACHE_REQ_CONTEXT_ID [i][j]->write(0);
460                  ICACHE_REQ_ADDRESS    [i][j]->write(addr);
461                  ICACHE_REQ_PACKET_ID  [i][j]->write(addr>>2);
462                  ICACHE_REQ_TYPE       [i][j]->write(ICACHE_TYPE_LOAD);
463                 
464                  packet_req_next++;
465                  addr += (param->iaccess_nb_instruction[i]<<2);
466                }
467           
468            for (uint32_t i=0; i<param->nb_entity; i++)
469              for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
470                {
471                  ICACHE_RSP_ACK        [i][j]->write((rand()%100)<percent_transaction_icache_rsp) ;
472                }
473           
474            sc_start(1);
475           
476            for (uint32_t i=0; i<param->nb_entity; i++)
477              for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
478                {
479                  cout << "ICACHE_REQ_VALACK (" << ICACHE_REQ_VAL [i][j]->read() << "," << ICACHE_REQ_ACK [i][j]->read() << ")" << endl;
480                  if (ICACHE_REQ_VAL [i][j]->read() and
481                      ICACHE_REQ_ACK [i][j]->read())
482                    {
483                      cout << "packet_req : " << packet_req << endl;
484                      packet_req ++;
485                    }
486                }
487           
488            for (uint32_t i=0; i<param->nb_entity; i++)
489              for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
490                {
491                  cout << "ICACHE_RSP_VALACK (" << ICACHE_RSP_VAL [i][j]->read() << "," << ICACHE_RSP_ACK [i][j]->read() << ")" << endl;
492                  if (ICACHE_RSP_VAL [i][j]->read() and
493                      ICACHE_RSP_ACK [i][j]->read())
494                    {
495                      cout << "packet_rsp : " << packet_rsp << endl;
496                      packet_rsp ++;
497                     
498                      TEST(ICACHE_RSP_ERROR     [i][j]->read(),ICACHE_ERROR_NONE);
499                      TEST(ICACHE_RSP_CONTEXT_ID[i][j]->read(),0);
500                     
501                      Ticache_packet_t packet = ICACHE_RSP_PACKET_ID [i][j]->read();
502                     
503                      for (unsigned int k=0; k<param->iaccess_nb_instruction[i]; k++)
504                        {
505                          Ticache_instruction_t inst = ICACHE_RSP_INSTRUCTION[i][j][k]->read();
506                          cout << "instruction [" << k << "] : " << std::hex << inst << std::dec << endl;
507                         
508                          TEST((inst>>16) , 0x1500); // copdop nop
509                          TEST((inst&0xffff) , ((0xffff ^ (packet+k))+1)); // packet in CA2
510                        }
511                     
512                    }
513                }
514           
515          } while (((packet_req<<2)< addr_max) or
516                   ((packet_rsp<<2)< addr_max));
517       
518        for (uint32_t i=0; i<param->nb_entity; i++)
519          {
520            for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
521              ICACHE_REQ_VAL [i][j]->write(0);
522            for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
523              ICACHE_RSP_ACK [i][j]->write(1);
524          }
525       
526        sc_start(50);
527
528        for (uint32_t i=0; i<param->nb_entity; i++)
529          for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
530            ICACHE_RSP_ACK [i][j]->write(0);
531       
532        cout << "Test : icache - bus error" << endl;
533
534        // 1) in not valid segment
535        ICACHE_REQ_VAL        [0][0]->write(1);
536        ICACHE_REQ_CONTEXT_ID [0][0]->write(0);
537        ICACHE_REQ_ADDRESS    [0][0]->write(0xe0000000);
538        ICACHE_REQ_PACKET_ID  [0][0]->write(21);
539        ICACHE_REQ_TYPE       [0][0]->write(ICACHE_TYPE_LOAD);
540        ICACHE_RSP_ACK        [0][0]->write(1);
541        do
542          {
543            sc_start(1);
544          } while (ICACHE_REQ_ACK [0][0]->read() == 0);
545        ICACHE_REQ_VAL        [0][0]->write(0);
546
547        sc_start (9);
548        TEST(ICACHE_RSP_VAL [0][0]->read(), 0);
549        sc_start (1);
550        TEST(ICACHE_RSP_VAL [0][0]->read(), 1);
551        TEST(ICACHE_RSP_CONTEXT_ID  [0][0]   ->read(), 0);
552        TEST(ICACHE_RSP_PACKET_ID   [0][0]   ->read(), 21);
553        TEST(ICACHE_RSP_INSTRUCTION [0][0][0]->read(), 0xe0000000);
554        TEST(ICACHE_RSP_ERROR       [0][0]   ->read(), ICACHE_ERROR_BUS_ERROR);
555        sc_start (1);
556        TEST(ICACHE_RSP_VAL [0][0]->read(), 0);
557
558        sc_start (10);
559       
560        // 2) in     valid segment but not memory
561        ICACHE_REQ_VAL        [0][0]->write(1);
562        ICACHE_REQ_CONTEXT_ID [0][0]->write(0);
563        ICACHE_REQ_ADDRESS    [0][0]->write(0xa0000000);
564        ICACHE_REQ_PACKET_ID  [0][0]->write(21);
565        ICACHE_REQ_TYPE       [0][0]->write(ICACHE_TYPE_LOAD);
566        ICACHE_RSP_ACK        [0][0]->write(1);
567        do
568          {
569            sc_start(1);
570          } while (ICACHE_REQ_ACK [0][0]->read() == 0);
571        ICACHE_REQ_VAL        [0][0]->write(0);
572
573        sc_start (9);
574        TEST(ICACHE_RSP_VAL [0][0]->read(), 0);
575        sc_start (1);
576        TEST(ICACHE_RSP_VAL [0][0]->read(), 1);
577        TEST(ICACHE_RSP_CONTEXT_ID  [0][0]   ->read(), 0);
578        TEST(ICACHE_RSP_PACKET_ID   [0][0]   ->read(), 21);
579        TEST(ICACHE_RSP_INSTRUCTION [0][0][0]->read(), 0xa0000000);
580        TEST(ICACHE_RSP_ERROR       [0][0]   ->read(), ICACHE_ERROR_BUS_ERROR);
581        sc_start (1);
582        TEST(ICACHE_RSP_VAL [0][0]->read(), 0);
583        ICACHE_RSP_ACK        [0][0]->write(0);
584      }
585
586    //==============================================================================
587    //===== [ TTY ]=================================================================
588    //==============================================================================
589    if (_TEST_TTY_)
590      {
591        cout << "Test : TTY" << endl;
592       
593        for (uint32_t i=0; i<param->nb_entity; i++)
594          for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
595            {
596              DCACHE_REQ_VAL        [i][j]->write(1);
597              DCACHE_REQ_CONTEXT_ID [i][j]->write(0);
598              DCACHE_REQ_PACKET_ID  [i][j]->write(0);
599              DCACHE_REQ_ADDRESS    [i][j]->write(tty_address[0]+(2<<2));
600              DCACHE_REQ_TYPE       [i][j]->write(DCACHE_TYPE_STORE_32);
601              DCACHE_REQ_WDATA      [i][j]->write(0xdeadbeef);
602            }
603       
604        sc_start(1);
605        for (uint32_t i=0; i<param->nb_entity; i++)
606          for (uint32_t j=0; j<param->icache_dedicated_nb_port [i]; j++)
607            DCACHE_REQ_VAL        [i][j]->write(0);
608
609        DCACHE_REQ_VAL        [0][0]->write(1);
610        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_8);
611        DCACHE_REQ_ADDRESS    [0][0]->write(tty_address[0]);
612       
613        char msg1 [] = "kane is back\n";
614       
615        for (uint32_t i=0; i<strlen(msg1); i++)
616          do
617            {
618              DCACHE_REQ_WDATA      [0][0]->write(msg1[i]);
619              sc_start(1);
620            } while (not DCACHE_REQ_ACK [0][0]->read());
621       
622       
623        DCACHE_REQ_ADDRESS    [0][0]->write(tty_address[0]+(2<<4));
624        char msg2 [] = "La Technologie au service de la paix\nEt au nom de kane !!!!!!!!!";
625       
626        for (uint32_t i=0; i<strlen(msg2); i++)
627          do
628            {
629              DCACHE_REQ_WDATA      [0][0]->write(msg2[i]);
630              sc_start(1);
631            } while (not DCACHE_REQ_ACK [0][0]->read());
632       
633        DCACHE_REQ_VAL        [0][0]->write(0);
634       
635        cout << "Test : TTY - bus error" << endl;
636       
637        // 1) bad access : load
638        DCACHE_REQ_VAL        [0][0]->write(1);
639        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
640        DCACHE_REQ_ADDRESS    [0][0]->write(0xa0000000);
641        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
642        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_32);
643        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
644        DCACHE_RSP_ACK        [0][0]->write(1);
645        do
646          {
647            sc_start(1);
648          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
649        DCACHE_REQ_VAL        [0][0]->write(0);
650
651        sc_start (9);
652        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
653        sc_start (1);
654        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
655        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
656        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
657        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xa0000000);
658        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_BUS_ERROR);
659        sc_start (1);
660        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
661        DCACHE_RSP_ACK      [0][0]->write(0);
662       
663        // 2) bad register
664        DCACHE_REQ_VAL        [0][0]->write(1);
665        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
666        DCACHE_REQ_ADDRESS    [0][0]->write(0xa000000c);
667        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
668        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_8);
669        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
670        DCACHE_RSP_ACK        [0][0]->write(1);
671        do
672          {
673            sc_start(1);
674          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
675        DCACHE_REQ_VAL        [0][0]->write(0);
676
677        sc_start (9);
678        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
679        sc_start (1);
680        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
681        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
682        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
683        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xa000000c);
684        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_BUS_ERROR);
685        sc_start (1);
686        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
687        DCACHE_RSP_ACK      [0][0]->write(0);
688
689
690        // 3) bad tty number
691        DCACHE_REQ_VAL        [0][0]->write(1);
692        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
693        DCACHE_REQ_ADDRESS    [0][0]->write(0xa0000040);
694        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
695        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_8);
696        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
697        DCACHE_RSP_ACK        [0][0]->write(1);
698        do
699          {
700            sc_start(1);
701          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
702        DCACHE_REQ_VAL        [0][0]->write(0);
703
704        sc_start (9);
705        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
706        sc_start (1);
707        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
708        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
709        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
710        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xa0000040);
711        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_BUS_ERROR);
712        sc_start (1);
713        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
714        DCACHE_RSP_ACK      [0][0]->write(0);
715      }
716
717    //==============================================================================
718    //===== [ RAMLOCK ]=============================================================
719    //==============================================================================
720    if (_TEST_RAMLOCK_)
721      {
722        cout << "Test : RAMLOCK" << endl;
723
724        // Test if lock : no
725        DCACHE_REQ_VAL        [0][0]->write(1);
726        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
727        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
728        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
729        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
730        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
731        DCACHE_RSP_ACK        [0][0]->write(1);
732        // Wait ack
733        do
734          {
735            sc_start(1);
736          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
737        DCACHE_REQ_VAL        [0][0]->write(0);
738
739        sc_start (9);
740        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
741        sc_start (1);
742        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
743        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
744        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
745        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000000);
746        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
747        sc_start (1);
748        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
749        DCACHE_RSP_ACK      [0][0]->write(0);
750
751        // Test if lock : yes
752        DCACHE_REQ_VAL        [0][0]->write(1);
753        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
754        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
755        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
756        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
757        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
758        DCACHE_RSP_ACK        [0][0]->write(1);
759        // Wait ack
760        do
761          {
762            sc_start(1);
763          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
764        DCACHE_REQ_VAL        [0][0]->write(0);
765
766        sc_start (9);
767        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
768        sc_start (1);
769        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
770        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
771        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
772        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000001);
773        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
774        sc_start (1);
775        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
776        DCACHE_RSP_ACK      [0][0]->write(0);
777
778        // Test if lock : no
779        DCACHE_REQ_VAL        [0][0]->write(1);
780        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
781        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
782        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000004);
783        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
784        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
785        DCACHE_RSP_ACK        [0][0]->write(1);
786        // Wait ack
787        do
788          {
789            sc_start(1);
790          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
791        DCACHE_REQ_VAL        [0][0]->write(0);
792
793        sc_start (9);
794        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
795        sc_start (1);
796        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
797        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
798        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
799        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000000);
800        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
801        sc_start (1);
802        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
803        DCACHE_RSP_ACK      [0][0]->write(0);
804
805        // Test if lock : yes
806        DCACHE_REQ_VAL        [0][0]->write(1);
807        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
808        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
809        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000004);
810        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
811        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
812        DCACHE_RSP_ACK        [0][0]->write(1);
813        // Wait ack
814        do
815          {
816            sc_start(1);
817          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
818        DCACHE_REQ_VAL        [0][0]->write(0);
819
820        sc_start (9);
821        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
822        sc_start (1);
823        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
824        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
825        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
826        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000001);
827        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
828        sc_start (1);
829        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
830        DCACHE_RSP_ACK      [0][0]->write(0);
831
832
833        DCACHE_REQ_VAL        [0][0]->write(1);
834        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
835        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
836        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
837        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_8);
838        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
839
840        sc_start (1);
841
842        // Test if lock : no
843        DCACHE_REQ_VAL        [0][0]->write(1);
844        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
845        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
846        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
847        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
848        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
849        DCACHE_RSP_ACK        [0][0]->write(1);
850        // Wait ack
851        do
852          {
853            sc_start(1);
854          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
855        DCACHE_REQ_VAL        [0][0]->write(0);
856
857        sc_start (9);
858        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
859        sc_start (1);
860        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
861        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
862        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
863        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000000);
864        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
865        sc_start (1);
866        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
867        DCACHE_RSP_ACK      [0][0]->write(0);
868
869        // Test if lock : yes
870        DCACHE_REQ_VAL        [0][0]->write(1);
871        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
872        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
873        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
874        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_8);
875        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
876        DCACHE_RSP_ACK        [0][0]->write(1);
877        // Wait ack
878        do
879          {
880            sc_start(1);
881          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
882        DCACHE_REQ_VAL        [0][0]->write(0);
883
884        sc_start (9);
885        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
886        sc_start (1);
887        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
888        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
889        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
890        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0x00000001);
891        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
892        sc_start (1);
893        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
894        DCACHE_RSP_ACK      [0][0]->write(0);
895
896
897        sc_start (5);
898        // Bus Error
899
900        // 1) size access
901        // Test if lock : yes
902        DCACHE_REQ_VAL        [0][0]->write(1);
903        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
904        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
905        DCACHE_REQ_ADDRESS    [0][0]->write(0xb0000003);
906        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_16);
907        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
908        DCACHE_RSP_ACK        [0][0]->write(1);
909        // Wait ack
910        do
911          {
912            sc_start(1);
913          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
914        DCACHE_REQ_VAL        [0][0]->write(0);
915
916        sc_start (9);
917        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
918        sc_start (1);
919        TEST(DCACHE_RSP_VAL [0][0]->read(), 1);
920        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
921        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
922        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xb0000003);
923        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_BUS_ERROR);
924        sc_start (1);
925        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
926        DCACHE_RSP_ACK      [0][0]->write(0);
927
928      }
929
930    //==============================================================================
931    //===== [ MEMORY ]==============================================================
932    //==============================================================================
933    if (_TEST_DMEMORY_)
934      {
935        cout << "Test : MEMORY" << endl;
936
937        DCACHE_REQ_VAL        [0][0]->write(1);
938        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
939        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
940        DCACHE_REQ_ADDRESS    [0][0]->write(0x10000100);
941        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_32);
942        DCACHE_REQ_WDATA      [0][0]->write(0xdeadbeef);
943        DCACHE_RSP_ACK        [0][0]->write(0);
944        // Wait ack
945        do
946          {
947            sc_start(1);
948          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
949        DCACHE_REQ_VAL        [0][0]->write(0);
950
951
952
953        DCACHE_REQ_VAL        [0][0]->write(1);
954        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
955        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
956        DCACHE_REQ_ADDRESS    [0][0]->write(0x10000100);
957        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_32);
958        DCACHE_REQ_WDATA      [0][0]->write(0x77777777);
959        DCACHE_RSP_ACK        [0][0]->write(1);
960        // Wait ack
961        do
962          {
963            sc_start(1);
964          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
965        DCACHE_REQ_VAL        [0][0]->write(0);
966
967        while (DCACHE_RSP_VAL [0][0]->read() == 0)
968          sc_start (1);
969       
970        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
971        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
972        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xdeadbeef);
973        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
974        sc_start (1);
975        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
976        DCACHE_RSP_ACK      [0][0]->write(0);
977
978
979
980        DCACHE_REQ_VAL        [0][0]->write(1);
981        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
982        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
983        DCACHE_REQ_ADDRESS    [0][0]->write(0x10000100);
984        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_16);
985        DCACHE_REQ_WDATA      [0][0]->write(0x77777777);
986        DCACHE_RSP_ACK        [0][0]->write(1);
987        // Wait ack
988        do
989          {
990            sc_start(1);
991          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
992        DCACHE_REQ_VAL        [0][0]->write(0);
993
994        while (DCACHE_RSP_VAL [0][0]->read() == 0)
995          sc_start (1);
996       
997        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
998        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
999        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xdeaddead);
1000        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
1001        sc_start (1);
1002        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
1003        DCACHE_RSP_ACK      [0][0]->write(0);
1004
1005        DCACHE_REQ_VAL        [0][0]->write(1);
1006        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
1007        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
1008        DCACHE_REQ_ADDRESS    [0][0]->write(0x10000102);
1009        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_16);
1010        DCACHE_REQ_WDATA      [0][0]->write(0x77777777);
1011        DCACHE_RSP_ACK        [0][0]->write(1);
1012        // Wait ack
1013        do
1014          {
1015            sc_start(1);
1016          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
1017        DCACHE_REQ_VAL        [0][0]->write(0);
1018
1019        while (DCACHE_RSP_VAL [0][0]->read() == 0)
1020          sc_start (1);
1021       
1022        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
1023        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
1024        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 0xbeefbeef);
1025        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
1026        sc_start (1);
1027        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
1028        DCACHE_RSP_ACK      [0][0]->write(0);
1029
1030      }
1031
1032    //==============================================================================
1033    //===== [ SIM2OS ]==============================================================
1034    //==============================================================================
1035    if (_TEST_SIM2OS_)
1036      {
1037        cout << "Test : SIM2OS" << endl;
1038
1039        DCACHE_REQ_VAL        [0][0]->write(1);
1040        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
1041        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
1042        DCACHE_REQ_ADDRESS    [0][0]->write(0xc0000000);
1043        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_STORE_32);
1044        DCACHE_REQ_WDATA      [0][0]->write(SERVICE_CLOCK);
1045        DCACHE_RSP_ACK        [0][0]->write(0);
1046        // Wait ack
1047        do
1048          {
1049            sc_start(1);
1050          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
1051        DCACHE_REQ_VAL        [0][0]->write(0);
1052
1053
1054
1055        DCACHE_REQ_VAL        [0][0]->write(1);
1056        DCACHE_REQ_CONTEXT_ID [0][0]->write(0);
1057        DCACHE_REQ_PACKET_ID  [0][0]->write(21);
1058        DCACHE_REQ_ADDRESS    [0][0]->write(0xc0000004);
1059        DCACHE_REQ_TYPE       [0][0]->write(DCACHE_TYPE_LOAD_32);
1060        DCACHE_REQ_WDATA      [0][0]->write(0x77777777);
1061        DCACHE_RSP_ACK        [0][0]->write(1);
1062        // Wait ack
1063        do
1064          {
1065            sc_start(1);
1066          } while (DCACHE_REQ_ACK [0][0]->read() == 0);
1067        DCACHE_REQ_VAL        [0][0]->write(0);
1068
1069        while (DCACHE_RSP_VAL [0][0]->read() == 0)
1070          sc_start (1);
1071       
1072        TEST(DCACHE_RSP_CONTEXT_ID  [0][0]->read(), 0);
1073        TEST(DCACHE_RSP_PACKET_ID   [0][0]->read(), 21);
1074        TEST(DCACHE_RSP_RDATA       [0][0]->read(), 354); // if all test is activate
1075        TEST(DCACHE_RSP_ERROR       [0][0]->read(), DCACHE_ERROR_NONE);
1076        sc_start (1);
1077        TEST(DCACHE_RSP_VAL [0][0]->read(), 0);
1078        DCACHE_RSP_ACK      [0][0]->write(0);
1079
1080       
1081      }
1082
1083    //==============================================================================
1084    //===== [ END TEST ]============================================================
1085    //==============================================================================
1086
1087    cout << "<main> Press <Enter> to stop the test" << endl;
1088    getchar();
1089
1090    delete CLOCK ;
1091    delete NRESET;
1092
1093    for (uint32_t i=0; i<nb_entity; i++)
1094      {
1095        for (uint32_t j=0; j<icache_nb_port[i]; j++)
1096          {
1097            delete ICACHE_REQ_VAL         [i][j];
1098            delete ICACHE_REQ_ACK         [i][j];
1099            delete ICACHE_REQ_CONTEXT_ID  [i][j];
1100            delete ICACHE_REQ_PACKET_ID   [i][j];
1101            delete ICACHE_REQ_ADDRESS     [i][j];
1102            delete ICACHE_REQ_TYPE        [i][j];
1103            delete ICACHE_RSP_VAL         [i][j];
1104            delete ICACHE_RSP_ACK         [i][j];
1105            delete ICACHE_RSP_CONTEXT_ID  [i][j];
1106            delete ICACHE_RSP_PACKET_ID   [i][j];
1107            delete ICACHE_RSP_ERROR       [i][j];
1108
1109            for (uint32_t k=0; k<iaccess_nb_instruction[i]; k++)
1110              delete ICACHE_RSP_INSTRUCTION [i][j][k];
1111
1112            delete [] ICACHE_RSP_INSTRUCTION [i][j];
1113          }
1114        delete [] ICACHE_REQ_VAL         [i];
1115        delete [] ICACHE_REQ_ACK         [i];
1116        delete [] ICACHE_REQ_CONTEXT_ID  [i];
1117        delete [] ICACHE_REQ_PACKET_ID   [i];
1118        delete [] ICACHE_REQ_ADDRESS     [i];
1119        delete [] ICACHE_REQ_TYPE        [i];
1120        delete [] ICACHE_RSP_VAL         [i];
1121        delete [] ICACHE_RSP_ACK         [i];
1122        delete [] ICACHE_RSP_CONTEXT_ID  [i];
1123        delete [] ICACHE_RSP_PACKET_ID   [i];
1124        delete [] ICACHE_RSP_ERROR       [i];
1125        delete [] ICACHE_RSP_INSTRUCTION [i];
1126      }
1127   
1128    delete [] ICACHE_REQ_VAL        ;
1129    delete [] ICACHE_REQ_ACK        ;
1130    delete [] ICACHE_REQ_CONTEXT_ID ;
1131    delete [] ICACHE_REQ_PACKET_ID  ;
1132    delete [] ICACHE_REQ_ADDRESS    ;
1133    delete [] ICACHE_REQ_TYPE       ;
1134    delete [] ICACHE_RSP_VAL        ;
1135    delete [] ICACHE_RSP_ACK        ;
1136    delete [] ICACHE_RSP_CONTEXT_ID ;
1137    delete [] ICACHE_RSP_PACKET_ID  ;
1138    delete [] ICACHE_RSP_INSTRUCTION;
1139    delete [] ICACHE_RSP_ERROR      ;
1140   
1141    for (uint32_t i=0; i<nb_entity; i++)
1142      {
1143        for (uint32_t j=0; j<icache_nb_port[i]; j++)
1144          {
1145            delete DCACHE_REQ_VAL        [i][j];
1146            delete DCACHE_REQ_ACK        [i][j];
1147            delete DCACHE_REQ_CONTEXT_ID [i][j];
1148            delete DCACHE_REQ_PACKET_ID  [i][j];
1149            delete DCACHE_REQ_ADDRESS    [i][j];
1150            delete DCACHE_REQ_TYPE       [i][j];
1151            delete DCACHE_REQ_WDATA      [i][j];
1152            delete DCACHE_RSP_VAL        [i][j];
1153            delete DCACHE_RSP_ACK        [i][j];
1154            delete DCACHE_RSP_CONTEXT_ID [i][j];
1155            delete DCACHE_RSP_PACKET_ID  [i][j];
1156            delete DCACHE_RSP_RDATA      [i][j];
1157            delete DCACHE_RSP_ERROR      [i][j];
1158          }
1159
1160        delete [] DCACHE_REQ_VAL        [i];
1161        delete [] DCACHE_REQ_ACK        [i];
1162        delete [] DCACHE_REQ_CONTEXT_ID [i];
1163        delete [] DCACHE_REQ_PACKET_ID  [i];
1164        delete [] DCACHE_REQ_ADDRESS    [i];
1165        delete [] DCACHE_REQ_TYPE       [i];
1166        delete [] DCACHE_REQ_WDATA      [i];
1167        delete [] DCACHE_RSP_VAL        [i];
1168        delete [] DCACHE_RSP_ACK        [i];
1169        delete [] DCACHE_RSP_CONTEXT_ID [i];
1170        delete [] DCACHE_RSP_PACKET_ID  [i];
1171        delete [] DCACHE_RSP_RDATA      [i];
1172        delete [] DCACHE_RSP_ERROR      [i];
1173      }
1174
1175    delete [] DCACHE_REQ_VAL        ;
1176    delete [] DCACHE_REQ_ACK        ;
1177    delete [] DCACHE_REQ_CONTEXT_ID ;
1178    delete [] DCACHE_REQ_PACKET_ID  ;
1179    delete [] DCACHE_REQ_ADDRESS    ;
1180    delete [] DCACHE_REQ_TYPE       ;
1181    delete [] DCACHE_REQ_WDATA      ;
1182    delete [] DCACHE_RSP_VAL        ;
1183    delete [] DCACHE_RSP_ACK        ;
1184    delete [] DCACHE_RSP_CONTEXT_ID ;
1185    delete [] DCACHE_RSP_PACKET_ID  ;
1186    delete [] DCACHE_RSP_RDATA      ;
1187    delete [] DCACHE_RSP_ERROR      ;
1188   
1189    delete    env;
1190
1191    delete    param;
1192    delete    segtable;
1193
1194    delete [] ramlock_address;
1195    delete [] nb_lock;
1196 
1197    delete [] name_tty [0];
1198    delete [] name_tty;
1199    delete [] tty_address;
1200    delete [] nb_tty;
1201
1202    delete [] cache_shared_nb_line      ;
1203    delete [] cache_shared_size_line    ;
1204    delete [] cache_shared_size_word    ;
1205    delete [] cache_shared_associativity;
1206    delete [] cache_shared_hit_latence  ;
1207    delete [] cache_shared_miss_penality;
1208    delete [] icache_nb_level      ;
1209    delete [] icache_nb_port       ;
1210    delete [] icache_nb_line       [0];
1211    delete [] icache_size_line     [0];
1212    delete [] icache_size_word     [0];
1213    delete [] icache_associativity [0];
1214    delete [] icache_hit_latence   [0];
1215    delete [] icache_miss_penality [0];
1216    delete [] icache_nb_line       [1];
1217    delete [] icache_size_line     [1];
1218    delete [] icache_size_word     [1];
1219    delete [] icache_associativity [1];
1220    delete [] icache_hit_latence   [1];
1221    delete [] icache_miss_penality [1];
1222    delete [] icache_nb_line       ;
1223    delete [] icache_size_line     ;
1224    delete [] icache_size_word     ;
1225    delete [] icache_associativity ;
1226    delete [] icache_hit_latence   ;
1227    delete [] icache_miss_penality ;
1228    delete [] dcache_nb_level      ;
1229    delete [] dcache_nb_port       ;
1230    delete [] dcache_nb_line       [0];
1231    delete [] dcache_size_line     [0];
1232    delete [] dcache_size_word     [0];
1233    delete [] dcache_associativity [0];
1234    delete [] dcache_hit_latence   [0];
1235    delete [] dcache_miss_penality [0];
1236    delete [] dcache_nb_line       [1];
1237    delete [] dcache_size_line     [1];
1238    delete [] dcache_size_word     [1];
1239    delete [] dcache_associativity [1];
1240    delete [] dcache_hit_latence   [1];
1241    delete [] dcache_miss_penality [1];
1242    delete [] dcache_nb_line       ;
1243    delete [] dcache_size_line     ;
1244    delete [] dcache_size_word     ;
1245    delete [] dcache_associativity ;
1246    delete [] dcache_hit_latence   ;
1247    delete [] dcache_miss_penality ;
1248
1249    delete [] iaccess_nb_context    ;
1250    delete [] iaccess_nb_instruction;
1251    delete [] iaccess_nb_packet     ;
1252    delete [] iaccess_size_address  ;
1253    delete [] iaccess_size_data     ;
1254    delete [] daccess_nb_context    ;
1255    delete [] daccess_nb_packet     ;
1256    delete [] daccess_size_address  ;
1257    delete [] daccess_size_data     ;
1258
1259    delete [] buffer_irsp_size;
1260    delete [] buffer_drsp_size;   
1261  }
1262  cout << "<main> End" << endl;
1263 
1264  return EXIT_SUCCESS;
1265}
Note: See TracBrowser for help on using the repository browser.