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 56

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

powered by: WebSVN 2.1.0

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