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/] [rtl/] [src_modelsim/] [testbench_noc.sv] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
// synthesis translate_off
2 56 alirezamon
`include "pronoc_def.v"
3 48 alirezamon
 
4
`define STND_DEV_EN
5
 
6
module testbench_noc;
7 56 alirezamon
        parameter NOC_ID=0;
8
        `NOC_CONF
9
 
10 48 alirezamon
        `define INCLUDE_SIM_PARAM
11
        `include "sim_param.sv" //will be generated by ProNoC GUI
12
        // simulation parameter setting
13
        // injected packet class percentage
14
        localparam
15
                C0_p=100,
16
                C1_p=0,
17
                C2_p=0,
18
                C3_p=0;
19
 
20
 
21
        localparam RATIOw=$clog2(100);
22
 
23
 
24
        reg     reset ,clk;
25
        reg     start,stop;
26
        wire    sent_done;
27
        reg    done;
28
        reg [RATIOw-1:0] ratio;
29
 
30
 
31
 
32
 
33
        initial begin
34
                clk = 1'b0;
35
                forever clk = #10 ~clk;
36
        end
37
 
38
 
39
 
40
        initial begin
41 56 alirezamon
`ifdef ACTIVE_LOW_RESET_MODE
42
        reset = 1'b0;
43
 `else
44
        reset = 1'b1;
45
`endif
46
 
47 48 alirezamon
                start = 1'b0;
48
                stop  = 1'b0;
49
                ratio =INJRATIO;
50
                #80
51 56 alirezamon
                @(posedge clk) reset = ~reset;
52 48 alirezamon
                #200
53
                @(posedge clk) start = 1'b1;
54
                @(posedge clk) start = 1'b0;
55
                @(posedge sent_done)
56
                stop=1;//stop all packet injectprs
57
                @(posedge done) //wait for all sent flits to be received at their destination
58
                #450
59
                @(posedge clk)
60
                $stop;
61
        end
62
 
63
 
64
        localparam
65
        /* verilator lint_off WIDTH */
66 56 alirezamon
                /* verilator lint_on WIDTH */
67
 
68 48 alirezamon
 
69
 
70 56 alirezamon
 
71 48 alirezamon
                PCK_CNTw=   $clog2(MAX_PCK_NUM+1),
72
                CLK_CNTw=   $clog2(MAX_SIM_CLKs+1),
73 56 alirezamon
 
74 48 alirezamon
                AVG_PCK_SIZ = (MAX_PACKET_SIZE + MIN_PACKET_SIZE)/2 ;
75
 
76
 
77
    typedef struct  {
78
                logic [PCK_CNTw-1     :0] pck_num;
79
                integer flit_num;
80
                integer worst_latency;
81
                integer min_latency;
82
                real sum_clk_h2h;
83
                real sum_clk_h2t;
84
                real sum_clk_per_hop;
85
`ifdef STND_DEV_EN
86
                real sum_clk_pow2;
87
`endif
88
        } statistic_t;
89
 
90
 
91
        typedef struct  {
92
                real avg_latency_per_hop;
93
                real avg_latency_flit;
94
                real avg_latency_pck;
95
                real avg_throughput;
96
                real avg_pck_siz;
97
`ifdef STND_DEV_EN
98
                real std_dev;
99
`endif
100
        } avg_st_t;
101
 
102
        integer m,c;
103
        localparam STAT_NUM= (C==0)? 1 : C;
104
        statistic_t sent_stat [NE][STAT_NUM];
105
        statistic_t rsvd_stat [NE][STAT_NUM];
106
        statistic_t sent_stat_class [NE];
107
        statistic_t rsvd_stat_class [NE];
108
        statistic_t sent_stat_per_class [STAT_NUM];
109
        statistic_t rsvd_stat_per_class [STAT_NUM];
110
        statistic_t rsvd_stat_total;
111
        statistic_t sent_stat_total;
112
 
113
        initial begin
114
                reset_st (rsvd_stat_total);
115
                reset_st (sent_stat_total);
116
                for(m=0;m
117
                        for (c=0;c
118
                                reset_st(sent_stat[m][c]);
119
                                reset_st(rsvd_stat[m][c]);
120
                        end
121
                        reset_st(rsvd_stat_class[m]);
122
                        reset_st(sent_stat_class[m]);
123
                end
124
                for (c=0; c
125
                        reset_st(sent_stat_per_class [c]);
126
                        reset_st(rsvd_stat_per_class [c]);
127
                end
128
        end
129
 
130
 
131
        task  reset_st;
132
                output  statistic_t stat_in;
133
                begin
134
                        stat_in.pck_num={PCK_CNTw{1'b0}};
135
                        stat_in.flit_num=0;
136
                        stat_in.worst_latency=0;
137
                        stat_in.min_latency=0;
138
                        stat_in.sum_clk_h2h=0;
139
                        stat_in.sum_clk_h2t=0;
140
                        stat_in.sum_clk_per_hop=0;
141
        `ifdef STND_DEV_EN
142
                        stat_in.sum_clk_pow2=0;
143
        `endif
144
                end
145
        endtask
146
 
147
 
148
 
149 54 alirezamon
    reg print_router_st;
150 48 alirezamon
 
151
        smartflit_chanel_t chan_in_all  [NE-1 : 0];
152
        smartflit_chanel_t chan_out_all [NE-1 : 0];
153 54 alirezamon
        router_event_t router_event [NR-1 : 0] [MAX_P-1 : 0];
154 48 alirezamon
 
155
 
156
 
157
 
158
        wire [NE-1      :   0]  hdr_flit_sent;
159 54 alirezamon
        wire [DAw-1     :   0]  dest_e_addr             [NE-1           :0];
160 48 alirezamon
        wire [EAw-1     :   0]  src_e_addr                              [NE-1           :0];
161
        wire [Cw-1      :   0]  pck_class_in            [NE-1           :0];
162
        wire [Cw-1      :   0]  flit_out_class          [NE-1           :0];
163
        wire [NEw-1     :   0]  src_id                                  [NE-1           :0];
164
 
165
        wire [PCK_SIZw-1:   0] pck_size_in [NE-1        :0];
166
        wire [PCK_SIZw-1:   0] pck_size_o  [NE-1        :0];
167 54 alirezamon
        wire [NEw-1 : 0] mcast_dst_num [NE-1        :0];
168 48 alirezamon
 
169
        //   wire    [NE-1           :0] report;
170
        reg     [CLK_CNTw-1             :0] clk_counter;
171
 
172
 
173
 
174
        wire    [PCK_CNTw-1     :0] pck_counter     [NE-1        :0];
175
        wire    [NE-1           :0] noc_report;
176
        wire    [NE-1           :0] update;
177
        wire    [CLK_CNTw-1     :0] time_stamp_h2t  [NE-1           :0];
178
        wire    [CLK_CNTw-1     :0] time_stamp_h2h  [NE-1           :0];
179
        wire    [DISTw-1         :0] distance        [NE-1           :0];
180
        wire    [Cw-1           :0] pck_class_out       [NE-1           :0];
181
 
182
        reg                         count_en;
183
        //reg [NE-1 : 0] start_o;
184
        logic [DELAYw-1 : 0] start_delay [NE-1 : 0];
185
 
186
 
187
 
188
 
189
        integer  rsv_size_array [MAX_PACKET_SIZE - MIN_PACKET_SIZE : 0];
190
 
191
 
192
 
193 56 alirezamon
        always @(`pronoc_clk_reset_edge) begin
194
                if (`pronoc_reset) begin
195 48 alirezamon
                        count_en <=1'b0;
196
                end else begin
197
                        if(start) count_en <=1'b1;
198
                        else if(noc_report) count_en <=1'b0;
199
                end
200
        end//always
201
 
202
 
203 56 alirezamon
        noc_top  #(
204
                .NOC_ID(NOC_ID)
205
        ) the_noc (
206
                .reset(reset),
207
                .clk(clk),
208
                .chan_in_all(chan_in_all),
209
                .chan_out_all(chan_out_all),
210
                .router_event(router_event)
211
        );
212 48 alirezamon
 
213
 
214
 
215 56 alirezamon
        always @ (`pronoc_clk_reset_edge)begin
216
                if (`pronoc_reset  ) begin clk_counter  <= 0;  end
217 48 alirezamon
                else  begin
218
                        if  (count_en) clk_counter  <= clk_counter+1'b1;
219
 
220
                end
221
        end
222
 
223
 
224
 
225
        function integer addrencode;
226
                input integer pos,k,n,kw;
227
                integer pow,i,tmp;begin
228
                        addrencode=0;
229
                        pow=1;
230
                        for (i = 0; i 
231
                                tmp=(pos/pow);
232
                                tmp=tmp%k;
233
                                tmp=tmp<
234
                                addrencode=addrencode | tmp;
235
                                pow=pow * k;
236
                        end
237
                end
238
        endfunction
239
 
240
 
241
        genvar i;
242
    wire [NE-1 : 0] valid_dst;
243
 
244
        generate
245
        for(i=0; i< NE; i=i+1) begin : endpoints
246
 
247
                wire [EAw-1 : 0] current_e_addr [NE-1 : 0];
248
 
249
                        endp_addr_encoder #(
250
                                .TOPOLOGY(TOPOLOGY),
251
                                .T1(T1),
252
                                .T2(T2),
253
                                .T3(T3),
254
                                .EAw(EAw),
255
                                .NE(NE)
256
                        )
257
                        encoder
258
                        (
259
                                .id(i[NEw-1 : 0]),
260
                                .code(current_e_addr[i])
261
                        );
262
 
263
 
264
 
265
 
266
                        traffic_gen_top #(
267 56 alirezamon
                                .NOC_ID(NOC_ID),
268 54 alirezamon
                                .MAX_RATIO(100),
269
                                .ENDP_ID(i)
270 48 alirezamon
                        )
271
                        the_traffic_gen
272
                        (
273
                        .ratio (ratio),
274
                                .pck_size_in(pck_size_in[i]),
275
                                .current_e_addr(current_e_addr[i]),
276
                                .dest_e_addr(dest_e_addr[i]),
277
                                .pck_class_in(pck_class_in[i]),
278
                                .init_weight({{(WEIGHTw-1){1'b0}},1'b1}),
279
                                .hdr_flit_sent(hdr_flit_sent[i]),
280
                                .pck_number(pck_counter[i]),
281
                                .reset(reset),
282
                                .clk(clk),
283
                                .start(start),
284
                                .stop(stop | ~valid_dst[i]),
285
                                .sent_done(),
286
                                .update(update[i]),
287
                                .time_stamp_h2h(time_stamp_h2h[i]),
288
                                .time_stamp_h2t(time_stamp_h2t[i]),
289
                                .distance(distance[i]),
290
                                .src_e_addr(src_e_addr[i] ),
291
                                .pck_class_out(pck_class_out[i]),
292
                                .report (1'b0),
293
                                .pck_size_o(pck_size_o[i]),
294
                                .chan_in(chan_out_all[i]),
295
                                .chan_out(chan_in_all[i]),
296
                                .start_delay(start_delay[i]),
297
                .flit_out_class(flit_out_class[i]),
298
                                .flit_out_wr(),
299 54 alirezamon
                                .flit_in_wr(),
300
                                .mcast_dst_num_o(mcast_dst_num[i])
301 48 alirezamon
 
302
                        );
303
 
304
                        endp_addr_decoder #(
305
                                .TOPOLOGY(TOPOLOGY),
306
                                .T1(T1),
307
                                .T2(T2),
308
                                .T3(T3),
309
                                .EAw(EAw),
310
                                .NE(NE)
311
                        )
312
                        decoder
313
                        (
314
                                .id(src_id[i]),
315
                                .code(src_e_addr[i])
316
                        );
317
 
318
 
319
                        pck_class_in_gen #(
320
                                .C(C),
321
                                .C0_p(C0_p),
322
                                .C1_p(C1_p),
323
                                .C2_p(C2_p),
324
                                .C3_p(C3_p)
325
                        )
326
                        the_pck_class_in_gen
327
                        (
328
                                .en(hdr_flit_sent[i]),
329
                                .pck_class_o(pck_class_in[i]),
330
                                .reset(reset),
331
                                .clk(clk)
332
                        );
333
 
334
 
335
 
336
 
337
                        pck_dst_gen #(
338 56 alirezamon
                                .NOC_ID(NOC_ID),
339 48 alirezamon
                                .TRAFFIC(TRAFFIC),
340 54 alirezamon
                                .HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM),
341
                                .MCAST_TRAFFIC_RATIO(MCAST_TRAFFIC_RATIO),
342
                                .MCAST_PCK_SIZ_MIN(MCAST_PCK_SIZ_MIN),
343
                                .MCAST_PCK_SIZ_MAX(MCAST_PCK_SIZ_MAX),
344
                                .MIN_PACKET_SIZE(MIN_PACKET_SIZE),
345
                                .MAX_PACKET_SIZE(MAX_PACKET_SIZE),
346
                                .PCK_SIZ_SEL(PCK_SIZ_SEL),
347
                                .DISCRETE_PCK_SIZ_NUM(DISCRETE_PCK_SIZ_NUM)
348 48 alirezamon
                        )
349
                        the_pck_dst_gen
350
                        (
351
                                .reset(reset),
352
                                .clk(clk),
353
                                .en(hdr_flit_sent[i]),
354
                                .core_num(i[NEw-1  :   0]),
355
                                .pck_number(pck_counter[i]),
356
                                .current_e_addr(current_e_addr[i]),
357
                                .dest_e_addr(dest_e_addr[i]),
358
                                .valid_dst(valid_dst[i]),
359
                                .hotspot_info(hotspot_info),
360 54 alirezamon
                                .pck_size_o( pck_size_in[i]) ,
361
                                .rnd_discrete(rnd_discrete),
362 48 alirezamon
                                .custom_traffic_t(custom_traffic_t[i]),  // defined in sim_param.sv
363
                                .custom_traffic_en(custom_traffic_en[i])  // defined in sim_param.sv
364
                        );
365
 
366 54 alirezamon
 
367 48 alirezamon
 
368
        end
369
        endgenerate
370
 
371
 
372
 
373
 
374
 
375
 
376
 
377
 
378
        real                            sum_clk_h2h,sum_clk_h2t;
379
        real                            sum_clk_pow2;
380
        real                            sum_clk_pow2_per_class [C-1 : 0];
381
        real                            sum_clk_per_hop;
382
        integer             total_rsv_pck_num_per_class         [C-1    :   0];
383
        real                            sum_clk_h2h_per_class                   [C-1    :   0];
384
        real                            sum_clk_h2t_per_class                   [C-1    :   0];
385
        real                            sum_clk_per_hop_per_class               [C-1    :       0];
386
        integer                         rsvd_core_total_rsv_pck_num                     [NE-1   :   0];
387
        integer                         rsvd_core_worst_delay                   [NE-1   :   0];
388
        integer             sent_core_worst_delay           [NE-1   :   0];
389
        integer                         total_active_endp;
390
        integer             total_rsv_pck_num,total_rsv_flit_number;
391 54 alirezamon
        integer                         total_sent_pck_num,total_sent_flit_number,total_expect_rsv_flit_num;
392 48 alirezamon
 
393
        integer core_num,k;
394 56 alirezamon
        always @(`pronoc_clk_reset_edge)begin
395
                if (`pronoc_reset) begin
396 48 alirezamon
                        total_rsv_pck_num=0;
397
                        total_sent_pck_num=0;
398
                        sum_clk_h2h=0;
399
                        sum_clk_h2t=0;
400
                        sum_clk_pow2=0;
401
                        sum_clk_per_hop=0;
402
                        total_sent_flit_number=0;
403
                        total_rsv_flit_number=0;
404 54 alirezamon
                        total_expect_rsv_flit_num=0;
405 48 alirezamon
                        for (k=0;k
406
                                        sum_clk_pow2_per_class[k]=0;
407
                                        total_rsv_pck_num_per_class[k]=0;
408
                                        sum_clk_h2h_per_class [k]=0;
409
                                        sum_clk_h2t_per_class [k]=0;
410
                                        sum_clk_per_hop_per_class[k]=0;
411
                        end
412
                        for (k=0;k
413
                                rsvd_core_total_rsv_pck_num[k]=0;
414
                                rsvd_core_worst_delay[k]=0;
415
                                sent_core_worst_delay[k]=0;
416
                        end
417
                        for (k=0; k<= MAX_PACKET_SIZE - MIN_PACKET_SIZE; k++)   rsv_size_array[k]=0;
418
 
419
                end
420
 
421
 
422
                for (core_num=0; core_num
423
                        if(chan_in_all[core_num].flit_chanel.flit_wr)begin
424
                                total_sent_flit_number+=1;
425 54 alirezamon
                                if (CAST_TYPE != "UNICAST") total_expect_rsv_flit_num+=mcast_dst_num[core_num];
426
                                else   total_expect_rsv_flit_num++;
427
 
428
 
429 48 alirezamon
                                if (C>1) sent_stat [core_num][flit_out_class[core_num]].flit_num++;
430
                                else     sent_stat [core_num][0].flit_num++;
431
                                if(chan_in_all[core_num].flit_chanel.flit[Fw-1])begin
432
                                        total_sent_pck_num+=1;
433
                                        if (C>1) sent_stat [core_num][flit_out_class[core_num]].pck_num++;
434
                                        else     sent_stat [core_num][0].pck_num++;
435
 
436
                                end
437
                        end
438
 
439
                        if(chan_out_all[core_num].flit_chanel.flit_wr)begin
440
                                total_rsv_flit_number+=1;
441
                                if (C>1) rsvd_stat [core_num][pck_class_out[core_num]].flit_num++;
442
                                else     rsvd_stat [core_num][0].flit_num++;
443
                        end
444
 
445
 
446
                        if( update [core_num] ) begin
447
                                total_rsv_pck_num = total_rsv_pck_num+1;
448
 
449
                                if (AVG_LATENCY_METRIC == "HEAD_2_TAIL")
450
                                update_statistic (
451
                                        core_num,
452
                                        pck_class_out[core_num],
453
                                         $itor(time_stamp_h2h[core_num]),
454
                                         $itor(time_stamp_h2t[core_num]),
455
                                        src_id[core_num],
456
                                        time_stamp_h2t[core_num],
457
                                        distance[core_num]
458
                                );
459
                                else
460
                                update_statistic (
461
                                        core_num,
462
                                        pck_class_out[core_num],
463
                                        $itor(time_stamp_h2h[core_num]),
464
                                        $itor(time_stamp_h2t[core_num]),
465
                                        src_id[core_num],
466
                                        time_stamp_h2h[core_num],
467
                                        distance[core_num]
468
                                );
469
 
470
 
471
                                if((total_rsv_pck_num & 'hffff )==0 ) $display(" packet received total=%0d",total_rsv_pck_num);
472
                                sum_clk_h2h +=  time_stamp_h2h[core_num];
473
                                sum_clk_h2t +=  time_stamp_h2t[core_num];
474
                                `ifdef STND_DEV_EN
475
                                        sum_clk_pow2+=time_stamp_h2h[core_num] * time_stamp_h2h[core_num];
476
                                        sum_clk_pow2_per_class[pck_class_out[core_num]]+=time_stamp_h2h[core_num] * time_stamp_h2h[core_num];
477
                                `endif
478 54 alirezamon
                                if(distance[core_num] > 0) sum_clk_per_hop+= $itor(time_stamp_h2h[core_num])/$itor(distance[core_num]);
479 48 alirezamon
                                total_rsv_pck_num_per_class[pck_class_out[core_num]]+=1;
480
                                sum_clk_h2h_per_class[pck_class_out[core_num]]+=time_stamp_h2h[core_num] ;
481
                                sum_clk_h2t_per_class[pck_class_out[core_num]]+=time_stamp_h2t[core_num] ;
482 54 alirezamon
                                if(distance[core_num]>0) sum_clk_per_hop_per_class[pck_class_out[core_num]]+= $itor(time_stamp_h2h[core_num])/$itor(distance[core_num]);
483 48 alirezamon
                                rsvd_core_total_rsv_pck_num[core_num]+=1;
484
                                if (rsvd_core_worst_delay[core_num] < time_stamp_h2t[core_num]) rsvd_core_worst_delay[core_num] = ( AVG_LATENCY_METRIC == "HEAD_2_TAIL")? time_stamp_h2t[core_num] : time_stamp_h2h[core_num];
485
                                if (sent_core_worst_delay[src_id[core_num]] < time_stamp_h2t[core_num]) sent_core_worst_delay[src_id[core_num]] = (AVG_LATENCY_METRIC == "HEAD_2_TAIL")?  time_stamp_h2t[core_num] : time_stamp_h2h[core_num];
486
                                if (pck_size_o[core_num] >= MIN_PACKET_SIZE && pck_size_o[core_num] <=MAX_PACKET_SIZE) rsv_size_array[pck_size_o[core_num]-MIN_PACKET_SIZE] = rsv_size_array[pck_size_o[core_num]-MIN_PACKET_SIZE]+1;
487
 
488
 
489
                        end
490
                end
491
        end//always
492
 
493
 
494
 
495
 
496
 
497
 
498
    integer rsv_ideal_cnt,total_rsv_flit_number_old;
499
        reg all_done_reg;
500
        wire all_done_in;
501
        assign all_done_in = (clk_counter > STOP_SIM_CLK) || ( total_sent_pck_num >  STOP_PCK_NUM );
502
        assign sent_done = all_done_in & ~ all_done_reg;
503 56 alirezamon
 
504
        always @(`pronoc_clk_reset_edge)begin
505
                if (`pronoc_reset) begin
506 48 alirezamon
                        all_done_reg <= 1'b0;
507
                        rsv_ideal_cnt<=0;
508
                        done<=1'b0;
509
                        total_rsv_flit_number_old<=0;
510
                end  else  begin
511
                        all_done_reg <= all_done_in;
512
                        total_rsv_flit_number_old<=total_rsv_flit_number;
513
                        if(all_done_in) begin //All injectors stopped injecting packets
514
                                if(total_rsv_flit_number_old==total_rsv_flit_number) rsv_ideal_cnt<=rsv_ideal_cnt+1;//count the number of cycle when no flit is received by any injector
515
                                else rsv_ideal_cnt=0;
516 54 alirezamon
                                if(total_expect_rsv_flit_num == total_rsv_flit_number) begin // All injected packets are consumed
517 48 alirezamon
                                        done<=1'b1;
518
                                end
519
                                if(rsv_ideal_cnt >= 100) begin //  Injectors stopped sending packets, number of received and sent flits are not equal yet and for 100 cycles no flit is consumed.
520 54 alirezamon
                                        done<=1'b1;
521
                                        #100 $display ("ERROR: The number of expected (%d) & received flits (%d) were not equal at the end of simulation",total_expect_rsv_flit_num ,total_rsv_flit_number);
522 48 alirezamon
 
523
                                        $stop;
524
                                end
525
                        end
526
                end
527
        end
528
 
529
        initial total_active_endp=0;
530
 
531
 
532
        real avg_throughput,avg_latency_flit,avg_latency_pck,std_dev,avg_latency_per_hop,min_avg_latency_per_class;
533
 
534
 
535
        initial begin
536
                for(m=0;m
537
        end
538
 
539
 
540 54 alirezamon
        initial print_router_st=1'b0;
541 48 alirezamon
 
542
        //report
543
        always @( posedge done) begin
544 54 alirezamon
 
545
 
546 48 alirezamon
                for (core_num=0; core_num
547
                        if(pck_counter[core_num]>0) total_active_endp           =       total_active_endp +1;
548
                end
549
 
550
                avg_throughput= ((total_sent_flit_number*100)/total_active_endp )/clk_counter;
551
                avg_latency_flit =sum_clk_h2h/$itor(total_rsv_pck_num);
552
                avg_latency_pck  =sum_clk_h2t/$itor(total_rsv_pck_num);
553
                avg_latency_per_hop    = sum_clk_per_hop/$itor(total_rsv_pck_num);
554
                $display("simulation results-------------------");
555
                $display("\tSimulation clock cycles:%0d",clk_counter);
556 54 alirezamon
 
557
                print_router_st=1'b1;
558
                #1
559
 
560 48 alirezamon
/*
561
                $display(" total sent/received packets:%d/%d",total_sent_pck_num,total_rsv_pck_num);
562
                $display(" total sent/received flits:%d/%d",total_sent_flit_number,total_rsv_flit_number);
563
                $display(" Total active Endpoint: %d \n",total_active_endp);
564
                $display(" Avg throughput is: %f (flits/clk/Total active Endpoint %%)",   avg_throughput);
565
 
566
 
567
 
568
                $display("\nall : ");
569
                $display(" Total number of packet = %d \n average latency per hop = %f ",total_rsv_pck_num,avg_latency_per_hop);
570
                $display(" average packet latency = %f \n average flit latency = %f ",avg_latency_pck, avg_latency_flit);
571
*/
572
                $display("\n\tTotal injected packet in different size:");
573 54 alirezamon
                $write("\tflit_size,");
574
                for (m=0;m<=(MAX_PACKET_SIZE - MIN_PACKET_SIZE);m++) begin
575 48 alirezamon
                        if(rsv_size_array[m]>0)$write("%0d,",m+ MIN_PACKET_SIZE);
576
                end
577 54 alirezamon
                $write("\n\t#pck,");
578
                for (m=0;m<=(MAX_PACKET_SIZE - MIN_PACKET_SIZE);m++) begin
579 48 alirezamon
                        if(rsv_size_array[m]>0)$write("%0d,",rsv_size_array[m]);
580
                end
581
 
582
                //              if(ratio==RATIO_INIT) first_avg_latency_flit=avg_latency_flit;
583
                //`ifdef STND_DEV_EN
584
                                //std_dev= standard_dev( sum_clk_pow2,total_rsv_pck_num, avg_latency_flit);
585
                                //$display(" standard_dev = %f",std_dev);
586
                //`endif
587 54 alirezamon
                $display("\n\n\tEndpoints' statistics");
588
                $write("\t#node,sent_stat.pck_num,rsvd_stat.pck_num,sent_stat.flit_num,rsvd_stat.flit_num,sent_stat.worst_latency,rsvd_stat.worst_latency,sent_stat.min_latency,rsvd_stat.min_latency,avg_latency_per_hop,avg_latency_flit,avg_latency_pck,avg_throughput(%%),avg_pck_size,");
589 48 alirezamon
`ifdef STND_DEV_EN
590
                $write("avg.std_dev");
591
`endif
592 54 alirezamon
                $write("\n");
593 48 alirezamon
 
594
                for (m=0; m
595
                        for (c=0; c
596
                                merge_statistic (rsvd_stat_class[m],rsvd_stat[m][c],rsvd_stat_class[m]);
597
                                merge_statistic (sent_stat_class[m],sent_stat[m][c],sent_stat_class[m]);
598
                                if(C>1) begin
599
                                        merge_statistic (rsvd_stat_per_class[c],rsvd_stat[m][c],rsvd_stat_per_class[c]);
600
                                        merge_statistic (sent_stat_per_class[c],sent_stat[m][c],sent_stat_per_class[c]);
601
                                end
602
                        end
603
                end
604
 
605
 
606
 
607
        for (m=0; m
608
 
609
                merge_statistic (rsvd_stat_total,rsvd_stat_class[m],rsvd_stat_total);
610
                merge_statistic (sent_stat_total,sent_stat_class[m],sent_stat_total);
611
 
612
        end
613
 
614
        $write("\ttotal,");
615
        print_st_single (clk_counter, rsvd_stat_total,sent_stat_total);
616
 
617
        if(C>1)begin
618
                for (c=0; c
619
                        $write("\ttotal_class%0d,",c);
620
                        print_st_single (clk_counter, rsvd_stat_per_class[c],sent_stat_per_class[c]);
621
                end
622
        end
623
 
624
    for (m=0; m
625
        $write("\t%0d,",m);
626
                if(C>1) begin
627
                        print_st_single (clk_counter, rsvd_stat_class[m],sent_stat_class[m] );
628
                end else begin
629
                        print_st_single (clk_counter, rsvd_stat[m][0],sent_stat[m][0] );
630
                end
631
    end
632
 
633
 
634
 
635
 
636
 
637
 
638
 
639
 
640
/*
641
                min_avg_latency_per_class=1000000;
642
                for(m=0;m
643
                        avg_throughput           = (total_rsv_pck_num_per_class[m]>0)? ((total_rsv_pck_num_per_class[m]*AVG_PCK_SIZ*100)/total_active_endp )/clk_counter:0;
644
                        avg_latency_flit         = (total_rsv_pck_num_per_class[m]>0)? sum_clk_h2h_per_class[m]/total_rsv_pck_num_per_class[m]:0;
645
                        avg_latency_pck          = (total_rsv_pck_num_per_class[m]>0)? sum_clk_h2t_per_class[m]/total_rsv_pck_num_per_class[m]:0;
646
                        avg_latency_per_hop  = (total_rsv_pck_num_per_class[m]>0)? sum_clk_per_hop_per_class[m]/total_rsv_pck_num_per_class[m]:0;
647
                        if(AVG_LATENCY_METRIC == "HEAD_2_TAIL") begin
648
                                                $display ("\nclass : %d  ",m);
649
                                                $display (" Total number of packet  = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f",total_rsv_pck_num_per_class[m],avg_throughput,avg_latency_per_hop,avg_latency_pck);
650
 
651
                        end else begin
652
 
653
                                                $display ("\nclass : %d  ",m);
654
                                                $display (" Total number of packet  = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f",total_rsv_pck_num_per_class[m],avg_throughput,avg_latency_per_hop,avg_latency_flit);
655
                        end
656
                        if(min_avg_latency_per_class > avg_latency_flit) min_avg_latency_per_class=avg_latency_flit;
657
 
658
                                        //#if (STND_DEV_EN)
659
                                        //std_dev= (total_rsv_pck_num_per_class[i]>0)?  standard_dev( sum_clk_pow2_per_class[i],total_rsv_pck_num_per_class[i], avg_latency_flit):0;
660
                                        // sprintf(file_name,"%s_std%u.txt",out_file_name,i);
661
                                        // update_file( file_name,avg_throughput,std_dev);
662
 
663
                                        //#endif
664
                end//for
665
 
666
 
667
 
668
                for (m=0;m
669
                        $display         ("\n\nEndpoint %d",m);
670
                        $display         ("\n\ttotal number of received packets: %d",rsvd_core_total_rsv_pck_num[m]);
671
                        $display         ("\n\tworst-case-delay of received packets (clks): %d",rsvd_core_worst_delay[m] );
672
                        $display         ("\n\ttotal number of sent packets: %d",pck_counter[m]);
673
                        $display         ("\n\tworst-case-delay of sent packets (clks): %d",sent_core_worst_delay[m] );
674
                end
675
 
676
*/
677
 
678
        end
679
 
680
 
681
 
682
 
683
 
684
        initial begin
685 54 alirezamon
                display_noc_parameters();
686 48 alirezamon
                $display ("Simulation parameters-------------");
687
                if(DEBUG_EN)
688
                        $display ("\tDebuging is enabled");
689
                else
690
                        $display ("\tDebuging is disabled");
691
 
692
                //if( AVG_LATENCY_METRIC == "HEAD_2_TAIL")  $display ("\tOutput is the average latency on sending the packet header until receiving tail");
693
                //else $display ("\tOutput is the average latency on sending the packet header until receiving header flit at destination node");
694
                $display ("\tTraffic pattern:%s",TRAFFIC);
695
                if(C>0) $display ("\ttraffic percentage of class 0 is : %0d", C0_p);
696
                if(C>1) $display ("\ttraffic percentage of class 1 is : %0d", C1_p);
697
                if(C>2) $display ("\ttraffic percentage of class 2 is : %0d", C2_p);
698
                if(C>3) $display ("\ttraffic percentage of class 3 is : %0d", C3_p);
699
                if(TRAFFIC == "HOTSPOT")begin
700
                        //$display ("\tHot spot percentage: %u\n", HOTSPOT_PERCENTAGE);
701
                        $display ("\tNumber of hot spot cores: %0d", HOTSPOT_NODE_NUM);
702
                end
703 54 alirezamon
                if (CAST_TYPE != "UNICAST")begin
704
                        $display ("\tMULTICAST traffic ratio: %d(%%), min: %d, max: %d\n", MCAST_TRAFFIC_RATIO,MCAST_PCK_SIZ_MIN,MCAST_PCK_SIZ_MAX);
705
                end
706
 
707
 
708
 
709 48 alirezamon
                //$display ("\tTotal packets sent by one router: %u\n", TOTAL_PKT_PER_ROUTER);
710
                $display ("\tSimulation timeout =%0d", STOP_SIM_CLK);
711
                $display ("\tSimulation ends on total packet num of =%0d", STOP_PCK_NUM);
712
                $display ("\tPacket size (min,max,average) in flits: (%0d,%0d,%0d)",MIN_PACKET_SIZE,MAX_PACKET_SIZE,AVG_PCK_SIZ);
713
                $display ("\tPacket injector FIFO width in flit:%0d\n\n",TIMSTMP_FIFO_NUM);
714
                $display ("\tFlit injection ratio per router is =%f (flits/clk/Total Endpoint %%)",ratio);
715
 
716
                $display ("Simulation parameters-------------");
717
 
718
        end//initial
719
 
720
 
721
 
722
 
723
 
724
        task update_statistic;
725
                input integer core_num;
726
                input [Cw-1 : 0] class_num;
727
                input real clk_num_h2h;
728
                input real clk_num_h2t;
729
                input [NEw-1     :   0]  src;
730
                input real latency;
731
                input [DISTw-1         :0] distance     ;
732
                begin
733
 
734
 
735
                if(C>1) begin
736
 
737
                        rsvd_stat[core_num][class_num].pck_num ++;
738
                        rsvd_stat[core_num][class_num].sum_clk_h2h +=clk_num_h2h;
739
                        rsvd_stat[core_num][class_num].sum_clk_h2t +=clk_num_h2t;
740
                        rsvd_stat[core_num][class_num].sum_clk_per_hop+= (clk_num_h2h/$itor(distance));
741
                        if (rsvd_stat[core_num][class_num].worst_latency < latency ) rsvd_stat[core_num][class_num].worst_latency =latency;
742
                        if (rsvd_stat[core_num][class_num].min_latency==0          ) rsvd_stat[core_num][class_num].min_latency   =latency;
743
                        if (rsvd_stat[core_num][class_num].min_latency   > latency ) rsvd_stat[core_num][class_num].min_latency   =latency;
744
                        if (sent_stat[src     ][class_num].worst_latency < latency ) sent_stat[src     ][class_num].worst_latency =latency;
745
                        if (sent_stat[src     ][class_num].min_latency==0          ) sent_stat[src     ][class_num].min_latency   =latency;
746
                        if (sent_stat[src     ][class_num].min_latency   > latency ) sent_stat[src     ][class_num].min_latency   =latency;
747
 
748
                        `ifdef STND_DEV_EN
749
                        rsvd_stat[core_num][class_num].sum_clk_pow2 += clk_num_h2h * clk_num_h2h;
750
                        `endif
751
                end else begin
752
                        rsvd_stat[core_num][0].pck_num ++;
753
                    rsvd_stat[core_num][0].sum_clk_h2h +=clk_num_h2h;
754
                    rsvd_stat[core_num][0].sum_clk_h2t +=clk_num_h2t;
755 54 alirezamon
                    if(distance>0) rsvd_stat[core_num][0].sum_clk_per_hop+= (clk_num_h2h/$itor(distance));
756 48 alirezamon
                    if (rsvd_stat[core_num][0].worst_latency < latency ) rsvd_stat[core_num][0].worst_latency=latency;
757
                    if (rsvd_stat[core_num][0].min_latency==0          ) rsvd_stat[core_num][0].min_latency  =latency;
758
                    if (rsvd_stat[core_num][0].min_latency   > latency ) rsvd_stat[core_num][0].min_latency  =latency;
759
                    if (sent_stat[src     ][0].worst_latency < latency ) sent_stat[src     ][0].worst_latency=latency;
760
                    if (sent_stat[src     ][0].min_latency==0          ) sent_stat[src     ][0].min_latency  =latency;
761
                    if (sent_stat[src     ][0].min_latency   > latency ) sent_stat[src     ][0].min_latency  =latency;
762
 
763
                        `ifdef STND_DEV_EN
764
                        rsvd_stat[core_num][0].sum_clk_pow2 += clk_num_h2h * clk_num_h2h;
765
                        `endif
766
                end
767
 
768
        end
769
        endtask
770
 
771
 
772
 
773
 
774
        task merge_statistic;
775
        input statistic_t merge_stat;
776
        input statistic_t stat_in;
777
        output statistic_t stat_out;
778
        begin
779
                stat_out.pck_num =    merge_stat.pck_num+stat_in.pck_num;
780
                stat_out.flit_num =   merge_stat.flit_num+stat_in.flit_num;
781
                if(merge_stat.worst_latency <  stat_in.worst_latency) stat_out.worst_latency= stat_in.worst_latency;
782
                if(merge_stat.min_latency   == 0                       ) stat_out.min_latency  = stat_in.min_latency;
783
                if(merge_stat.min_latency   > stat_in.min_latency  && stat_in.min_latency!=0   ) stat_out.min_latency  = stat_in.min_latency;
784
                stat_out.sum_clk_h2h = merge_stat.sum_clk_h2h      +stat_in.sum_clk_h2h    ;
785
                stat_out.sum_clk_h2t = merge_stat.sum_clk_h2t      +stat_in.sum_clk_h2t    ;
786
                stat_out.sum_clk_per_hop =   merge_stat.sum_clk_per_hop  +stat_in.sum_clk_per_hop;
787
                `ifdef STND_DEV_EN
788
                        stat_out.sum_clk_pow2 = merge_stat.sum_clk_pow2 +stat_in.sum_clk_pow2;
789
        `endif
790
 
791
        end
792
        endtask
793
 
794
 
795
 
796
 
797
 
798
 
799
        task print_st_single;
800
                input [CLK_CNTw-1 : 0]total_clk;
801
                input statistic_t rsvd_stat;
802
                input statistic_t sent_stat;
803
                begin
804
 
805
 
806
 
807
                avg_st_t avg;
808
                finilize_statistic (total_clk,  rsvd_stat, avg);
809
 
810
                $write("%0d,",sent_stat.pck_num);
811
                $write("%0d,",rsvd_stat.pck_num);
812
                $write("%0d,",sent_stat.flit_num);
813
                $write("%0d,",rsvd_stat.flit_num);
814
                $write("%0d,",sent_stat.worst_latency);
815
                $write("%0d,",rsvd_stat.worst_latency);
816
                $write("%0d,",sent_stat.min_latency);
817
                $write("%0d,",rsvd_stat.min_latency);
818
                $write("%f,",avg.avg_latency_per_hop);
819
                $write("%f,",avg.avg_latency_flit);
820
                $write("%f,",avg.avg_latency_pck);
821
                $write("%f,",avg.avg_throughput);
822
                $write("%f,",avg.avg_pck_siz);
823
        `ifdef STND_DEV_EN
824
                $write("%f,",avg.std_dev);
825
        `endif
826
                $write("\n");
827
        //      printf("\n");
828
                end
829
        endtask
830
 
831
 
832
 
833
        task finilize_statistic;
834
                input [CLK_CNTw-1 : 0]total_clk;
835
                input statistic_t rsvd_stat;
836
                output avg_st_t avg_statistic;
837
                begin
838
 
839
 
840
                 avg_statistic.avg_throughput = ($itor(rsvd_stat.flit_num*100)/NE )/total_clk;
841
                 avg_statistic.avg_latency_flit =(rsvd_stat.pck_num>0)? rsvd_stat.sum_clk_h2h/rsvd_stat.pck_num : 0;
842
                 avg_statistic.avg_latency_pck = (rsvd_stat.pck_num>0)? rsvd_stat.sum_clk_h2t/rsvd_stat.pck_num :0;
843
                 avg_statistic.avg_latency_per_hop = ( rsvd_stat.pck_num==0)? 0 : rsvd_stat.sum_clk_per_hop/rsvd_stat.pck_num;
844
                 avg_statistic.avg_pck_siz  = ( rsvd_stat.pck_num==0)? 0 : $itor(rsvd_stat.flit_num) / $itor(rsvd_stat.pck_num);
845
                 `ifdef STND_DEV_EN
846
                        standard_dev( rsvd_stat.sum_clk_pow2,rsvd_stat.pck_num, avg_statistic.avg_latency_flit,avg_statistic.std_dev);
847
                 `endif
848
        end
849
        endtask
850
 
851
 
852
 
853
        `ifdef STND_DEV_EN
854
        /************************
855
         * std_dev = sqrt[(B-A^2/N)/N]  = sqrt [(B/N)- (A/N)^2] = sqrt [B/N - mean^2]
856
         * A = sum of the values
857
         * B = sum of the squarded values
858
         * *************/
859
 
860
        task standard_dev;
861
                input real sum_pow2;
862
                input [PCK_CNTw-1     :0]  total_num;
863
                input real average;
864
                output real std_dev;
865
                begin
866
                /*
867
                double  A, B, N;
868
                N= total_num;
869
                A= average * N;
870
                B= sum_pow2;
871
 
872
                A=(A*A)/N;
873
                std_dev = (B-A)/N;
874
                std_dev = sqrt(std_dev);
875
        */
876
                if(total_num==0) std_dev= 0;
877
                else begin
878
                        std_dev = sum_pow2/$itor(total_num); //B/N
879
                        std_dev -= (average*average);// (B/N) - mean^2
880
                        std_dev = $sqrt(std_dev);// sqrt [B/N - mean^2]
881
 
882
                end
883
        end
884
        endtask
885
 
886
        `endif
887
 
888
 
889
 
890
        /*
891
        start_delay_gen #(
892
                        .NC(NE)
893
                )
894
                delay_gen
895
                (
896
                        .clk(clk),
897
                        .reset(reset),
898
                        .start_i(start),
899
                        .start_o(start_o)
900
                );
901
         */
902 54 alirezamon
 
903
 
904 56 alirezamon
        routers_statistic_collector #(
905
                .NOC_ID(NOC_ID)
906
        ) router_stat (
907 54 alirezamon
                .reset(reset),
908
                .clk(clk),
909
                .router_event(router_event),
910
                .print(print_router_st)
911
        );
912 48 alirezamon
 
913
endmodule
914
// synthesis translate_on
915
 

powered by: WebSVN 2.1.0

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