OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_verilator/] [simulator.cpp] - Blame information for rev 43

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 32 alirezamon
#include <stdlib.h>
2
#include <stdio.h>
3
#include <unistd.h>
4
#include <string.h>
5 41 alirezamon
#include <limits.h>
6 32 alirezamon
#include <ctype.h>
7
#include <stdint.h>
8
#include <inttypes.h>
9
#include <verilated.h>          // Defines common routines
10 43 alirezamon
//#include "Vrouter1.h"          included in parameter.h
11 32 alirezamon
#include "Vnoc.h"
12
#include "Vtraffic.h"
13 38 alirezamon
#include "parameter.h"
14 43 alirezamon
#include "traffic_task_graph.h"
15
#include "traffic_synthetic.h"
16 32 alirezamon
 
17
 
18 43 alirezamon
#define RATIO_INIT              2
19 38 alirezamon
#define DISABLE -1
20 41 alirezamon
#define MY_VL_SETBIT_W(data,bit) (data[VL_BITWORD_I(bit)] |= (VL_UL(1) << VL_BITBIT_I(bit)))
21 42 alirezamon
#define STND_DEV_EN 1
22 43 alirezamon
#define SYNTHETIC 0
23
#define CUSTOM 1 
24 32 alirezamon
 
25
 
26
//Vrouter *router;
27 43 alirezamon
//Vrouter1              *router1[NR];                     // Included in parameter.h file
28 32 alirezamon
Vnoc                    *noc;
29 43 alirezamon
Vtraffic                *traffic[NE];
30
int reset,clk;
31
int TRAFFIC_TYPE=SYNTHETIC;
32
int PACKET_SIZE=5;
33
int MIN_PACKET_SIZE=5;
34
int MAX_PACKET_SIZE=5;
35
int MAX_PCK_NUM;
36
int MAX_SIM_CLKs;
37
int HOTSPOT_NUM;
38
int C0_p=100, C1_p=0, C2_p=0, C3_p=0;
39 38 alirezamon
char * TRAFFIC;
40
unsigned char FIXED_SRC_DST_PAIR;
41 43 alirezamon
unsigned char  NEw=0;
42 32 alirezamon
unsigned long int main_time = 0;     // Current simulation time
43
unsigned int saved_time = 0;
44
unsigned int total_pck_num=0;
45
unsigned int sum_clk_h2h,sum_clk_h2t;
46
double           sum_clk_per_hop;
47
const int  CC=(C==0)? 1 : C;
48
unsigned int total_pck_num_per_class[CC]={0};
49
unsigned int sum_clk_h2h_per_class[CC]={0};
50
unsigned int sum_clk_h2t_per_class[CC]={0};
51
double           sum_clk_per_hop_per_class[CC]={0};
52 43 alirezamon
unsigned int rsvd_core_total_pck_num[NE]= {0};
53
unsigned int rsvd_core_worst_delay[NE] =  {0};
54
unsigned int sent_core_total_pck_num[NE]= {0};
55
unsigned int sent_core_worst_delay[NE] =  {0};
56
unsigned int random_var[NE] = {100};
57 32 alirezamon
unsigned int clk_counter;
58
unsigned int count_en;
59
unsigned int total_router;
60
char all_done=0;
61
unsigned int flit_counter =0;
62 38 alirezamon
int ratio=RATIO_INIT;
63 32 alirezamon
double first_avg_latency_flit,current_avg_latency_flit;
64
double sc_time_stamp ();
65
int pow2( int );
66
 
67
#if (STND_DEV_EN)
68 42 alirezamon
        //#include <math.h>
69
        double sqroot (double s){
70
                int i;
71
                double root = s/3;
72
                if (s<=0) return 0;
73
                for(i=0;i<32;i++) root = (root +s/root)/2;
74
                return root;
75
        }
76
 
77 32 alirezamon
        double       sum_clk_pow2=0;
78 42 alirezamon
        double       sum_clk_pow2_per_class[C];
79 32 alirezamon
        double standard_dev( double , unsigned int, double);
80
#endif
81
 
82 43 alirezamon
void update_noc_statistic (     int);
83
unsigned char pck_class_in_gen(unsigned int);
84
unsigned int pck_dst_gen_task_graph ( unsigned int);
85 32 alirezamon
void print_statistic (char *);
86
void print_parameter();
87 38 alirezamon
void reset_all_register();
88
unsigned int rnd_between (unsigned int, unsigned int );
89 32 alirezamon
 
90
 
91
 
92
void  usage(){
93 38 alirezamon
        printf(" ./simulator -f [Traffic Pattern file]\n\nor\n");
94
        printf(" ./simulator -t [Traffic Pattern]  -s  [MIN_PCK_SIZE] -m [MAX_PCK_SIZE] -n  [MAX_PCK_NUM]  c    [MAX SIM CLKs]   -i [INJECTION RATIO] -p [class traffic ratios (%%)]  -h[HOTSPOT info] \n");
95 32 alirezamon
        printf("      Traffic Pattern: \"HOTSPOT\" \"RANDOM\" \"TORNADO\" \"BIT_REVERSE\"  \"BIT_COMPLEMENT\"  \"TRANSPOSE1\"   \"TRANSPOSE2\"\n");
96 38 alirezamon
        printf("      MIN_PCK_SIZE: Minimum packet size in flit. The injected packet size is randomly selected between minimum and maximum packet size\n ");
97
        printf("      MAX_PCK_SIZE: Maximum packet size in flit. The injected packet size is randomly selected between minimum and maximum packet size\n ");
98 32 alirezamon
        printf("      MAX_PCK_NUM: total number of sent packets. Simulation will stop when total of sent packet by all nodes reach this number\n");
99
        printf("      MAX_SIM_CLKs: simulation clock limit. Simulation will stop when simulation clock number reach this value \n");
100 38 alirezamon
        printf("      INJECTION_RATIO: packet injection ratio");
101
        printf("      class traffic ratios %%: The percentage of traffic injected for each class. represented in string whit each class ratio is separated by comma. \"n0,n1,n2..\" \n");
102
        printf("      hotspot traffic info: represented in a string with following format:  \"HOTSPOT PERCENTAGE,HOTSPOT NUM,HOTSPOT CORE 1,HOTSPOT CORE 2,HOTSPOT CORE 3,HOTSPOT CORE 4,HOTSPOT CORE 5, ENABLE HOTSPOT CORES SEND \"   \n");
103 32 alirezamon
}
104
 
105
 
106
int parse_string ( char * str, int * array)
107
{
108
    int i=0;
109
    char *pt;
110
    pt = strtok (str,",");
111
    while (pt != NULL) {
112
        int a = atoi(pt);
113
        array[i]=a;
114
        i++;
115
        pt = strtok (NULL, ",");
116
    }
117
   return i;
118
}
119
 
120 43 alirezamon
 
121
unsigned int pck_dst_gen (      unsigned int core_num) {
122
        if(TRAFFIC_TYPE==CUSTOM)        return          pck_dst_gen_task_graph ( core_num);
123
        if((strcmp (TOPOLOGY,"MESH")==0)||(strcmp (TOPOLOGY,"TORUS")==0)) return  pck_dst_gen_2D (core_num);
124
        return pck_dst_gen_1D (core_num);
125
}
126
 
127
 
128
 
129 38 alirezamon
void update_hotspot(char * str){
130
         int i;
131
         int array[1000];
132
         int p;
133
         int acuum=0;
134
         hotspot_st * new_node;
135
         p= parse_string (str, array);
136
         if (p<4){
137
                        printf("Error in hotspot traffic parameters \n");
138
                        exit(1);
139
         }
140
         HOTSPOT_NUM=array[0];
141
         if (p<1+HOTSPOT_NUM*3){
142
                        printf("Error in hotspot traffic parameters \n");
143
                        exit(1);
144
         }
145
         new_node =  (hotspot_st *) malloc( HOTSPOT_NUM * sizeof(hotspot_st));
146
         if( new_node == NULL){
147
        printf("Error: cannot allocate memory for hotspot traffic\n");
148
            exit(1);
149
         }
150
         for (i=1;i<3*HOTSPOT_NUM; i+=3){
151
                new_node[i/3]. ip_num = array[i];
152
            new_node[i/3]. send_enable=array[i+1];
153
            new_node[i/3]. percentage =  acuum + array[i+2];
154
            acuum= new_node[i/3]. percentage;
155
 
156
         }
157
         if(acuum> 1000){
158
                        printf("Warning: The hotspot traffic summation %f exceed than 100 percent.  \n", (float) acuum /10);
159
 
160 43 alirezamon
         }
161 38 alirezamon
         hotspots=new_node;
162
}
163
 
164
 
165
 
166 32 alirezamon
void processArgs (int argc, char **argv )
167
{
168
   char c;
169
   int p;
170
   int array[10];
171 38 alirezamon
   float f;
172 32 alirezamon
 
173
   /* don't want getopt to moan - I can do that just fine thanks! */
174
   opterr = 0;
175
   if (argc < 2)  usage();
176 38 alirezamon
   while ((c = getopt (argc, argv, "t:s:m:n:c:i:p:h:f:")) != -1)
177 32 alirezamon
      {
178
         switch (c)
179
            {
180 38 alirezamon
                case 'f':
181
                        TRAFFIC_TYPE=CUSTOM;
182
                        TRAFFIC=(char *) "CUSTOM from file";
183
                        load_traffic_file(optarg,task_graph_data,task_graph_abstract);
184
                        MAX_PCK_NUM=task_graph_total_pck_num;
185
                        break;
186 32 alirezamon
            case 't':
187
                        TRAFFIC=optarg;
188 38 alirezamon
                        total_active_routers=-1;
189 32 alirezamon
                        break;
190
                case 's':
191 38 alirezamon
                        MIN_PACKET_SIZE=atoi(optarg);
192 32 alirezamon
                        break;
193 38 alirezamon
                case 'm':
194
                        MAX_PACKET_SIZE=atoi(optarg);
195
                        break;
196 32 alirezamon
                case 'n':
197
                         MAX_PCK_NUM=atoi(optarg);
198
                         break;
199
                case 'c':
200
                         MAX_SIM_CLKs=atoi(optarg);
201
                         break;
202 38 alirezamon
                case 'i':
203
                         f=atof(optarg);
204
                         f*=(MAX_RATIO/100);
205
                         ratio= (int) f;
206 32 alirezamon
                         break;
207
                case 'p':
208
                        p= parse_string (optarg, array);
209
                    C0_p=array[0];
210
                    C1_p=array[1];
211
                    C2_p=array[2];
212
                    C3_p=array[3];
213 43 alirezamon
                        break;
214
                case 'h':
215 38 alirezamon
                        update_hotspot(optarg);
216 43 alirezamon
                        break;
217 32 alirezamon
            case '?':
218
               if (isprint (optopt))
219
                  fprintf (stderr, "Unknown option `-%c'.\n", optopt);
220
               else
221
                  fprintf (stderr,
222
                           "Unknown option character `\\x%x'.\n",
223
                           optopt);
224
            default:
225
               usage();
226
               exit(1);
227
            }
228
      }
229 38 alirezamon
   PACKET_SIZE=(MIN_PACKET_SIZE+MAX_PACKET_SIZE)/2;// average packet size
230 32 alirezamon
}
231
 
232
 
233 43 alirezamon
 
234
 
235 32 alirezamon
int main(int argc, char** argv) {
236
        char change_injection_ratio=0,inject_done;
237
        int i,j,x,y;//,report_delay_counter=0;
238
        char file_name[100];
239
        char deafult_out[] = {"result"};
240
        char * out_file_name;
241 43 alirezamon
        unsigned int dest_e_addr;
242
 
243
        while((0x1<<NEw) < NE)NEw++;
244
        while((0x1<<nxw) < T1){nxw++;maskx<<=1; maskx|=1;}
245
        while((0x1<<nyw) < T2){nyw++;masky<<=1; masky|=1;}
246 32 alirezamon
 
247
        Verilated::commandArgs(argc, argv);   // Remember args
248 43 alirezamon
        Vrouter_new();
249 32 alirezamon
        noc                                                             = new Vnoc;
250 43 alirezamon
        for(i=0;i<NE;i++)        traffic[i]  = new Vtraffic;
251 38 alirezamon
 
252
        processArgs ( argc,  argv );
253
 
254
 
255
        FIXED_SRC_DST_PAIR = strcmp (TRAFFIC,"RANDOM") &  strcmp(TRAFFIC,"HOTSPOT") & strcmp(TRAFFIC,"random") & strcmp(TRAFFIC,"hot spot") & strcmp(TRAFFIC,"CUSTOM from file");
256
 
257 32 alirezamon
 
258
        /********************
259
        *       initialize input
260
        *********************/
261
 
262
        reset=1;
263
        reset_all_register();
264 43 alirezamon
        noc->start_i=0;
265 32 alirezamon
 
266 43 alirezamon
    for (i=0;i<NE;i++){
267
        random_var[i] = 100;
268
        traffic[i]->current_e_addr              = endp_addr_encoder(i);
269
        traffic[i]->start=0;
270
        traffic[i]->pck_class_in=  pck_class_in_gen( i);
271
        traffic[i]->pck_size_in=rnd_between(MIN_PACKET_SIZE,MAX_PACKET_SIZE);
272
        dest_e_addr=pck_dst_gen (i);
273
        traffic[i]->dest_e_addr= dest_e_addr;
274
        //printf("src=%u, des_eaddr=%x, dest=%x\n", i,dest_e_addr, endp_addr_decoder(dest_e_addr));
275
        traffic[i]->stop=0;
276
        if(TRAFFIC_TYPE==SYNTHETIC){
277
                traffic[i]->pck_size_in=PACKET_SIZE;
278
                traffic[i]->avg_pck_size_in=PACKET_SIZE;
279
                traffic[i]->ratio=ratio;
280
                traffic[i]->init_weight=1;
281
        }
282 32 alirezamon
        }
283
 
284
        main_time=0;
285
        print_parameter();
286 38 alirezamon
        if(strcmp(TRAFFIC,"CUSTOM from file")) printf("\n\n\n Flit injection ratio per router is =%f \n",(float)ratio*100/MAX_RATIO);
287 32 alirezamon
        //printf("\n\n\n delay= %u clk",router->delay);
288
        while (!Verilated::gotFinish()) {
289
 
290
                if (main_time-saved_time >= 10 ) {
291
                        reset = 0;
292
                }
293
 
294
                if(main_time == saved_time+21){ count_en=1; noc->start_i=1;}//for(i=0;i<NC;i++) traffic[i]->start=1;}
295
                if(main_time == saved_time+26) noc->start_i=0;// for(i=0;i<NC;i++) traffic[i]->start=0;
296 38 alirezamon
 
297
                        if ((main_time % 4) == 0) {
298 32 alirezamon
                        clk = 1;       // Toggle clock
299
                        if(count_en) clk_counter++;
300 38 alirezamon
                        inject_done= ((total_pck_num >= MAX_PCK_NUM) || (clk_counter>= MAX_SIM_CLKs) || total_active_routers == 0);
301 32 alirezamon
                        //if(inject_done) printf("clk_counter=========%d\n",clk_counter);
302 43 alirezamon
                        for (i=0;i<NE;i++){
303
 
304 32 alirezamon
                                // a packet has been received
305
                                if(traffic[i]->update & ~reset){
306 38 alirezamon
                                        update_noc_statistic (i) ;
307
 
308 32 alirezamon
                                }
309
                                // the header flit has been sent out
310
                                if(traffic[i]->hdr_flit_sent ){
311
                                        traffic[i]->pck_class_in=  pck_class_in_gen( i);
312 38 alirezamon
                                        sent_core_total_pck_num[i]++;
313 32 alirezamon
                                        if(!FIXED_SRC_DST_PAIR){
314 43 alirezamon
                                                traffic[i]->pck_size_in=rnd_between(MIN_PACKET_SIZE,MAX_PACKET_SIZE);
315
                                                dest_e_addr=pck_dst_gen (i);
316
                                                traffic[i]->dest_e_addr= dest_e_addr;
317
                                                //printf("src=%u, dest=%x\n", i,endp_addr_decoder(dest_e_addr));
318
 
319 32 alirezamon
                                        }
320
                                }
321
 
322
                                if(traffic[i]->flit_out_wr==1) flit_counter++;
323
 
324
                        }//for
325
                        if(inject_done) {
326 43 alirezamon
                                for (i=0;i<NE;i++) if(traffic[i]->pck_number>0) total_router      =       total_router +1;
327 32 alirezamon
 
328
                                printf(" simulation clock cycles:%d\n",clk_counter);
329
                                printf(" total received flits:%d\n",flit_counter);
330
                                print_statistic(out_file_name);
331
                                change_injection_ratio = 1;
332 43 alirezamon
                                routers_final();
333
                                for(i=0;i<NE;i++) traffic[i]->final();
334 38 alirezamon
                                noc->final();
335 32 alirezamon
                                return 0;
336
                        }
337
                }//if
338
                else
339
                {
340
 
341
                        clk = 0;
342 43 alirezamon
#if (NR<=64)
343 32 alirezamon
                        noc->ni_flit_in_wr =0;
344 41 alirezamon
#else
345
                        for(j=0;j<(sizeof(noc->ni_flit_in_wr)/sizeof(noc->ni_flit_in_wr[0])); j++) noc->ni_flit_in_wr[j]=0;
346 43 alirezamon
#endif
347
 
348
                        connect_all_routers_to_noc ();
349
 
350 32 alirezamon
 
351 43 alirezamon
                        for (i=0;i<NE;i++){
352
                                traffic[i]->current_r_addr              = noc->er_addr[i];
353 32 alirezamon
 
354 38 alirezamon
 
355 41 alirezamon
#if (Fpay<=32)
356 32 alirezamon
                                traffic[i]->flit_in  = noc->ni_flit_out [i];
357 41 alirezamon
#else   
358
        for(j=0;j<(sizeof(traffic[i]->flit_out)/sizeof(traffic[i]->flit_out[0])); j++) traffic[i]->flit_in[j]  = noc->ni_flit_out [i][j];
359
#endif                                  
360 32 alirezamon
                                traffic[i]->credit_in= noc->ni_credit_out[i];
361
 
362
 
363
                                noc->ni_credit_in[i] = traffic[i]->credit_out;
364 41 alirezamon
#if (Fpay<=32)                          
365 32 alirezamon
                                noc->ni_flit_in [i]  = traffic[i]->flit_out;
366 41 alirezamon
#else   
367
        for(j=0;j<(sizeof(traffic[i]->flit_out)/sizeof(traffic[i]->flit_out[0])); j++) noc->ni_flit_in [i][j]  = traffic[i]->flit_out[j];
368
#endif
369 32 alirezamon
 
370 43 alirezamon
#if (NE<=64)
371 32 alirezamon
                                if(traffic[i]->flit_out_wr) noc->ni_flit_in_wr = noc->ni_flit_in_wr | ((vluint64_t)1<<i);
372
                                traffic[i]->flit_in_wr= ((noc->ni_flit_out_wr >> i) & 0x01);
373 41 alirezamon
#else
374
                                if(traffic[i]->flit_out_wr) MY_VL_SETBIT_W(noc->ni_flit_in_wr ,i);
375
                                traffic[i]->flit_in_wr=   (VL_BITISSET_W(noc->ni_flit_out_wr,i)>0);
376
#endif
377 32 alirezamon
 
378
                        }//for
379
                }//else
380
                //if(main_time > 20 && main_time < 30 ) traffic->start=1; else traffic->start=0;
381 43 alirezamon
                //if(main_time == saved_time+25) router1[0]->flit_in_we_all=0;
382 32 alirezamon
                //if((main_time % 250)==0) printf("router->all_done =%u\n",router->all_done);
383
 
384 43 alirezamon
 
385 32 alirezamon
                noc-> clk = clk;
386
                noc-> reset = reset;
387
 
388 43 alirezamon
                for(i=0;i<NE;i++)        {
389
#if (NE<=64)
390 32 alirezamon
                        traffic[i]->start=  ((noc->start_o >>i)&  0x01);
391 41 alirezamon
#else
392
                        traffic[i]->start=   (VL_BITISSET_W(noc->start_o, i)>0);
393
#endif                  
394 32 alirezamon
                        traffic[i]->reset= reset;
395
                        traffic[i]->clk = clk;
396
                }
397 43 alirezamon
 
398
                connect_routers_reset_clk();
399 32 alirezamon
 
400 43 alirezamon
                //evaluate
401 32 alirezamon
                noc->eval();
402 43 alirezamon
                routers_eval();
403
                for(i=0;i<NE;i++) traffic[i]->eval();
404 32 alirezamon
 
405 43 alirezamon
                //router1[0]->eval();            // Evaluate model
406 32 alirezamon
                //printf("clk=%x\n",router->clk );
407
 
408
                main_time++;
409
                //getchar();   
410
 
411
 
412 43 alirezamon
        }// Done simulating
413
 
414
        routers_final();
415
        for(i=0;i<NE;i++) traffic[i]->final();
416 32 alirezamon
        noc->final();
417
 
418
}
419
 
420
 
421
 
422
 
423 38 alirezamon
/*************
424
 * sc_time_stamp
425
 *
426
 * **********/
427 32 alirezamon
double sc_time_stamp () {       // Called by $time in Verilog
428
        return main_time;
429
}
430
 
431
int pow2( int num){
432
        int pw;
433
        pw= (0x1 << num);
434
        return pw;
435
}
436
 
437
 
438
 
439
/**********************************
440
 *
441
 *      update_noc_statistic
442
 *
443
 *
444
 *********************************/
445
 
446 43 alirezamon
void update_noc_statistic (     int     core_num){
447 38 alirezamon
        unsigned int    clk_num_h2h =traffic[core_num]->time_stamp_h2h;
448
        unsigned int    clk_num_h2t =traffic[core_num]->time_stamp_h2t;
449
    unsigned int    distance=traffic[core_num]->distance;
450
    unsigned int        class_num=traffic[core_num]->pck_class_out;
451 43 alirezamon
    unsigned int    src_e_addr=traffic[core_num]->src_e_addr;
452
    unsigned int        src = endp_addr_decoder (src_e_addr);
453
        total_pck_num+=1;
454
        if((total_pck_num & 0Xffff )==0 ) printf(" packet sent total=%d\n",total_pck_num);
455 38 alirezamon
        sum_clk_h2h+=clk_num_h2h;
456
        sum_clk_h2t+=clk_num_h2t;
457 32 alirezamon
#if (STND_DEV_EN)
458 38 alirezamon
        sum_clk_pow2+=(double)clk_num_h2h * (double) clk_num_h2h;
459
        sum_clk_pow2_per_class[class_num]+=(double)clk_num_h2h * (double) clk_num_h2h;
460 43 alirezamon
#endif                                          
461 38 alirezamon
        sum_clk_per_hop+= ((double)clk_num_h2h/(double)distance);
462
        total_pck_num_per_class[class_num]+=1;
463
        sum_clk_h2h_per_class[class_num]+=clk_num_h2h ;
464
        sum_clk_h2t_per_class[class_num]+=clk_num_h2t ;
465
        sum_clk_per_hop_per_class[class_num]+= ((double)clk_num_h2h/(double)distance);
466
        rsvd_core_total_pck_num[core_num]=rsvd_core_total_pck_num[core_num]+1;
467
        if (rsvd_core_worst_delay[core_num] < clk_num_h2t) rsvd_core_worst_delay[core_num] = (strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0)?  clk_num_h2t :  clk_num_h2h;
468
    if (sent_core_worst_delay[src] < clk_num_h2t) sent_core_worst_delay[src] = (strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0)?  clk_num_h2t :  clk_num_h2h;
469
}
470 32 alirezamon
 
471
 
472
 
473
void print_statistic (char * out_file_name){
474
        double avg_latency_per_hop,  avg_latency_flit, avg_latency_pck, avg_throughput,min_avg_latency_per_class;
475
        int i;
476
#if (STND_DEV_EN)
477
        double  std_dev;
478
#endif
479
                                        char file_name[100];
480 38 alirezamon
                                        avg_throughput= ((double)(flit_counter*100)/total_router )/clk_counter;
481 32 alirezamon
                                        printf(" Total active routers: %d \n",total_router);
482
                                        printf(" Avg throughput is: %f (flits/clk/node %%)\n",    avg_throughput);
483
                        avg_latency_flit   = (double)sum_clk_h2h/total_pck_num;
484
                        avg_latency_pck    = (double)sum_clk_h2t/total_pck_num;
485
                        if(ratio==RATIO_INIT) first_avg_latency_flit=avg_latency_flit;
486
#if (STND_DEV_EN)
487
                        std_dev= standard_dev( sum_clk_pow2,total_pck_num, avg_latency_flit);
488 42 alirezamon
                        printf(" standard_dev = %f\n",std_dev);
489
 
490 32 alirezamon
                       // sprintf(file_name,"%s_std.txt",out_file_name);
491
                        //update_file( file_name,avg_throughput,std_dev);
492
 
493
#endif
494
                        avg_latency_per_hop    = (double)sum_clk_per_hop/total_pck_num;
495
                        printf   ("\nall : \n");
496
                      //  sprintf(file_name,"%s_all.txt",out_file_name);
497
                        //update_file(file_name ,ratio,avg_latency );
498
if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0){
499
                        printf(" Total number of packet = %d \n average latency per hop = %f \n average latency = %f\n",total_pck_num,avg_latency_per_hop,avg_latency_pck);
500
                      // update_file(file_name ,avg_throughput,avg_latency_pck);
501
 
502
}else{
503
                         printf(" Total number of packet = %d \n average latency per hop = %f \n average latency = %f\n",total_pck_num,avg_latency_per_hop,avg_latency_flit);
504
                     //   update_file(file_name ,avg_throughput,avg_latency_flit);
505
 
506
}
507
                        //fwrite(fp,"%d,%f,%f,%f,",total_pck_num,avg_latency_per_hop,avg_latency,max_latency_per_hop);
508
                        min_avg_latency_per_class=1000000;
509
                        for(i=0;i<C;i++){
510
                                avg_throughput           = (total_pck_num_per_class[i]>0)? ((double)(total_pck_num_per_class[i]*PACKET_SIZE*100)/total_router )/clk_counter:0;
511
                                                avg_latency_flit         = (total_pck_num_per_class[i]>0)? (double)sum_clk_h2h_per_class[i]/total_pck_num_per_class[i]:0;
512
                                                avg_latency_pck          = (total_pck_num_per_class[i]>0)? (double)sum_clk_h2t_per_class[i]/total_pck_num_per_class[i]:0;
513
                                                avg_latency_per_hop  = (total_pck_num_per_class[i]>0)? (double)sum_clk_per_hop_per_class[i]/total_pck_num_per_class[i]:0;
514
if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0){
515
                                                 printf  ("\nclass : %d  \n",i);
516
                            printf      (" Total number of packet  = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f\n",total_pck_num_per_class[i],avg_throughput,avg_latency_per_hop,avg_latency_pck);
517
                            //sprintf(file_name,"%s_c%u.txt",out_file_name,i);
518
                           // update_file( file_name,avg_throughput,avg_latency_pck );
519
}else{
520
 
521
printf   ("\nclass : %d  \n",i);
522
                            printf      (" Total number of packet  = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f\n",total_pck_num_per_class[i],avg_throughput,avg_latency_per_hop,avg_latency_flit);
523
                           // sprintf(file_name,"%s_c%u.txt",out_file_name,i);
524
                           // update_file( file_name,avg_throughput,avg_latency_flit );
525
 
526
 
527
}
528
                            if(min_avg_latency_per_class > avg_latency_flit) min_avg_latency_per_class=avg_latency_flit;
529
 
530
#if (STND_DEV_EN)
531
                            std_dev= (total_pck_num_per_class[i]>0)?  standard_dev( sum_clk_pow2_per_class[i],total_pck_num_per_class[i], avg_latency_flit):0;
532
                           // sprintf(file_name,"%s_std%u.txt",out_file_name,i);
533
                           // update_file( file_name,avg_throughput,std_dev);
534
 
535
#endif
536
                         }//for
537
                        current_avg_latency_flit=min_avg_latency_per_class;
538
 
539 43 alirezamon
        for (i=0;i<NE;i++) {
540 38 alirezamon
                printf   ("\n\nCore %d\n",i);
541
                        printf   ("\n\ttotal number of received packets: %u\n",rsvd_core_total_pck_num[i]);
542
                        printf   ("\n\tworst-case-delay of received pckets (clks): %u\n",rsvd_core_worst_delay[i] );
543
                        printf   ("\n\ttotal number of sent packets: %u\n",traffic[i]->pck_number);
544
                        printf   ("\n\tworst-case-delay of sent pckets (clks): %u\n",sent_core_worst_delay[i] );
545
        }
546 43 alirezamon
}
547 32 alirezamon
 
548
 
549
void print_parameter (){
550
                printf ("Router parameters: \n");
551
                printf ("\tTopology: %s\n",TOPOLOGY);
552
                printf ("\tRouting algorithm: %s\n",ROUTE_NAME);
553
                printf ("\tVC_per port: %d\n", V);
554
                printf ("\tBuffer_width: %d\n", B);
555 43 alirezamon
if((strcmp (TOPOLOGY,"MESH")==0)||(strcmp (TOPOLOGY,"TORUS")==0)){
556
            printf ("\tRouter num in row: %d \n",T1);
557
            printf ("\tRouter num in column: %d \n",T2);
558
}else if ((strcmp (TOPOLOGY,"RING")==0)||(strcmp (TOPOLOGY,"LINE")==0)){
559
                printf ("\t Total Router num: %d \n",T1);
560
}
561
else{
562
                printf ("\tK: %d \n",T1);
563
                printf ("\tL: %d \n",T2);
564
}
565 32 alirezamon
            printf ("\tNumber of Class: %d\n", C);
566
            printf ("\tFlit data width: %d \n", Fpay);
567
            printf ("\tVC reallocation mechanism: %s \n",  VC_REALLOCATION_TYPE);
568
            printf ("\tVC/sw combination mechanism: %s \n", COMBINATION_TYPE);
569
            printf ("\tAVC_ATOMIC_EN:%d \n", AVC_ATOMIC_EN);
570
            printf ("\tCongestion Index:%d \n",CONGESTION_INDEX);
571
            printf ("\tADD_PIPREG_AFTER_CROSSBAR:%d\n",ADD_PIPREG_AFTER_CROSSBAR);
572 38 alirezamon
            printf ("\tSSA_EN enabled:%s \n",SSA_EN);
573
            printf ("\tSwitch allocator arbitration type:%s \n",SWA_ARBITER_TYPE);
574 43 alirezamon
            printf ("\tMinimum supported packet size:%d flit(s) \n",MIN_PCK_SIZE);
575 32 alirezamon
 
576
 
577 38 alirezamon
        printf ("\nSimulation parameters\n");
578 32 alirezamon
#if(DEBUG_EN)
579 38 alirezamon
    printf ("\tDebuging is enabled\n");
580 32 alirezamon
#else
581 38 alirezamon
    printf ("\tDebuging is disabled\n");
582 32 alirezamon
#endif
583 38 alirezamon
        if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0)printf ("\tOutput is the average latency on sending the packet header until receiving tail\n");
584
        else printf ("\tOutput is the average latency on sending the packet header until receiving header flit at destination node\n");
585 32 alirezamon
        printf ("\tTraffic pattern:%s\n",TRAFFIC);
586
        if(C>0) printf ("\ttraffic percentage of class 0 is : %d\n", C0_p);
587
        if(C>1) printf ("\ttraffic percentage of class 1 is : %d\n", C1_p);
588
        if(C>2) printf ("\ttraffic percentage of class 2 is : %d\n", C2_p);
589
        if(C>3) printf ("\ttraffic percentage of class 3 is : %d\n", C3_p);
590 38 alirezamon
        if(strcmp (TRAFFIC,"HOTSPOT")==0){
591
                //printf ("\tHot spot percentage: %u\n", HOTSPOT_PERCENTAGE);
592 32 alirezamon
            printf ("\tNumber of hot spot cores: %d\n", HOTSPOT_NUM);
593
 
594
        }
595
            //printf ("\tTotal packets sent by one router: %u\n", TOTAL_PKT_PER_ROUTER);
596 38 alirezamon
                printf ("\tSimulation timeout =%d\n", MAX_SIM_CLKs);
597
                printf ("\tSimulation ends on total packet num of =%d\n", MAX_PCK_NUM);
598
            printf ("\tPacket size (min,max,average) in flits: (%u,%u,%u)\n",MIN_PACKET_SIZE,MAX_PACKET_SIZE,PACKET_SIZE);
599
            printf ("\tPacket injector FIFO width in flit:%u \n",TIMSTMP_FIFO_NUM);
600 32 alirezamon
}
601
 
602
 
603 38 alirezamon
 
604
 
605
 
606 32 alirezamon
/************************
607
 *
608
 *      reset system
609
 *
610
 *
611
 * *******************/
612
 
613
void reset_all_register (void){
614
        int i;
615
         total_router=0;
616
         total_pck_num=0;
617
         sum_clk_h2h=0;
618
         sum_clk_h2t=0;
619
#if (STND_DEV_EN)
620
         sum_clk_pow2=0;
621
#endif
622
 
623
         sum_clk_per_hop=0;
624
         count_en=0;
625
         clk_counter=0;
626
 
627
         for(i=0;i<C;i++)
628
         {
629
                 total_pck_num_per_class[i]=0;
630
             sum_clk_h2h_per_class[i]=0;
631
             sum_clk_h2t_per_class[i]=0;
632
                 sum_clk_per_hop_per_class[i]=0;
633
#if (STND_DEV_EN)
634
                 sum_clk_pow2_per_class[i]=0;
635
#endif
636
 
637
         }  //for
638
         flit_counter=0;
639
}
640
 
641
 
642
 
643
 
644
/***********************
645
 *
646
 *      standard_dev
647
 *
648
 * ******************/
649
 
650
#if (STND_DEV_EN)
651 42 alirezamon
/************************
652
 * std_dev = sqrt[(B-A^2/N)/N]  = sqrt [(B/N)- (A/N)^2] = sqrt [B/N - mean^2]
653
 * A = sum of the values
654
 * B = sum of the squarded values
655
 * *************/
656 32 alirezamon
 
657
double standard_dev( double sum_pow2, unsigned int  total_num, double average){
658
        double std_dev;
659 42 alirezamon
 
660
        /*
661
        double  A, B, N;
662
        N= total_num;
663
        A= average * N;
664
        B= sum_pow2;
665 32 alirezamon
 
666 42 alirezamon
        A=(A*A)/N;
667
        std_dev = (B-A)/N;
668 32 alirezamon
        std_dev = sqrt(std_dev);
669 42 alirezamon
*/
670 32 alirezamon
 
671 42 alirezamon
        std_dev = sum_pow2/(double)total_num; //B/N
672
        std_dev -= (average*average);// (B/N) - mean^2
673
        std_dev = sqroot(std_dev);// sqrt [B/N - mean^2]
674
 
675 32 alirezamon
        return std_dev;
676
 
677
}
678
 
679
#endif
680
 
681
 
682
 
683
/**********************
684
 *
685
 *      pck_class_in_gen
686
 *
687
 * *****************/
688
 
689
unsigned char  pck_class_in_gen(
690
         unsigned int  core_num
691
 
692
) {
693
        unsigned char pck_class_in;
694
        unsigned char  rnd=rand()%100;
695
        pck_class_in=     ( rnd <    C0_p               )?  0:
696
                                  ( rnd <   (C0_p+C1_p) )?      1:
697
                                  ( rnd <   (C0_p+C1_p+C2_p))?2:3;
698
    return pck_class_in;
699
}
700
 
701 38 alirezamon
 
702 32 alirezamon
 
703
 
704 38 alirezamon
void update_injct_var(unsigned int src,  unsigned int injct_var){
705
        //printf("before%u=%u\n",src,random_var[src]);
706
        random_var[src]= rnd_between(100-injct_var, 100+injct_var);
707
        //printf("after=%u\n",random_var[src]);
708
}
709
 
710
unsigned int pck_dst_gen_task_graph ( unsigned int src){
711
         task_t  task;
712
        float f,v;
713
 
714
        int index = task_graph_abstract[src].active_index;
715
 
716
        if(index == DISABLE){
717
                traffic[src]->ratio=0;
718
                traffic[src]->stop=1;
719
                 return src; //disable sending
720
        }
721
 
722
        if(     read(task_graph_data[src],index,&task)==0){
723
                traffic[src]->ratio=0;
724
                traffic[src]->stop=1;
725
                 return src; //disable sending
726
 
727
        }
728
 
729
        if(sent_core_total_pck_num[src] & 0xFF){//sent 255 packets
730
                        //printf("uu=%u\n",task.jnjct_var);
731
                        update_injct_var(src, task.jnjct_var);
732
 
733
                }
734
 
735
        task_graph_total_pck_num++;
736
        task.pck_sent = task.pck_sent +1;
737
        task.burst_sent= task.burst_sent+1;
738
        task.byte_sent = task.byte_sent + (task.avg_pck_size * (Fpay/8) );
739
 
740
        traffic[src]->pck_class_in=  pck_class_in_gen(src);
741
        traffic[src]->avg_pck_size_in=task.avg_pck_size;
742
        traffic[src]->pck_size_in=rnd_between(task.min_pck_size,task.max_pck_size);
743
 
744
        f=  task.injection_rate;
745
        v= random_var[src];
746
        f*= (v /100);
747
        if(f>100) f= 100;
748
        f=  f * MAX_RATIO / 100;
749
 
750
        traffic[src]->ratio=(unsigned int)f;
751
        traffic[src]->init_weight=task.initial_weight;
752
 
753
        if (task.burst_sent >= task.burst_size){
754
                task.burst_sent=0;
755
                task_graph_abstract[src].active_index=task_graph_abstract[src].active_index+1;
756
                if(task_graph_abstract[src].active_index>=task_graph_abstract[src].total_index) task_graph_abstract[src].active_index=0;
757
 
758
        }
759
 
760
        update_by_index(task_graph_data[src],index,task);
761
 
762
        if (task.byte_sent  >= task.bytes){ // This task is done remove it from the queue
763
                                remove_by_index(&task_graph_data[src],index);
764
                                task_graph_abstract[src].total_index = task_graph_abstract[src].total_index-1;
765
                                if(task_graph_abstract[src].total_index==0){ //all tasks are done turned off the core
766
                                        task_graph_abstract[src].active_index=-1;
767
                                        traffic[src]->ratio=0;
768
                                        traffic[src]->stop=1;
769
                                        if(total_active_routers!=0) total_active_routers--;
770
                                        return src;
771
                                }
772
                                if(task_graph_abstract[src].active_index>=task_graph_abstract[src].total_index) task_graph_abstract[src].active_index=0;
773
        }
774
 
775
        return task.dst;
776
}
777
 
778
 
779
 
780
 
781
 
782
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.