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/] [traffic_pattern.sv] - Blame information for rev 54

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

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: traffic_pattern
3
* Date:2015-10-05
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
 
9
`timescale  1ns/1ps
10
 
11
 
12
 
13
/************************************
14
 
15
        pck_class_in_gen
16
 
17
***********************************/
18
 
19
module pck_class_in_gen #(
20
    parameter C = 4,    //  number of packet class
21
    parameter C0_p = 25,    //  the percentage of injected packets with class 0
22
    parameter C1_p = 25,
23
    parameter C2_p = 25,
24
    parameter C3_p = 25
25
)(
26
    pck_class_o,
27
    en,
28
    reset,
29
    clk
30
 
31
);
32
 
33
    function integer log2;
34
      input integer number; begin
35
         log2=(number <=1) ? 1: 0;
36
         while(2**log2
37
            log2=log2+1;
38
         end
39
      end
40
    endfunction // log2
41
 
42
 
43
    localparam
44
    Cw = (C>1)? log2(C) : 1,
45
    RNDw = log2(100);
46
 
47
    output reg [Cw-1    :   0]  pck_class_o;
48
    input                       reset,clk,en;
49
    reg       [RNDw-1  :   0]  rnd;
50
 
51
 
52
 
53
 // generate a random num between 0 to 99
54
    always @(posedge clk ) begin
55
        if(en | reset) begin
56
                rnd =     $urandom_range(99,0);
57
        end
58
    end
59
 
60
    always @(*) begin
61
        if      ( rnd <   C0_p)                 pck_class_o =0;
62
        else if ( rnd <   (C0_p+C1_p))          pck_class_o =1;
63
        else if ( rnd <   (C0_p+C1_p+C2_p))     pck_class_o =2;
64
        else                                    pck_class_o =3;
65
    end
66
 
67
 
68
 
69
endmodule
70
 
71
/**********************************
72
 
73
        pck_dst_gen
74
 
75
*********************************/
76 54 alirezamon
module  pck_dst_gen
77
        import pronoc_pkg::*;
78
        #(
79
    parameter NE=4,
80
    parameter TRAFFIC =   "RANDOM",
81
    parameter MAX_PCK_NUM = 10000,
82
    parameter HOTSPOT_NODE_NUM =  4,
83
    parameter MCAST_TRAFFIC_RATIO =50,
84
    parameter MCAST_PCK_SIZ_MIN = 2,
85
    parameter MCAST_PCK_SIZ_MAX = 4,
86
    parameter PCK_SIZw=5,
87
    parameter MIN_PACKET_SIZE=5,
88
    parameter MAX_PACKET_SIZE=5,
89
    parameter PCK_SIZ_SEL="random-discrete",
90
    parameter DISCRETE_PCK_SIZ_NUM=1
91
 
92
)(
93
    en,
94
    current_e_addr,
95
    core_num,
96
    pck_number,
97
    dest_e_addr,
98
    clk,
99
    reset,
100
    valid_dst,
101
    hotspot_info,
102
    custom_traffic_t,
103
    custom_traffic_en,
104
    pck_size_o,
105
    rnd_discrete
106
 
107
 
108
);
109 48 alirezamon
 
110
 
111 54 alirezamon
    localparam      ADDR_DIMENSION =   (TOPOLOGY ==    "MESH" || TOPOLOGY ==  "TORUS") ? 2 : 1;  // "RING" and FULLY_CONNECT
112
 
113
 
114
 
115
 
116
    localparam  NEw= log2(NE),
117
                PCK_CNTw = log2(MAX_PCK_NUM+1),
118
                HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
119
 
120
    input                       reset,clk,en;
121
    input   [NEw-1      :   0]  core_num;
122
    input   [PCK_CNTw-1 :   0]  pck_number;
123
    input   [EAw-1      :   0]  current_e_addr;
124
    output  [DAw-1      :   0]  dest_e_addr;
125
    output                      valid_dst;
126
    input  [NEw-1 : 0] custom_traffic_t;
127
    input  custom_traffic_en;
128
 
129
 
130
    output [PCK_SIZw-1:0]  pck_size_o;
131
    input rnd_discrete_t rnd_discrete [DISCRETE_PCK_SIZ_NUM-1: 0];
132
 
133
    input hotspot_t  hotspot_info [HOTSPOT_NUM-1 : 0];
134
 
135
 
136
        wire [EAw-1      :   0] unicast_dest_e_addr;
137
        wire [PCK_SIZw-1 : 0] pck_size_uni;
138
 
139
        pck_dst_gen_unicast #(
140
                .NE(NE),
141
                .TRAFFIC(TRAFFIC),
142
                .MAX_PCK_NUM(MAX_PCK_NUM),
143
                .HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
144
        )
145
        unicast
146
        (
147
                .en               (en              ),
148
                .current_e_addr   (current_e_addr  ),
149
                .core_num         (core_num        ),
150
                .pck_number       (pck_number      ),
151
                .dest_e_addr      (unicast_dest_e_addr),
152
                .clk              (clk             ),
153
                .reset            (reset           ),
154
                .valid_dst        (valid_dst       ),
155
                .hotspot_info     (hotspot_info    ),
156
                .custom_traffic_t (custom_traffic_t),
157
                .custom_traffic_en(custom_traffic_en)
158
        );
159
 
160
        pck_size_gen #(
161
                .PCK_SIZw(PCK_SIZw),
162
                .MIN(MIN_PACKET_SIZE),
163
                .MAX(MAX_PACKET_SIZE),
164
                .PCK_SIZ_SEL(PCK_SIZ_SEL),
165
                .DISCRETE_PCK_SIZ_NUM(DISCRETE_PCK_SIZ_NUM)
166
        )
167
        unicast_pck_size
168
        (
169
                .reset(reset),
170
                .clk(clk),
171
                .en(en),
172
                .pck_size(pck_size_uni) ,
173
                .rnd_discrete(rnd_discrete)
174
        );
175
 
176
 
177
 
178
 
179
 
180
 
181
        generate
182
        if(CAST_TYPE == "UNICAST") begin :uni
183
                assign dest_e_addr =    unicast_dest_e_addr;
184
                assign pck_size_o  =   pck_size_uni;
185
        end else begin :multi
186
                reg [DAw-1      :   0] multicast_dest_e_addr,temp;
187
                reg [6: 0] rnd_reg;
188
                wire [PCK_SIZw-1 : 0] pck_size_mcast;
189
                reg  [PCK_SIZw-1 : 0] pck_siz_tmp;
190
                wire [NEw-1 : 0] unicast_id_num;
191
 
192
 
193
                endp_addr_decoder  #(
194
                                .T1(T1),
195
                                .T2(T2),
196
                                .T3(T3),
197
                                .NE(NE),
198
                                .EAw(EAw),
199
                                .TOPOLOGY(TOPOLOGY)
200
                        )enc
201
                        (
202
                                .code(unicast_dest_e_addr),
203
                                .id(unicast_id_num)
204
                        );
205
 
206
 
207
                pck_size_gen #(
208
                        .PCK_SIZw(PCK_SIZw),
209
                        .MIN(MCAST_PCK_SIZ_MIN),
210
                        .MAX(MCAST_PCK_SIZ_MAX),
211
                        .PCK_SIZ_SEL("random-range"),
212
                        .DISCRETE_PCK_SIZ_NUM(DISCRETE_PCK_SIZ_NUM)
213
                )
214
                mcast_pck_size
215
                (
216
                        .reset(reset),
217
                        .clk(clk),
218
                        .en(en),
219
                        .pck_size(pck_size_mcast) ,
220
                        .rnd_discrete(rnd_discrete)
221
                );
222
 
223
 
224
 
225
 
226
                always @(posedge clk ) begin
227
                        if(en | reset) begin
228
                                rnd_reg <=     $urandom_range(99,0);
229
                        end
230
                end
231
 
232
                if(CAST_TYPE == "MULTICAST_FULL") begin :mful
233
 
234
                        always @( * ) begin
235
                                multicast_dest_e_addr = {DAw{1'b0}};
236
                                temp={DAw{1'b0}};
237
                                temp[unicast_id_num]=1'b1;
238
                                pck_siz_tmp= pck_size_uni;
239
                                if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
240
                                        multicast_dest_e_addr[unicast_id_num]=1'b1;
241
                                end
242
                                else begin
243
                                        multicast_dest_e_addr =  $urandom();
244
                                        pck_siz_tmp=pck_size_mcast;
245
                                end
246
                                if(SELF_LOOP_EN == "NO") multicast_dest_e_addr[core_num]=1'b0;
247
                        end
248
 
249
 
250
 
251
                        assign dest_e_addr = (multicast_dest_e_addr=={DAw{1'b0}} )? temp : multicast_dest_e_addr ;
252
                        assign pck_size_o = pck_siz_tmp;
253
 
254
                end else if(CAST_TYPE == "MULTICAST_PARTIAL") begin :mpar
255
 
256
                        always @( * ) begin
257
                                multicast_dest_e_addr = {DAw{1'b0}};
258
                                temp={unicast_dest_e_addr,1'b1};
259
                                pck_siz_tmp= pck_size_uni;
260
                                if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
261
                                        multicast_dest_e_addr = {unicast_dest_e_addr,1'b1};
262
                                end
263
                                else begin
264
                                        multicast_dest_e_addr =  $urandom();
265
                                        multicast_dest_e_addr[0] =1'b0;
266
                                        pck_siz_tmp=pck_size_mcast;
267
                                        if(SELF_LOOP_EN == "NO") begin
268
                                                if(MCAST_ENDP_LIST[core_num]==1'b1) multicast_dest_e_addr[endp_id_to_mcast_id(core_num)+1]=1'b0;
269
                                        end
270
                                end
271
                        end
272
 
273
                        assign dest_e_addr = (multicast_dest_e_addr=={DAw{1'b0}} )? temp : multicast_dest_e_addr ;
274
                        assign pck_size_o = pck_siz_tmp;
275
 
276
 
277
 
278
                end else begin //Broadcast
279
 
280
                        always @( * ) begin
281
                                multicast_dest_e_addr = {DAw{1'b0}};
282
                                pck_siz_tmp = pck_size_uni;
283
                                if(rnd_reg >= MCAST_TRAFFIC_RATIO) begin
284
                                        multicast_dest_e_addr = {unicast_dest_e_addr,1'b1};
285
                                end
286
                                else begin
287
                                        pck_siz_tmp=pck_size_mcast;
288
                                end
289
                        end
290
                        assign dest_e_addr =  multicast_dest_e_addr ;
291
                        assign pck_size_o = pck_siz_tmp;
292
 
293
 
294
                end
295
 
296
        end endgenerate
297
 
298
endmodule
299
 
300
 
301
 
302
 
303
 
304
 
305
 
306
 
307
 
308
 
309
 
310
 
311
 
312
 
313
 
314
module  pck_dst_gen_unicast
315 48 alirezamon
        import pronoc_pkg::*;
316
        #(
317
    parameter NE=4,
318
    parameter TRAFFIC =   "RANDOM",
319
    parameter MAX_PCK_NUM = 10000,
320
    parameter HOTSPOT_NODE_NUM =  4
321
)(
322
    en,
323
    current_e_addr,
324
    core_num,
325
    pck_number,
326
    dest_e_addr,
327
    clk,
328
    reset,
329
    valid_dst,
330
    hotspot_info,
331
        custom_traffic_t,
332
        custom_traffic_en
333
);
334
 
335
 
336
    localparam      ADDR_DIMENSION =   (TOPOLOGY ==    "MESH" || TOPOLOGY ==  "TORUS") ? 2 : 1;  // "RING" and FULLY_CONNECT
337
 
338
 
339
    function integer log2;
340
      input integer number; begin
341
         log2=(number <=1) ? 1: 0;
342
         while(2**log2
343
            log2=log2+1;
344
         end
345
      end
346
    endfunction // log2
347
 
348
 
349
    localparam  NEw= log2(NE),
350
                PCK_CNTw = log2(MAX_PCK_NUM+1),
351
                HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
352
 
353
    input                       reset,clk,en;
354
    input   [NEw-1      :   0]  core_num;
355
    input   [PCK_CNTw-1 :   0]  pck_number;
356
    input   [EAw-1      :   0]  current_e_addr;
357
    output  [EAw-1      :   0]  dest_e_addr;
358
    output                      valid_dst;
359
        input  [NEw-1 : 0] custom_traffic_t;
360
        input  custom_traffic_en;
361
 
362
    input hotspot_t  hotspot_info [HOTSPOT_NUM-1 : 0];
363
 
364
 
365
     generate
366
     if ( ADDR_DIMENSION == 2) begin :two_dim
367
 
368
        two_dimension_pck_dst_gen #(
369
                .NE(NE),
370
                .TRAFFIC(TRAFFIC),
371
                .MAX_PCK_NUM(MAX_PCK_NUM),
372
                .HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
373
 
374
        )
375
        the_two_dimension_pck_dst_gen
376
        (
377
                .reset(reset),
378
                .clk(clk),
379
                .en(en),
380
                .core_num(core_num),
381
                .pck_number(pck_number),
382
                .current_e_addr(current_e_addr),
383
            .dest_e_addr(dest_e_addr),
384
                .valid_dst(valid_dst),
385
                .hotspot_info(hotspot_info),
386
                        .custom_traffic_t(custom_traffic_t),
387
                        .custom_traffic_en(custom_traffic_en)
388
        );
389
 
390
     end else begin : one_dim
391
 
392
        one_dimension_pck_dst_gen #(
393
                        .NE(NE),
394
                        .TRAFFIC(TRAFFIC),
395
                        .MAX_PCK_NUM(MAX_PCK_NUM),
396
                        .HOTSPOT_NODE_NUM(HOTSPOT_NODE_NUM)
397
        )
398
        the_one_dimension_pck_dst_gen
399
        (
400
            .reset(reset),
401
            .clk(clk),
402
            .en(en),
403
            .core_num(core_num),
404
            .pck_number(pck_number),
405
            .current_e_addr(current_e_addr),
406
            .dest_e_addr(dest_e_addr),
407
            .valid_dst(valid_dst),
408
            .hotspot_info(hotspot_info),
409
                        .custom_traffic_t(custom_traffic_t),
410
                        .custom_traffic_en(custom_traffic_en)
411
        );
412
 
413
     end
414
     endgenerate
415
 endmodule
416
 
417
 
418
 
419
 
420
module two_dimension_pck_dst_gen
421
                import pronoc_pkg::*;
422
        #(
423
                parameter NE=4,
424
                parameter TRAFFIC =   "RANDOM",
425
                parameter MAX_PCK_NUM = 10000,
426
                parameter HOTSPOT_NODE_NUM =  4
427
 
428
)(
429
    en,
430
    current_e_addr,
431
    dest_e_addr,
432
    core_num,
433
    pck_number,
434
    clk,
435
    reset,
436
    valid_dst,
437
    hotspot_info,
438
        custom_traffic_t,
439
        custom_traffic_en
440
);
441
 
442
 
443
    function integer log2;
444
      input integer number; begin
445
         log2=(number <=1) ? 1: 0;
446
         while(2**log2
447
            log2=log2+1;
448
         end
449
      end
450
    endfunction // log2
451
 
452
 
453
    localparam NEw= log2(NE),
454
                PCK_CNTw = log2(MAX_PCK_NUM+1),
455
                HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
456
 
457
    input                       reset,clk,en;
458
    input   [NEw-1      :   0]  core_num;
459
    input   [PCK_CNTw-1 :   0]  pck_number;
460
    input   [EAw-1 : 0] current_e_addr;
461
    output  [EAw-1 : 0]  dest_e_addr;
462
    output                      valid_dst;
463
    input hotspot_t  hotspot_info [HOTSPOT_NUM-1 : 0];
464
        input  [NEw-1 : 0] custom_traffic_t;
465
        input  custom_traffic_en;
466
 
467
    localparam
468
        NX = T1,
469
        NY = T2,
470
        NL = T3,
471
        NXw = log2(NX),
472
        NYw= log2(NY),
473
        NLw= log2(NL);
474
 
475
    wire [NXw-1 : 0] current_x;
476
    wire [NYw-1 : 0] current_y;
477
    wire [NLw-1  : 0] current_l;
478
    wire [NXw-1 : 0] dest_x;
479
    wire [NYw-1 : 0] dest_y;
480
    wire [NLw-1  : 0] dest_l;
481
 
482
    mesh_tori_endp_addr_decode #(
483
        .TOPOLOGY(TOPOLOGY),
484
        .T1(T1),
485
        .T2(T2),
486
        .T3(T3),
487
        .EAw(EAw)
488
    )
489
    src_addr_decode
490
    (
491
        .e_addr(current_e_addr),
492
        .ex(current_x),
493
        .ey(current_y),
494
        .el(current_l),
495
        .valid( )
496
    );
497
 
498
    wire off_flag;
499
 
500
 
501
 
502
 
503
 
504
    wire    [NEw-1  :   0]  dest_ip_num;
505
    genvar i;
506
 
507
    generate
508
    if (TRAFFIC == "RANDOM") begin
509
 
510
        logic [6 : 0] rnd_reg;
511
 
512
        always @(posedge clk ) begin
513
                if(en | reset) begin
514
                        rnd_reg =     $urandom_range(NE-1,0);
515
                        if(SELF_LOOP_EN == "NO")        while(rnd_reg==core_num) rnd_reg =     $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
516
 
517
                end
518
        end
519
        assign dest_ip_num = rnd_reg;
520
 
521
       endp_addr_encoder #(
522
        .T1(T1),
523
        .T2(T2),
524
        .T3(T3),
525
        .NE(NE),
526
        .EAw(EAw),
527
        .TOPOLOGY(TOPOLOGY)
528
       )
529
       addr_encoder
530
       (
531
        .id(dest_ip_num),
532
        .code(dest_e_addr)
533
       );
534
 
535
     end else if (TRAFFIC == "HOTSPOT") begin
536
 
537
        hot_spot_dest_gen  #(
538
                        .HOTSPOT_NUM(HOTSPOT_NUM),
539
                        .NE(NE),
540
                        .NEw(NEw)
541
                )hspot
542
                (
543
                        .reset(reset),
544
                        .clk(clk),
545
                        .en(en),
546
                        .hotspot_info(hotspot_info),
547
                        .dest_ip_num (dest_ip_num),
548
                        .core_num(core_num),
549
                        .off_flag(off_flag)
550
                );
551
 
552
        endp_addr_encoder #(
553
            .T1(T1),
554
            .T2(T2),
555
            .T3(T3),
556
            .NE(NE),
557
            .EAw(EAw),
558
            .TOPOLOGY(TOPOLOGY)
559
        )
560
        addr_encoder
561
        (
562
            .id(dest_ip_num),
563
            .code(dest_e_addr)
564
        );
565
 
566
 
567
 
568
    end else if( TRAFFIC == "TRANSPOSE1") begin
569
 
570
        assign dest_x   = NX-current_y-1;
571
        assign dest_y   = NY-current_x-1;
572
        assign dest_l   = NL-current_l-1;
573
        assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
574
 
575
        endp_addr_decoder  #(
576
                .T1(T1),
577
                .T2(T2),
578
                .T3(T3),
579
                .NE(NE),
580
                .EAw(EAw),
581
                .TOPOLOGY(TOPOLOGY)
582
        )enc
583
        (
584
                .code(dest_e_addr),
585
                .id(dest_ip_num)
586
        );
587
 
588
 
589
 
590
 
591
 
592
 
593
    end else if( TRAFFIC == "TRANSPOSE2") begin :transpose2
594
 
595
        assign dest_x   = current_y;
596
        assign dest_y   = current_x;
597
        assign dest_l   = current_l;
598
        assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
599
 
600
        endp_addr_decoder  #(
601
                        .T1(T1),
602
                        .T2(T2),
603
                        .T3(T3),
604
                        .NE(NE),
605
                        .EAw(EAw),
606
                        .TOPOLOGY(TOPOLOGY)
607
                )enc
608
                (
609
                        .code(dest_e_addr),
610
                        .id(dest_ip_num)
611
                );
612
 
613
 
614
 
615
    end  else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
616
 
617
        for(i=0; i<(EAw); i=i+1'b1) begin :lp//reverse the address
618
            assign dest_ip_num[i]  = current_e_addr [((EAw)-1)-i];
619
        end
620
 
621
        endp_addr_encoder #(
622
            .T1(T1),
623
            .T2(T2),
624
            .T3(T3),
625
            .NE(NE),
626
            .EAw(EAw),
627
            .TOPOLOGY(TOPOLOGY)
628
        )
629
        addr_encoder(
630
            .id(dest_ip_num),
631
            .code(dest_e_addr)
632
        );
633
 
634
 
635
    end  else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
636
 
637
        assign dest_x   = ~current_x;
638
        assign dest_y   = ~current_y;
639
        assign dest_l   = ~dest_l;
640
        assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
641
 
642
        endp_addr_decoder  #(
643
                        .T1(T1),
644
                        .T2(T2),
645
                        .T3(T3),
646
                        .NE(NE),
647
                        .EAw(EAw),
648
                        .TOPOLOGY(TOPOLOGY)
649
                )enc
650
                (
651
                        .code(dest_e_addr),
652
                        .id(dest_ip_num)
653
                );
654
 
655
 
656
 
657
 
658
    end else if( TRAFFIC == "TORNADO" ) begin :tornado
659
        //[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
660
        assign dest_x  = (current_x> ((NX+1)/2))? current_x- ((NX+1)/2) -1   :  (NX/2)+current_x-1;  //  = ((current_x + ((NX/2)-1))%NX);
661
        assign dest_y  = (current_y> ((NY+1)/2))? current_y- ((NY+1)/2) -1   :  (NY/2)+current_y-1;  //  = ((current_y + ((NY/2)-1))%NY);
662
        assign dest_l   = current_l;
663
        assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
664
 
665
        endp_addr_decoder  #(
666
                        .T1(T1),
667
                        .T2(T2),
668
                        .T3(T3),
669
                        .NE(NE),
670
                        .EAw(EAw),
671
                        .TOPOLOGY(TOPOLOGY)
672
                )enc
673
                (
674
                        .code(dest_e_addr),
675
                        .id(dest_ip_num)
676
                );
677
 
678
 
679
 
680
 
681
        end else if( TRAFFIC == "NEIGHBOR")  begin :neighbor
682
                //dx = sx + 1 mod k
683
                 assign dest_x = (current_x + 1) >= NX? 0 : (current_x + 1);
684
                 assign dest_y = (current_y + 1) >= NY? 0 : (current_y + 1);
685
                 assign dest_l = current_l;
686
                 assign dest_e_addr = (T3==1)? {dest_y,dest_x} : {dest_l,dest_y,dest_x};
687
 
688
                 endp_addr_decoder  #(
689
                                .T1(T1),
690
                                .T2(T2),
691
                                .T3(T3),
692
                                .NE(NE),
693
                                .EAw(EAw),
694
                                .TOPOLOGY(TOPOLOGY)
695
                        )enc
696
                        (
697
                                .code(dest_e_addr),
698
                                .id(dest_ip_num)
699
                        );
700
 
701
 
702
 
703
 
704
        end else if( TRAFFIC == "SHUFFLE") begin: shuffle
705
                //di = si−1 mod b
706
                for(i=1; i<(EAw); i=i+1'b1) begin :lp//reverse the address
707
            assign dest_ip_num[i]  = current_e_addr [i-1];
708
        end
709
                assign dest_ip_num[0]  = current_e_addr [EAw-1];
710
                 endp_addr_encoder #(
711
            .T1(T1),
712
            .T2(T2),
713
            .T3(T3),
714
            .NE(NE),
715
            .EAw(EAw),
716
            .TOPOLOGY(TOPOLOGY)
717
        )
718
        addr_encoder(
719
            .id(dest_ip_num),
720
            .code(dest_e_addr)
721
        );
722
 
723
 
724
    end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
725
                //di = si+1 mod b
726
                for(i=0; i<(EAw-1); i=i+1'b1) begin :lp//reverse the address
727
            assign dest_ip_num[i]  = current_e_addr [i+1];
728
        end
729
                assign dest_ip_num[EAw-1]  = current_e_addr [0];
730
                endp_addr_encoder #(
731
            .T1(T1),
732
            .T2(T2),
733
            .T3(T3),
734
            .NE(NE),
735
            .EAw(EAw),
736
            .TOPOLOGY(TOPOLOGY)
737
        )
738
        addr_encoder(
739
            .id(dest_ip_num),
740
            .code(dest_e_addr)
741
        );
742
 
743
        end else if(TRAFFIC == "CUSTOM" )begin
744
 
745
        assign dest_ip_num = custom_traffic_t;
746
                 endp_addr_encoder #(
747
            .T1(T1),
748
            .T2(T2),
749
            .T3(T3),
750
            .NE(NE),
751
            .EAw(EAw),
752
            .TOPOLOGY(TOPOLOGY)
753
        )
754
        addr_encoder
755
        (
756
            .id(dest_ip_num),
757
            .code(dest_e_addr)
758
        );
759
 
760
                assign  off_flag  =  ~custom_traffic_en;
761
 
762
 
763
    end  else begin
764
                        initial begin
765
                                $display("ERROR: Undefined Traffic pattern:%s",TRAFFIC);
766
                                $stop;
767
                        end
768
        end
769
 
770
 
771
 
772
        wire valid_temp  =    (dest_ip_num  <= (NE-1));
773
 
774
        if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
775
                assign valid_dst  = ~off_flag & valid_temp;
776
        end else begin
777
                assign valid_dst  =  valid_temp;
778
        end
779
 
780
 
781
    endgenerate
782
 
783
endmodule
784
 
785
 
786
 
787
/************
788
 
789
************/
790
 
791
 
792
module one_dimension_pck_dst_gen
793
import pronoc_pkg::*;
794
#(
795
                parameter NE=4,
796
                parameter TRAFFIC =   "RANDOM",
797
                parameter MAX_PCK_NUM = 10000,
798
                parameter HOTSPOT_NODE_NUM =  4
799
 
800
)(
801
    en,
802
    core_num,
803
    pck_number,
804
    current_e_addr,
805
    dest_e_addr,
806
    clk,
807
    reset,
808
    valid_dst,
809
    hotspot_info,
810
        custom_traffic_t,
811
        custom_traffic_en
812
);
813
 
814
    function integer log2;
815
      input integer number; begin
816
         log2=(number <=1) ? 1: 0;
817
         while(2**log2
818
            log2=log2+1;
819
         end
820
      end
821
    endfunction // log2
822
 
823
 
824
     localparam
825
        NEw= log2(NE),
826
        PCK_CNTw = log2(MAX_PCK_NUM+1),
827
        HOTSPOT_NUM= (TRAFFIC=="HOTSPOT")? HOTSPOT_NODE_NUM : 1;
828
 
829
    input   reset,clk,en;
830
    input   [NEw-1 : 0] core_num;
831
    input   [PCK_CNTw-1  :   0]  pck_number;
832
    input   [EAw-1       :   0]  current_e_addr;
833
    output  [EAw-1       :   0]  dest_e_addr;
834
    output  valid_dst;
835
    input hotspot_t  hotspot_info [HOTSPOT_NUM-1 : 0];
836
        input  [NEw-1 : 0] custom_traffic_t;
837
        input  custom_traffic_en;
838
 
839
    wire [NEw-1 : 0] dest_ip_num;
840
    wire off_flag;
841
    genvar i;
842
    generate
843
    if (TRAFFIC == "RANDOM") begin
844
        logic [6 : 0] rnd_reg;
845
 
846
        always @(posedge clk ) begin
847
                if(en | reset) begin
848
                        rnd_reg =     $urandom_range(NE-1,0);
849
                        if(SELF_LOOP_EN == "NO")        while(rnd_reg==core_num) rnd_reg =     $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
850
                end
851
        end
852
        assign dest_ip_num = rnd_reg;
853
 
854
 
855
     end else if (TRAFFIC == "HOTSPOT") begin
856
 
857
        hot_spot_dest_gen  #(
858
                .HOTSPOT_NUM(HOTSPOT_NUM),
859
                .NE(NE),
860
                .NEw(NEw)
861
                )hspot
862
                (
863
                .clk(clk),
864
                .en(en),
865
                .hotspot_info(hotspot_info),
866
                .dest_ip_num (dest_ip_num),
867
                .core_num(core_num),
868
                .off_flag(off_flag)
869
        );
870
 
871
 
872
 
873
    end else if( TRAFFIC == "TRANSPOSE1") begin :tran1
874
 
875
        assign dest_ip_num   = NE-core_num-1;
876
 
877
    end  else if( TRAFFIC == "BIT_REVERSE") begin :bitreverse
878
 
879
        for(i=0; i
880
            assign dest_ip_num[i]  = core_num [NEw-1-i];
881
        end
882
 
883
    end  else if( TRAFFIC == "BIT_COMPLEMENT") begin :bitcomp
884
 
885
            assign dest_ip_num   = ~core_num;
886
 
887
    end else if( TRAFFIC == "TORNADO" ) begin :tornado
888
        //[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
889
          assign dest_ip_num  = (core_num > ((NE+1)/2))? core_num- ((NE+1)/2) -1   :  (NE/2)+core_num-1;  //  = ((current_x + ((NX/2)-1))%NX);
890
 
891
        end else if( TRAFFIC == "NEIGHBOR")  begin :neighbor
892
                //dx = sx + 1 mod k
893
                 assign dest_ip_num = ((core_num + 1) >= NE) ? 0 : (core_num + 1);
894
 
895
        end else if( TRAFFIC == "SHUFFLE") begin: shuffle
896
                //di = si−1 mod b
897
                for(i=1; i<(NEw); i=i+1'b1) begin :lp
898
            assign dest_ip_num[i]  = core_num [i-1];
899
        end
900
                assign dest_ip_num[0]  = core_num [NEw-1];
901
 
902
    end else if(TRAFFIC == "BIT_ROTATION") begin :bitrot
903
                //di = si+1 mod b
904
                for(i=0; i<(NEw-1); i=i+1) begin :lp//reverse the address
905
            assign dest_ip_num[i]  = core_num [i+1];
906
        end
907
                assign dest_ip_num[NEw-1]  = core_num [0];
908
 
909
        end else if(TRAFFIC == "CUSTOM" )begin
910
                assign off_flag = ~custom_traffic_en;
911
         assign dest_ip_num = custom_traffic_t;
912
    end
913
 
914
    endp_addr_encoder #(
915
        .T1(T1),
916
        .T2(T2),
917
        .T3(T3),
918
        .NE(NE),
919
        .EAw(EAw),
920
        .TOPOLOGY(TOPOLOGY)
921
    )
922
    addr_encoder
923
    (
924
        .id(dest_ip_num),
925
        .code(dest_e_addr)
926
    );
927
 
928
    wire valid_temp  =    (dest_ip_num  <= (NE-1));
929
 
930
    if (TRAFFIC == "HOTSPOT" || TRAFFIC == "CUSTOM") begin
931
        assign valid_dst  = ~off_flag & valid_temp;
932
    end else begin
933
        assign valid_dst  =  valid_temp;
934
    end
935
 
936
    endgenerate
937
 
938
endmodule
939
 
940
/***************************
941
 *  pck_size_gen
942
 * *************************/
943
 
944
module pck_size_gen
945
                import pronoc_pkg::*;
946
#(
947
                parameter PCK_SIZw=4,
948
        parameter MIN = 2,
949
        parameter MAX = 5,
950
        parameter PCK_SIZ_SEL="random-discrete",
951
        parameter DISCRETE_PCK_SIZ_NUM=1
952
)
953
(
954
    reset,
955
    clk,
956
    en,
957
    pck_size,
958
    rnd_discrete
959
);
960
 
961
        input rnd_discrete_t rnd_discrete [DISCRETE_PCK_SIZ_NUM-1: 0];
962
 
963
 
964
    input reset, clk, en;
965
    output [PCK_SIZw-1 : 0] pck_size;
966
 
967
 
968
    generate
969
        if(PCK_SIZ_SEL == "random-discrete"     ) begin :discrete
970
                if(DISCRETE_PCK_SIZ_NUM==1) begin :single
971
                        assign pck_size = rnd_discrete[0].value;
972
                end else begin :multi
973
                        reg [PCK_SIZw-1 : 0] rnd,rnd_next;
974
                        integer rnd2;
975
                        integer k;
976
                        always @(*) begin
977
                                rnd_next = rnd;
978
                                if(en) begin
979
                                        if(rnd2 < rnd_discrete[0].percentage) rnd_next = rnd_discrete[0].value;
980
                                        for (k=1;k
981
                                                if(rnd2 >= rnd_discrete[k-1].percentage && rnd2 < rnd_discrete[k].percentage) rnd_next = rnd_discrete[k].value;
982
                                        end
983
                                end
984
                        end//always
985
 
986
 
987
                        always @(posedge clk) begin
988
                                if(reset)  begin
989
                                        rnd2<= 0;
990
                                        rnd <= rnd_discrete[0].value;
991
                                end else  begin
992
                                        if(en) rnd2<= $urandom_range(99,0);
993
                                        rnd <= rnd_next;
994
                                end
995
                        end//always
996
 
997
                        assign pck_size = rnd;
998
                end//multi
999
 
1000
        end else begin :range
1001
                if (MIN == MAX) begin :eq
1002
                assign pck_size = MIN;
1003
            end  else begin :noteq
1004
                reg [PCK_SIZw-1 : 0] rnd;
1005
                always @(posedge clk) begin
1006
                    if(reset) rnd = MIN;
1007
                    else if(en) rnd = $urandom_range(MAX,MIN);
1008
                end
1009
                assign pck_size = rnd;
1010
            end
1011
        end
1012
        endgenerate
1013
endmodule
1014
 
1015
 
1016
 
1017
 
1018
module hot_spot_dest_gen
1019
        import pronoc_pkg::*;
1020
#(
1021
        parameter HOTSPOT_NUM=2,
1022
        parameter NE=16,
1023
        parameter NEw=4
1024
)
1025
(
1026
clk,
1027
reset,
1028
en,
1029
hotspot_info,
1030
core_num,
1031
dest_ip_num,
1032
off_flag
1033
);
1034
 
1035
        input clk,en,reset;
1036
        input hotspot_t  hotspot_info [HOTSPOT_NUM-1 : 0];
1037
        input   [NEw-1 : 0] core_num;
1038
        output  [NEw-1 : 0] dest_ip_num;
1039
        output reg off_flag;
1040
 
1041
        logic [6 : 0] rnd_reg, hotspot_node;
1042
        reg [9 : 0] rnd1000;
1043
        always @(posedge clk ) begin
1044
                if(en | reset) begin
1045
                        rnd_reg =     $urandom_range(NE-1,0);
1046
                        if(SELF_LOOP_EN == "NO")        while(rnd_reg==core_num) rnd_reg =     $urandom_range(NE-1,0);// get a random IP core, make sure its not same as sender core
1047
 
1048
                        rnd1000 =     $urandom_range(999,0);// generate a random number between 0 & 1000
1049
                end
1050
        end
1051
 
1052
        logic hotspot_flag;
1053
        integer i;
1054
 
1055
        always @(*)begin
1056
                off_flag=0;
1057
                for (i=0;i
1058
                        if ( hotspot_info[i].send_enable == 0 && core_num ==hotspot_info[i].ip_num)begin
1059
                                off_flag=1;
1060
                        end
1061
                end
1062
                hotspot_flag=0;
1063
                hotspot_node=0;
1064
                if ( rnd1000 < hotspot_info[0].percentage && core_num !=hotspot_info[0].ip_num)begin
1065
                        hotspot_flag=1;
1066
                        hotspot_node=hotspot_info[0].ip_num;
1067
                end else begin
1068
                        for (i=1;i
1069
                                if (rnd1000 >= hotspot_info[i-1].percentage && rnd1000 < hotspot_info[i].percentage && core_num !=hotspot_info[i].ip_num) begin
1070
                                        hotspot_flag=1;
1071
                                        hotspot_node=hotspot_info[i].ip_num;
1072
                                end
1073
                        end end
1074
 
1075
        end
1076
 
1077
 
1078
        assign dest_ip_num = (off_flag)? core_num : (hotspot_flag)? hotspot_node : rnd_reg;
1079
 
1080
 
1081
endmodule

powered by: WebSVN 2.1.0

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