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_noc/] [fattree_route.v] - Blame information for rev 54

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
`timescale 1ns / 1ps
2
/**************************************
3
*
4
*   fattree rout function
5
*
6
***************************************/
7
 
8
// ============================================================
9
//  FATTREE: Nearest Common Ancestor w/ Random  Routing Up
10
// ============================================================
11
 
12
module fattree_nca_random_up_routing  #(
13
   parameter K   = 2, // number of last level individual router`s endpoints.
14
   parameter L   = 2 // Fattree layer number (The height of FT)
15
 
16
)
17
(
18
    reset,
19
    clk,
20
    current_addr_encoded,    // connected to current router x address
21
    current_level,    //connected to current router y address
22
    dest_addr_encoded,        // destination address
23
    destport_encoded    // router output port
24
 
25
);
26
 
27
 
28
    function integer log2;
29
      input integer number; begin
30
         log2=(number <=1) ? 1: 0;
31
         while(2**log2<number) begin
32
            log2=log2+1;
33
         end
34
      end
35
    endfunction // log2 
36
 
37
 
38
    localparam
39
        Kw = log2(K),
40
        LKw= L*Kw,
41
        Lw = log2(L);
42
 
43
 
44
 
45
    input reset,clk;
46
    input  [LKw-1 :0]    current_addr_encoded;
47
    input  [Lw-1  :0]    current_level;
48
    input  [LKw-1 :0]    dest_addr_encoded;
49
    output [K :0]    destport_encoded;
50
    /******************
51
        destport_encoded format in fat tree. K+1 bit
52
        destport[K]
53
            1'b0  : go down
54
            1'b1  : go up
55
        destport[K-1: 0]:
56
            onehot coded. asserted bit show the output port locatation
57
    *******************/
58
 
59
 
60
 
61
    wire  [Kw-1 :0]  current_addr [L-1 : 0];
62
    wire  [Kw-1 :0]  parrent_dest_addr [L-1 : 0];
63
    wire  [Kw-1 :0]  dest_addr [L-1 : 0];
64
    wire  [Kw-1 :0]  current_node_dest_port;
65
 
66
    wire [L-1 : 0] parrents_node_missmatch;
67
 
68 54 alirezamon
    wire [K-1 : 0] counter; // a one hot counter. The value of the counter is used as a random destination port number when going to the up ports
69
 
70
     pronoc_register #(
71
           .W(K),
72
           .RESET_TO(1)
73
      ) reg1 (
74
           .in({counter[0],counter[K-1:1]}),
75
           .reset(reset),
76
           .clk(clk),
77
           .out(counter)
78
      );
79
 
80 48 alirezamon
 
81
 
82 54 alirezamon
 
83
 
84 48 alirezamon
    assign current_addr [0]={Kw{1'b0}};
85
    assign parrent_dest_addr [0]={Kw{1'b0}};
86
 
87
    genvar i;
88
    generate
89
    for(i=1; i<L; i=i+1)begin : caddr
90
        /* verilator lint_off WIDTH */
91
        assign current_addr [i] = (current_level <i)? current_addr_encoded[i*Kw-1 : (i-1)*Kw] : {Kw{1'b0}};
92
        assign parrent_dest_addr [i] = (current_level<i)? dest_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
93
        /* verilator lint_on WIDTH */
94
    end
95
 
96
 
97
    for(i=0; i<L; i=i+1) begin : daddr
98
       // assign current_addr [i] = (current_level >=i)? current_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
99
 
100
        assign dest_addr [i] =  dest_addr_encoded[(i+1)*Kw-1 : i*Kw];
101
        assign parrents_node_missmatch[i]=  current_addr [i] !=  parrent_dest_addr [i];
102
    end//for
103
    endgenerate
104
 
105
   assign current_node_dest_port = dest_addr[current_level];
106
   wire [K-1:0] current_node_dest_port_one_hot;
107
 
108
   bin_to_one_hot #(
109
    .BIN_WIDTH(Kw),
110
    .ONE_HOT_WIDTH(K)
111
   )
112
   conv
113
   (
114
    .bin_code(current_node_dest_port),
115
    .one_hot_code(current_node_dest_port_one_hot)
116
   );
117
 
118
    assign destport_encoded = (parrents_node_missmatch != {L{1'b0}}) ? /*go up*/{1'b1,counter} :  /*go down*/{1'b0,current_node_dest_port_one_hot};
119
 
120
endmodule
121
 
122
 
123
 
124
// ============================================================
125
//  FATTREE: Nearest Common Ancestor w/ destination port Up. 
126
//  The up port is selected based on destination connected port num
127
// ============================================================
128
 
129
module fattree_nca_destp_up_routing  #(
130
   parameter K   = 2, // number of last level individual router`s endpoints.
131
   parameter L   = 2 // Fattree layer number (The height of FT)
132
 
133
)
134
(
135
    reset,
136
    clk,
137
    current_addr_encoded,    // connected to current router x address
138
    current_level,    //connected to current router y address
139
    dest_addr_encoded,        // destination address
140
    destport_encoded    // router output port
141
 
142
);
143
 
144
 
145
    function integer log2;
146
      input integer number; begin
147
         log2=(number <=1) ? 1: 0;
148
         while(2**log2<number) begin
149
            log2=log2+1;
150
         end
151
      end
152
    endfunction // log2 
153
 
154
 
155
    localparam
156
        Kw = log2(K),
157
        LKw= L*Kw,
158
        Lw = log2(L);
159
 
160
 
161
 
162
    input reset,clk;
163
    input  [LKw-1 :0]    current_addr_encoded;
164
    input  [Lw-1  :0]    current_level;
165
    input  [LKw-1 :0]    dest_addr_encoded;
166
    output [K :0]    destport_encoded;
167
    /******************
168
        destport_encoded format in fat tree. K+1 bit
169
        destport[K]
170
            1'b0  : go down
171
            1'b1  : go up
172
        destport[K-1: 0]:
173
            onehot coded. asserted bit show the output port locatation
174
    *******************/
175
 
176
 
177
 
178
    wire  [Kw-1 :0]  current_addr [L-1 : 0];
179
    wire  [Kw-1 :0]  parrent_dest_addr [L-1 : 0];
180
    wire  [Kw-1 :0]  dest_addr [L-1 : 0];
181
    wire  [Kw-1 :0]  current_node_dest_port;
182
 
183
    wire [L-1 : 0] parrents_node_missmatch;
184
 
185 54 alirezamon
    wire [K-1 : 0] counter; // a one hot counter. The value of the counter is used as a random destination port number when going to the up ports
186 48 alirezamon
 
187 54 alirezamon
     pronoc_register #(
188
           .W(K),
189
           .RESET_TO(1)
190
      ) reg1 (
191
           .in({counter[0],counter[K-1:1]}),
192
           .reset(reset),
193
           .clk(clk),
194
           .out(counter)
195
      );
196
 
197 48 alirezamon
    assign current_addr [0]={Kw{1'b0}};
198
    assign parrent_dest_addr [0]={Kw{1'b0}};
199
 
200
    genvar i;
201
    generate
202
    for(i=1; i<L; i=i+1) begin : caddr
203
        assign current_addr [i] = (current_level <i)? current_addr_encoded[i*Kw-1 : (i-1)*Kw] : {Kw{1'b0}};
204
        assign parrent_dest_addr [i] = (current_level<i)? dest_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
205
    end
206
 
207
 
208
    for(i=0; i<L; i=i+1) begin : daddr
209
       // assign current_addr [i] = (current_level >=i)? current_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
210
 
211
        assign dest_addr [i] =  dest_addr_encoded[(i+1)*Kw-1 : i*Kw];
212
        assign parrents_node_missmatch[i]=  current_addr [i] !=  parrent_dest_addr [i];
213
    end//for
214
    endgenerate
215
 
216
   assign current_node_dest_port = dest_addr[current_level];
217
   wire [K-1:0] current_node_dest_port_one_hot;
218
 
219
   bin_to_one_hot #(
220
    .BIN_WIDTH(Kw),
221
    .ONE_HOT_WIDTH(K)
222
   )
223
   conv
224
   (
225
    .bin_code(current_node_dest_port),
226
    .one_hot_code(current_node_dest_port_one_hot)
227
   );
228
 
229
    assign destport_encoded = (parrents_node_missmatch != {L{1'b0}}) ? /*go up*/{1'b1,current_node_dest_port_one_hot} :  /*go down*/{1'b0,current_node_dest_port_one_hot};
230
 
231
endmodule
232
 
233
 
234
// ============================================================
235
//  FATTREE: Nearest Common Ancestor w/ straight port Up. 
236
//  The up port is in the same column as reciver port
237
// ============================================================
238
 
239
module fattree_nca_straight_up_routing  #(
240
   parameter K   = 2, // number of last level individual router`s endpoints.
241
   parameter L   = 2 // Fattree layer number (The height of FT)
242
 
243
)
244
(
245
    reset,
246
    clk,
247
    current_addr_encoded,    // connected to current router x address
248
    current_level,    //connected to current router y address
249
    dest_addr_encoded,        // destination address
250
    destport_encoded    // router output port
251
 
252
);
253
 
254
 
255
 
256
 
257
    function integer log2;
258
      input integer number; begin
259
         log2=(number <=1) ? 1: 0;
260
         while(2**log2<number) begin
261
            log2=log2+1;
262
         end
263
      end
264
    endfunction // log2 
265
 
266
 
267
    localparam
268
        Kw = log2(K),
269
        LKw= L*Kw,
270
        Lw = log2(L);
271
 
272
 
273
 
274
    input reset,clk;
275
 
276
    input  [LKw-1 :0]    current_addr_encoded;
277
    input  [Lw-1  :0]    current_level;
278
    input  [LKw-1 :0]    dest_addr_encoded;
279
    output [K :0]    destport_encoded;
280
 
281
    /******************
282
        destport_encoded format in fat tree. K+1 bit
283
        destport[K]
284
            1'b0  : go down
285
            1'b1  : go up
286
        destport[K-1: 0]:
287
            onehot coded. asserted bit show the output port locatation
288
    *******************/
289
 
290
 
291
 
292
    wire  [Kw-1 :0]  current_addr [L-1 : 0];
293
    wire  [Kw-1 :0]  parrent_dest_addr [L-1 : 0];
294
    wire  [Kw-1 :0]  dest_addr [L-1 : 0];
295
    wire  [Kw-1 :0]  current_node_dest_port;
296
 
297
    wire [L-1 : 0] parrents_node_missmatch;
298
 
299 54 alirezamon
    wire  [K-1 : 0] counter; // a one hot counter. The value of the counter is used as a random destination port number when going to the up ports
300 48 alirezamon
 
301 54 alirezamon
     pronoc_register #(
302
           .W(K),
303
           .RESET_TO(1)
304
      ) reg1 (
305
           .in({counter[0],counter[K-1:1]}),
306
           .reset(reset),
307
           .clk(clk),
308
           .out(counter)
309
      );
310 48 alirezamon
 
311
    assign current_addr [0]={Kw{1'b0}};
312
    assign parrent_dest_addr [0]={Kw{1'b0}};
313
 
314
    genvar i;
315
    generate
316
    for(i=1; i<L; i=i+1)begin : caddr
317
        assign current_addr [i] = (current_level <i)? current_addr_encoded[i*Kw-1 : (i-1)*Kw] : {Kw{1'b0}};
318
        assign parrent_dest_addr [i] = (current_level<i)? dest_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
319
    end
320
 
321
 
322
    for(i=0; i<L; i=i+1)begin : daddr
323
       // assign current_addr [i] = (current_level >=i)? current_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
324
 
325
        assign dest_addr [i] =  dest_addr_encoded[(i+1)*Kw-1 : i*Kw];
326
        assign parrents_node_missmatch[i]=  current_addr [i] !=  parrent_dest_addr [i];
327
    end//for
328
    endgenerate
329
 
330
   assign current_node_dest_port = dest_addr[current_level];
331
   wire [K-1:0] current_node_dest_port_one_hot;
332
 
333
   bin_to_one_hot #(
334
    .BIN_WIDTH(Kw),
335
    .ONE_HOT_WIDTH(K)
336
   )
337
   conv
338
   (
339
    .bin_code(current_node_dest_port),
340
    .one_hot_code(current_node_dest_port_one_hot)
341
   );
342
 
343
    // if going up the destination port num is statis straigh. It will be filled at reciver port of the next router so leave it empty
344
    assign destport_encoded = (parrents_node_missmatch != {L{1'b0}}) ? /*go up*/{1'b1,{K{1'b0}}} :  /*go down*/{1'b0,current_node_dest_port_one_hot};
345
 
346
endmodule
347
 
348
 
349
module    fattree_destport_up_select #(
350
      parameter   K=3,
351
      parameter   SW_LOC=0
352
)(
353
        destport_in,
354
        destport_o
355
);
356
 
357
    input  [K :0]    destport_in;
358
    output [K :0]    destport_o;
359
 
360
    localparam [K-1 : 0] SW_LOC_ONHOT = 1<< SW_LOC;
361
 
362
 
363
    wire going_up = destport_in[K];
364
    assign destport_o = (going_up)?  {1'b1,SW_LOC_ONHOT[K-1 : 0]} : destport_in;
365
 
366
endmodule
367
 
368
 
369
 
370
/*************************
371
 *  fattree_conventional_routing
372
 * **********************/
373
 
374
 
375
module fattree_conventional_routing #(
376
    parameter ROUTE_NAME = "NCA_RND_UP",
377
    parameter K   = 2, // number of last level individual router`s endpoints.
378
    parameter L   = 2 // Fattree layer number (The height of FT)
379
 )
380
(
381
    reset,
382
    clk,
383
    current_addr_encoded,    // connected to current router x address
384
    current_level,    //connected to current router y address
385
    dest_addr_encoded,        // destination address
386
    destport_encoded    // router output port
387
 
388
);
389
 
390
 
391
    function integer log2;
392
      input integer number; begin
393
         log2=(number <=1) ? 1: 0;
394
         while(2**log2<number) begin
395
            log2=log2+1;
396
         end
397
      end
398
    endfunction // log2 
399
 
400
 
401
    localparam
402
        Kw = log2(K),
403
        LKw= L*Kw,
404
        Lw = log2(L);
405
 
406
 
407
 
408
    input reset,clk;
409
    input  [LKw-1 :0]    current_addr_encoded;
410
    input  [Lw-1  :0]    current_level;
411
    input  [LKw-1 :0]    dest_addr_encoded;
412
    output [K :0]    destport_encoded;
413
 
414
 
415
    generate
416
    /* verilator lint_off WIDTH */
417
    if( ROUTE_NAME == "NCA_RND_UP")begin :nca_rnd
418
    /* verilator lint_on WIDTH */
419
        fattree_nca_random_up_routing #(
420
            .K(K),
421
            .L(L)
422
        )
423
        nca_random_up
424
        (
425
            .reset(reset),
426
            .clk(clk),
427
            .current_addr_encoded(current_addr_encoded),
428
            .current_level(current_level),
429
            .dest_addr_encoded(dest_addr_encoded),
430
            .destport_encoded(destport_encoded)
431
        );
432
     /* verilator lint_off WIDTH */
433
    end else if ( ROUTE_NAME == "NCA_DST_UP")begin :nca_dst
434
    /* verilator lint_on WIDTH */
435
        fattree_nca_destp_up_routing #(
436
            .K(K),
437
            .L(L)
438
        )
439
        nca_random_up
440
        (
441
            .reset(reset),
442
            .clk(clk),
443
            .current_addr_encoded(current_addr_encoded),
444
            .current_level(current_level),
445
            .dest_addr_encoded(dest_addr_encoded),
446
            .destport_encoded(destport_encoded)
447
        );
448
   /* verilator lint_off WIDTH */
449
   end else if ( ROUTE_NAME == "NCA_STRAIGHT_UP")begin :nca_straight
450
    /* verilator lint_on WIDTH */
451
        fattree_nca_straight_up_routing #(
452
            .K(K),
453
            .L(L)
454
        )
455
        nca_straight_up
456
        (
457
            .reset(reset),
458
            .clk(clk),
459
            .current_addr_encoded(current_addr_encoded),
460
            .current_level(current_level),
461
            .dest_addr_encoded(dest_addr_encoded),
462
            .destport_encoded(destport_encoded)
463
        );
464
    end else begin
465
        // synthesis translate_off
466
        initial begin
467
            $display( "\t ERROR: %s is an undefined routing algorithm for FATTREE topology",ROUTE_NAME);
468
            $finish;
469
        end
470
        // synthesis translate_on
471
    end
472
    endgenerate
473
 
474
endmodule
475
 
476
 
477
/************************************
478
 
479
     fattree_look_ahead_routing
480
 
481
*************************************/
482
 
483
module fattree_look_ahead_routing #(
484
    parameter ROUTE_NAME = "NCA_RND_UP",
485
    parameter P = 4,
486
    parameter L = 2,
487
    parameter K = 2
488
 
489
)
490
(
491
    reset,
492
    clk,
493
    destport_encoded,// current router destination port 
494
    dest_addr_encoded,
495
    neighbors_rx,
496
    neighbors_ry,
497
    lkdestport_encoded // look ahead destination port     
498
);
499
 
500
   function integer log2;
501
      input integer number; begin
502
         log2=(number <=1) ? 1: 0;
503
         while(2**log2<number) begin
504
            log2=log2+1;
505
         end
506
      end
507
    endfunction // log2 
508
 
509
 
510
    localparam
511
        Kw = log2(K),
512
        LKw= L*Kw,
513
        Lw = log2(L),
514
        PLw = P * Lw,
515
        PLKw = P * LKw;
516
 
517
    input  [K :0]    destport_encoded;
518
    input  [LKw-1 :0]    dest_addr_encoded;
519
    input  [PLKw-1 : 0]  neighbors_rx;
520
    input  [PLw-1 : 0]  neighbors_ry;
521
    output [K: 0]    lkdestport_encoded;
522
    input                   reset,clk;
523
 
524 54 alirezamon
    wire  [K :0]    destport_encoded_delayed;
525
    wire  [LKw-1 :0]    dest_addr_encoded_delayed;
526 48 alirezamon
 
527
     fattree_deterministic_look_ahead_routing #(
528
        .P(P),
529
        .ROUTE_NAME(ROUTE_NAME),
530
        .K(K),
531
        .L(L)
532
     )
533
     look_ahead_routing
534
     (
535
        .reset(reset),
536
        .clk(clk),
537
        .destport_encoded(destport_encoded_delayed),
538
        .dest_addr_encoded(dest_addr_encoded_delayed),
539
        .neighbors_rx(neighbors_rx),
540
        .neighbors_ry(neighbors_ry),
541
        .lkdestport_encoded(lkdestport_encoded)
542
     );
543
 
544 54 alirezamon
 
545
      pronoc_register #(
546
           .W(K+1)
547
      ) reg1 (
548
           .in(destport_encoded),
549
           .reset(reset),
550
           .clk(clk),
551
           .out(destport_encoded_delayed)
552
      );
553
 
554
       pronoc_register #(
555
           .W(LKw)
556
      ) reg2 (
557
           .in(dest_addr_encoded),
558
           .reset(reset),
559
           .clk(clk),
560
           .out(dest_addr_encoded_delayed)
561
      );
562
 
563
 
564 48 alirezamon
 
565 54 alirezamon
 
566 48 alirezamon
 
567
endmodule
568
 
569
 
570
 
571
 
572
 
573
 
574
 
575
/************************************************
576
 
577
        deterministic_look_ahead_routing
578
**********************************************/
579
 
580
 
581
module  fattree_deterministic_look_ahead_routing #(
582
    parameter P=4,
583
    parameter ROUTE_NAME = "NCA_RND_UP",
584
    parameter K   = 2, // number of last level individual router`s endpoints.
585
    parameter L   = 2 // Fattree layer number (The height of FT)
586
 
587
  )
588
  (
589
    reset,
590
    clk,
591
    destport_encoded,// current router destination port 
592
    dest_addr_encoded,
593
    neighbors_rx,
594
    neighbors_ry,
595
    lkdestport_encoded // look ahead destination port     
596
 );
597
 
598
 
599
   function integer log2;
600
      input integer number; begin
601
         log2=(number <=1) ? 1: 0;
602
         while(2**log2<number) begin
603
            log2=log2+1;
604
         end
605
      end
606
    endfunction // log2 
607
 
608
 
609
    localparam
610
        Kw = log2(K),
611
        LKw= L*Kw,
612
        Lw = log2(L),
613
        PLw = P * Lw,
614
        PLKw = P * LKw;
615
 
616
    input reset,clk;
617
    input  [K :0]    destport_encoded;
618
    input  [LKw-1 :0]    dest_addr_encoded;
619
    input  [PLKw-1 : 0]  neighbors_rx;
620
    input  [PLw-1 : 0]  neighbors_ry;
621
    output [K: 0]    lkdestport_encoded;
622
 
623
 
624
    wire  [LKw-1 :0]    next_addr_encoded;
625
    wire  [Lw-1  :0]    next_level;
626
    wire  [K : 0] lkdestport_encoded;
627
    wire  [2*K-1 : 0] destport_decoded;
628
 
629
    fattree_destport_decoder #(
630
        .K(K)
631
    )
632
    fattree_destport_decoder(
633
        .destport_encoded_i(destport_encoded),
634
        .destport_decoded_o(destport_decoded)
635
    );
636
 
637
 
638
    next_router_addr_selector_onehot #(
639
         .P(P),
640
         .RXw(LKw),
641
         .RYw(Lw)
642
    )
643
    addr_predictor
644
    (
645
        .destport_onehot(destport_decoded[P-1 : 0]),
646
        .neighbors_rx(neighbors_rx),
647
        .neighbors_ry(neighbors_ry),
648
        .next_rx(next_addr_encoded),
649
        .next_ry(next_level)
650
    );
651
 
652
 
653
    fattree_conventional_routing #(
654
        .ROUTE_NAME(ROUTE_NAME),
655
        .K(K),
656
        .L(L)
657
    )
658
    conv_routing
659
    (
660
        .reset(reset),
661
        .clk(clk),
662
        .current_addr_encoded(next_addr_encoded),
663
        .current_level(next_level),
664
        .dest_addr_encoded(dest_addr_encoded),
665
        .destport_encoded(lkdestport_encoded)
666
    );
667
 
668
 endmodule
669
 
670
 module fattree_destport_decoder #(
671
     parameter K=2
672
 
673
 )(
674
    destport_decoded_o,
675
    destport_encoded_i
676
 );
677
 
678
    input [K:0] destport_encoded_i;
679
    output [2*K-1 : 0] destport_decoded_o;
680
 
681
    assign destport_decoded_o =   (destport_encoded_i[K])? /*go up*/    {destport_encoded_i[K-1:0],{K{1'b0}}}:
682
                                                           /*go down*/   {{K{1'b0}},destport_encoded_i[K-1:0]};
683
 
684
endmodule
685
 
686
 
687
 
688
 
689
/**********
690
 *  fattree_mask_non_assignable_destport
691
 * ********/
692
 
693
module fattree_mask_non_assignable_destport #(
694
    parameter K=4,
695
    parameter P=2*K,
696
    parameter SW_LOC = 0
697
)
698
(
699
    destport_in,
700
    destport_out
701
);
702
 
703
    input [2*K-1 : 0] destport_in;
704
    output [2*K-1 : 0] destport_out;
705
 
706
    generate
707
    if(P<=K)begin :root //This is a root node there is conectivety between all ports
708
        assign destport_out = destport_in;
709
    end else begin: leaf
710
        if(SW_LOC < K) begin: down // This port located in lower side of the router. It can send packet to any destport 
711
            assign destport_out = destport_in;
712
        end else begin : up // // This port located in upper side of the router. It cannot send packet to upper port anymore
713
            assign destport_out[2*K-1 : K] = {K{1'b0}};
714
            assign destport_out[K-1 : 0] = destport_in [K-1 : 0];
715
        end
716
    end
717
    endgenerate
718
endmodule
719
 
720
/********************
721
 
722
    distance_gen
723
 
724
********************/
725
 
726
module fattree_distance_gen #(
727
    parameter K= 4,
728
    parameter L= 4
729
)(
730
    src_addr_encoded,
731
    dest_addr_encoded,
732
    distance
733
 
734
);
735
 
736
    function integer log2;
737
      input integer number; begin
738
         log2=(number <=1) ? 1: 0;
739
         while(2**log2<number) begin
740
            log2=log2+1;
741
         end
742
      end
743
    endfunction // log2 
744
 
745
     localparam
746
        Kw = log2(K),
747
        LKw= L*Kw,
748
        DISTw= log2(2*L+1);
749
 
750
     input  [LKw-1 :0]    src_addr_encoded;
751
     input  [LKw-1 :0]    dest_addr_encoded;
752
     output reg [DISTw-1 : 0] distance;
753
 
754
 
755
 
756
     wire  [Kw-1 :0]  dest_addr [L-1 : 0];
757
     wire  [Kw-1 :0]  src_addr [L-1 : 0];
758
     wire  [L-1 : 0] diffrent;
759
 
760
 
761
    genvar i;
762
    generate
763
    for(i=0; i<L; i=i+1)begin : daddr
764
        assign dest_addr [i] =  dest_addr_encoded[(i+1)*Kw-1 : i*Kw];
765
        assign src_addr [i] =  src_addr_encoded[(i+1)*Kw-1 : i*Kw];
766
        assign diffrent[i] = dest_addr [i] != src_addr [i];
767
    end//for
768
    endgenerate
769
 
770
    wire [11:0] tmp;
771
    assign tmp= {{(12-L){1'b0}},diffrent};
772
    /* verilator lint_off WIDTH */
773
    always @(*)begin
774
        if (tmp[10]) distance =21;
775
        else if (tmp[9]) distance =19;
776
        else if (tmp[8]) distance =17;
777
        else if (tmp[7]) distance =15;
778
        else if (tmp[6]) distance =13;
779
        else if (tmp[5]) distance =11;
780
        else if (tmp[4]) distance =9;
781
        else if (tmp[3]) distance =7;
782
        else if (tmp[2]) distance =5;
783
        else if (tmp[1]) distance =3;
784
        else distance =1;
785
    end
786
    /* verilator lint_on WIDTH */
787
 
788
 
789
 
790
 
791
endmodule
792
 
793
/**************
794
    fattree_addr_encoder
795
    most probably it is only needed for simulation purposes
796
***************/
797
 
798
module  fattree_addr_encoder #(
799
    parameter   K=2,
800
    parameter   L=2
801
 
802
)(
803
    id,
804
    code
805
);
806
 
807
    function integer log2;
808
      input integer number; begin
809
         log2=(number <=1) ? 1: 0;
810
         while(2**log2<number) begin
811
            log2=log2+1;
812
         end
813
      end
814
    endfunction // log2 
815
 
816
    function integer powi;
817
        input integer x,y;
818
        integer i;begin //compute x to the y
819
        powi=1;
820
        for (i = 0; i <y; i=i+1 ) begin
821
            powi=powi * x;
822
        end
823
        end
824
    endfunction // log2 
825
 
826
    function integer addrencode;
827
        input integer pos,k,n,kw;
828
        integer pow,i,tmp;begin
829
        addrencode=0;
830
        pow=1;
831
        for (i = 0; i <n; i=i+1 ) begin
832
            tmp=(pos/pow);
833
            tmp=tmp%k;
834
            tmp=tmp<<i*kw;
835
            addrencode=addrencode | tmp;
836
            pow=pow * k;
837
        end
838
        end
839
    endfunction // log2 
840
 
841
 
842
    localparam
843
        NE = powi( K,L ),  //total number of endpoints
844
        NEw = log2(NE),
845
        Kw=log2(K),
846
        LKw=L*Kw;
847
 
848
 
849
     input [NEw-1 :0] id;
850
     output [LKw-1 : 0] code;
851
 
852
    wire [LKw-1 : 0 ] codes [NE-1 : 0];
853
    genvar i;
854
    generate
855
    for(i=0; i< NE; i=i+1) begin : endpoints
856
        //Endpoint decoded address
857
        localparam [LKw-1 : 0] ENDPX= addrencode(i,K,L,Kw);
858
        assign codes[i] = ENDPX;
859
    end
860
    endgenerate
861
 
862
    assign code = codes[id];
863
endmodule
864
 
865
 
866
 
867
/**************
868
    fattree_addr_decoder
869
    most probably it is only needed for simulation
870
***************/
871
 
872
module  fattree_addr_decoder #(
873
    parameter   K=2,
874
    parameter   L=2
875
 
876
)(
877
    id,
878
    code
879
);
880
 
881
    function integer log2;
882
      input integer number; begin
883
         log2=(number <=1) ? 1: 0;
884
         while(2**log2<number) begin
885
            log2=log2+1;
886
         end
887
      end
888
    endfunction // log2 
889
 
890
    function integer powi;
891
        input integer x,y;
892
        integer i;begin //compute x to the y
893
        powi=1;
894
        for (i = 0; i <y; i=i+1 ) begin
895
            powi=powi * x;
896
        end
897
        end
898
    endfunction // log2 
899
 
900
    function integer addrencode;
901
        input integer pos,k,n,kw;
902
        integer pow,i,tmp;begin
903
        addrencode=0;
904
        pow=1;
905
        for (i = 0; i <n; i=i+1 ) begin
906
            tmp=(pos/pow);
907
            tmp=tmp%k;
908
            tmp=tmp<<i*kw;
909
            addrencode=addrencode | tmp;
910
            pow=pow * k;
911
        end
912
        end
913
    endfunction // log2 
914
 
915
 
916
    localparam
917
        NE = powi( K,L ),  //total number of endpoints
918
        NEw = log2(NE),
919
        Kw=log2(K),
920
        LKw=L*Kw;
921
 
922
 
923
     output [NEw-1 :0] id;
924
     input  [LKw-1 : 0] code;
925
 
926
    wire  [NEw-1 : 0] codes  [2**LKw-1 : 0 ];
927
    genvar i;
928
    generate
929
    for(i=0; i< NE; i=i+1) begin : endpoints
930
        //Endpoint decoded address
931
        /* verilator lint_off WIDTH */
932
        localparam [LKw-1 : 0] ENDPX= addrencode(i,K,L,Kw);
933
        /* verilator lint_on WIDTH */
934
        assign codes[ENDPX] = i;
935
    end
936
    endgenerate
937
 
938
    assign id = codes[code];
939
endmodule
940
 
941
/**************
942
 * mesh_torus_ssa_check_destport_conflict
943
 * check if the incomming flit goes to SS port
944
 * ************/
945
 
946
module fattree_ssa_check_destport #(
947
    parameter DSTPw = 5,
948
    parameter SS_PORT=0
949
)
950
(
951
    destport_encoded, //exsited packet dest port
952
    destport_in_encoded, // incomming packet dest port
953
    ss_port_hdr_flit, // asserted if the header incomming flit goes to ss port
954
    ss_port_nonhdr_flit // asserted if the body or tail incomming flit goes to ss port
955
 );
956
 
957
    localparam K= DSTPw-1;
958
    localparam SS_LOC = (SS_PORT < K)? SS_PORT : SS_PORT-K;
959
 
960
    input [DSTPw-1 : 0] destport_encoded, destport_in_encoded;
961
    output ss_port_hdr_flit, ss_port_nonhdr_flit;
962
 
963
 
964
/******************
965
        destport_encoded format in fat tree. K+1 bit
966
        destport[K]
967
            1'b0  : go down
968
            1'b1  : go up
969
        destport[K-1: 0]:
970
            onehot coded. asserted bit show the output port locatation
971
*******************/
972
 
973
    wire up_flg = destport_encoded[DSTPw-1];
974
    wire up_flg_in = destport_in_encoded[DSTPw-1];
975
    wire down_flg = ~destport_encoded[DSTPw-1];
976
    wire down_flg_in = ~destport_in_encoded[DSTPw-1];
977
 
978
 
979
    generate
980
    if(SS_PORT < K) begin :SS_DOWN // the ssa port is located in down router side
981
        assign ss_port_hdr_flit = destport_in_encoded [SS_LOC] & down_flg_in;
982
        assign ss_port_nonhdr_flit =  destport_encoded[SS_LOC] & down_flg;
983
    end else begin : SS_UP
984
        assign ss_port_hdr_flit = destport_in_encoded [SS_LOC] & up_flg_in;
985
        assign ss_port_nonhdr_flit =  destport_encoded[SS_LOC] & up_flg;
986
    end
987
    endgenerate
988
 
989
endmodule
990
 
991
/*
992
module fattree_add_ss_port #(
993
    parameter SW_LOC=1,
994
    parameter P=5
995
)(
996
    destport_in,
997
    destport_out
998
);
999
    localparam
1000
        P_1     =   P-1,
1001
        DISABLED   =    P;
1002
 
1003
    localparam  SS_PORT_FATTREE_EVEN =  (SW_LOC < (P/2) )? (P/2)+ SW_LOC-1 : SW_LOC - (P/2);
1004
    localparam  SS_PORT_FATTREE_ODD  =  (SW_LOC == (P-1)/2)?   DISABLED:
1005
                                        (SW_LOC < ((P+1)/2) )? ((P+1)/2)+ SW_LOC-1 : SW_LOC - ((P+1)/2);
1006
 
1007
    localparam  SS_PORT_FATTREE = (P[0]==1'b0) ? SS_PORT_FATTREE_EVEN : SS_PORT_FATTREE_ODD;
1008
 
1009
    localparam  SS_PORT      =   SS_PORT_FATTREE;
1010
 
1011
 
1012
 
1013
 
1014
    input       [P_1-1  :   0] destport_in;
1015
    output reg  [P_1-1  :   0] destport_out;
1016
 
1017
 
1018
 
1019
    always @(*)begin
1020
        destport_out=destport_in;
1021
        if( SS_PORT != DISABLED ) begin
1022
            if(destport_in=={P_1{1'b0}}) destport_out[SS_PORT]= 1'b1;
1023
        end
1024
    end
1025
 
1026
 
1027
endmodule
1028
 */
1029
module fattree_router_addr_decode #(
1030
    parameter K=4,
1031
    parameter L=4
1032
)(
1033
    r_addr,
1034
    rx,
1035
    rl
1036
    //valid
1037
);
1038
 
1039
    function integer log2;
1040
      input integer number; begin
1041
         log2=(number <=1) ? 1: 0;
1042
         while(2**log2<number) begin
1043
            log2=log2+1;
1044
         end
1045
      end
1046
    endfunction // log2 
1047
 
1048
 
1049
    localparam
1050
        Kw = log2(K),
1051
        LKw= L*Kw,
1052
        Lw = log2(L),
1053
        RAw= LKw + Lw;
1054
 
1055
    input   [RAw-1 : 0]   r_addr;
1056
    output  [LKw-1 :0]    rx;
1057
    output  [Lw-1  :0]    rl;
1058
 
1059
    assign {rl,rx} = r_addr;
1060
 
1061
endmodule
1062
 
1063
 
1064
//decode and mask destport  
1065
module  fattree_destp_generator #(
1066
    parameter K=2,
1067
    parameter P=2*K,
1068
    parameter SW_LOC=0,
1069
    parameter DSTPw=4,
1070
    parameter SELF_LOOP_EN = "NO"
1071
)(
1072
    dest_port_in_encoded,
1073
    dest_port_out
1074
);
1075
 
1076
    localparam P_1 = (SELF_LOOP_EN == "NO")? P-1 : P;
1077
    input  [DSTPw-1:0] dest_port_in_encoded;
1078
    output [P_1-1 : 0] dest_port_out;
1079
 
1080
 
1081
    wire [2*K-1 : 0] destport_decoded;
1082
    wire [2*K-1 : 0] destport_masked;
1083
 
1084
 
1085
        fattree_destport_decoder #(
1086
            .K(K)
1087
        )
1088
        destport_decoder
1089
        (
1090
            .destport_encoded_i(dest_port_in_encoded),
1091
            .destport_decoded_o(destport_decoded)
1092
        );
1093
 
1094
        fattree_mask_non_assignable_destport #(
1095
            .K(K),
1096
            .P(P),
1097
            .SW_LOC(SW_LOC)
1098
        )
1099
        mask
1100
        (
1101
            .destport_in(destport_decoded),
1102
            .destport_out(destport_masked)
1103
        );
1104
 
1105
        generate
1106
        if(SELF_LOOP_EN == "NO") begin : nslp
1107
            remove_sw_loc_one_hot #(
1108
                .P(P),
1109
                .SW_LOC(SW_LOC)
1110
            )
1111
            conv
1112
            (
1113
                .destport_in(destport_masked[P-1 : 0]),
1114
                .destport_out(dest_port_out[P_1-1  :   0 ])
1115
            );
1116
        end else begin : slp
1117
            assign dest_port_out= destport_masked [P_1-1  :   0 ];
1118
        end
1119
        endgenerate
1120
 endmodule
1121 54 alirezamon
 
1122
 
1123
 
1124
 
1125
 
1126
 

powered by: WebSVN 2.1.0

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