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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: localparameter
3
* Date:2019-04-08
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
 `ifdef     INCLUDE_TOPOLOGY_LOCALPARAM
9
 
10
     //MESH, TORUS Topology p=5           
11
    localparam    LOCAL   =   0,
12
                  EAST    =   1,
13
                  NORTH   =   2,
14
                  WEST    =   3,
15
                  SOUTH   =   4;
16
 
17
 
18
 
19
    //LINE RING Topology p=3           
20
    localparam  FORWARD =  1,
21
                BACKWARD=  2;
22 54 alirezamon
 
23
 
24 48 alirezamon
     function automatic integer log2;
25
      input integer number; begin
26
         log2=(number <=1) ? 1: 0;
27
         while(2**log2<number) begin
28
            log2=log2+1;
29
         end
30
      end
31
    endfunction // log2 
32
 
33
     function automatic integer powi; // x^y
34
        input integer x,y;
35
        integer i;begin //compute x to the y
36
        powi=1;
37
        for (i = 0; i <y; i=i+1 ) begin
38
            powi=powi * x;
39
        end
40
        end
41
    endfunction // powi
42
 
43
 
44
    function automatic integer  sum_powi;//x^(y-1) + x^(y-2) + ...+ 1;
45
        input integer x,y;
46
        integer i;begin
47
        sum_powi = 0;
48
        for (i = 0; i < y; i=i+1)begin
49
            sum_powi = sum_powi + powi( x, i );
50
       end
51
    end
52
    endfunction // sum_powi
53
 
54
 
55
    // get the port num and return the port located at streight direction. If there is no strieght port return  router_port_num. 
56
    function automatic integer strieght_port;
57
        input integer router_port_num;  //router port num
58
        input integer current_port;
59
        begin
60
        /* verilator lint_off WIDTH */
61
        if(TOPOLOGY == "MESH" || TOPOLOGY == "FMESH" || TOPOLOGY == "TORUS") begin
62
        /* verilator lint_on WIDTH */
63
            strieght_port =
64
                (current_port== EAST)?  WEST:
65
                (current_port== WEST)?  EAST:
66
                (current_port== SOUTH)? NORTH:
67
                (current_port== NORTH)? SOUTH:
68
                                 router_port_num; //DISABLED;
69
        end
70
        /* verilator lint_off WIDTH */
71
        else if (TOPOLOGY ==  "RING" || TOPOLOGY ==  "LINE") begin
72
        /* verilator lint_on WIDTH */
73
            strieght_port =
74
                (current_port== FORWARD )? BACKWARD:
75
                (current_port== BACKWARD)? FORWARD:
76
                                           router_port_num; //DISABLED;
77
 
78
        end
79
        /* verilator lint_off WIDTH */
80
        else if (TOPOLOGY == "FATTREE" ) begin
81
        /* verilator lint_on WIDTH */
82
             if(router_port_num[0]==1'b0) begin //even port num
83
                 strieght_port =   (current_port < (router_port_num/2) )?
84
                    (router_port_num/2)+ current_port :
85
                    current_port - (router_port_num/2);
86
             end else begin
87
                 strieght_port =  (current_port == (router_port_num-1)/2) ?  router_port_num: //DISABLED;
88
                                  (current_port < ((router_port_num+1)/2))? ((router_port_num+1)/2)+ current_port :
89
                                                                            current_port - ((router_port_num+1)/2);
90
 
91
             end
92
        end else begin
93
            strieght_port = router_port_num; //DISABLED;
94
        end
95
        end
96
    endfunction
97
 
98
 
99
    function automatic integer port_buffer_size;
100
        input integer router_port_num;  //router port num
101
        begin
102
        port_buffer_size = B;
103
        /* verilator lint_off WIDTH */
104
        if(TOPOLOGY == "MESH" || TOPOLOGY == "FMESH" || TOPOLOGY == "TORUS" || TOPOLOGY ==  "RING" || TOPOLOGY ==  "LINE")begin
105
        /* verilator lint_on WIDTH */
106
           if (router_port_num == 0 || router_port_num > 4 ) port_buffer_size = LB;
107
        end
108
        end
109
    endfunction
110
 
111 54 alirezamon
 
112
 
113
 
114
 
115 48 alirezamon
/*******************
116
*   "RING"  "LINE"  "MESH" TORUS" "FMESH"
117
******************/
118
 
119
 
120 54 alirezamon
 
121
 
122 48 alirezamon
/* verilator lint_off WIDTH */
123
//route type
124
localparam
125
    NX = T1,
126
    NY = T2,
127
    NL = T3,
128
    NXw = log2(NX),
129
    NYw= log2(NY),
130
    NLw= log2(NL),
131
    PPSw_MESH_TORI =4, //port presel width for adaptive routing
132
 
133
    /* verilator lint_off WIDTH */
134
    ROUTE_TYPE_MESH_TORI = (ROUTE_NAME == "XY" || ROUTE_NAME == "TRANC_XY" )?    "DETERMINISTIC" :
135
                               (ROUTE_NAME == "DUATO" || ROUTE_NAME == "TRANC_DUATO" )?   "FULL_ADAPTIVE": "PAR_ADAPTIVE",
136
 
137
    R2R_CHANELS_MESH_TORI=  (TOPOLOGY=="RING" || TOPOLOGY=="LINE")? 2 : 4,
138
    R2E_CHANELS_MESH_TORI= NL,
139
    RAw_MESH_TORI = ( TOPOLOGY == "RING" || TOPOLOGY == "LINE")? NXw : NXw + NYw,
140
    EAw_MESH_TORI = (NL==1) ? RAw_MESH_TORI : RAw_MESH_TORI + NLw,
141
    NR_MESH_TORI = (TOPOLOGY=="RING" || TOPOLOGY=="LINE")? NX : NX*NY,
142
    NE_MESH_TORI = NR_MESH_TORI * NL,
143
    MAX_P_MESH_TORI = R2R_CHANELS_MESH_TORI + R2E_CHANELS_MESH_TORI,
144 54 alirezamon
    DSTPw_MESH_TORI = R2R_CHANELS_MESH_TORI; // P-1
145
 
146 48 alirezamon
    /* verilator lint_on WIDTH */
147
 
148
/****************
149
 *  FMESH
150
 * *************/
151
 localparam
152
    NE_FMESH = NE_MESH_TORI + 2 * (NX+NY),
153
    NR_FMESH = NR_MESH_TORI,
154
    MAX_P_FMESH = 4 + NL,
155
    EAw_FMESH = RAw_MESH_TORI + log2(MAX_P_FMESH);
156
 
157
 
158
 /******************
159
  *     FATTREE
160
  * *****************/
161
localparam
162
    K=T1,
163
    L=T2,
164
    Lw=log2(L),
165
    Kw=log2(K),
166
    LKw=L*Kw,
167
    RAw_FATTREE =  LKw + Lw,
168
    EAw_FATTREE  = LKw,
169
    NE_FATTREE = powi( K,L ),
170
    NR_FATTREE = L * powi( K , L - 1 ),  // total number of routers  
171
    ROUTE_TYPE_FATTREE = "DETERMINISTIC",
172
    DSTPw_FATTREE = K+1,
173 54 alirezamon
    MAX_P_FATTREE = 2*K,
174
    DAw_MCAST_FATTREE= powi( K,L);
175 48 alirezamon
 
176
 
177
 
178
/**********************
179
 *      TREE
180
 * ********************/
181
localparam
182
    ROUTE_TYPE_TREE = "DETERMINISTIC",
183
    NE_TREE = powi( K,L ),  //total number of endpoints
184
    NR_TREE = sum_powi ( K,L ),  // total number of routers  
185
    RAw_TREE =  LKw + Lw,
186
    EAw_TREE  =  LKw,
187
    DSTPw_TREE = log2(K+1),
188 54 alirezamon
    MAX_P_TREE = K+1,
189
    DAw_MCAST_TREE= DAw_MCAST_FATTREE;
190 48 alirezamon
 
191
 
192
/*********************
193
 *  STAR
194
 * ******************/
195
  localparam
196
    ROUTE_TYPE_STAR = "DETERMINISTIC",
197
    NE_STAR = T1,  //total number of endpoints
198
    NR_STAR = 1,  // total number of routers  
199
    RAw_STAR = 1,
200
    EAw_STAR  =  log2(NE_STAR),
201
    DSTPw_STAR = EAw_STAR,
202 54 alirezamon
    MAX_P_STAR = NE_STAR,
203
    DAw_MCAST_STAR= NE_STAR;
204 48 alirezamon
 
205
 /************************
206
  *  CUSTOM - made by netmaker
207
  * **********************/
208
 localparam
209
    ROUTE_TYPE_CUSTOM = "DETERMINISTIC",
210
    NE_CUSTOM  = T1,  //total number of endpoints
211
    NR_CUSTOM  = T2,  // total number of routers  
212
    EAw_CUSTOM = log2(NE_CUSTOM),
213
    RAw_CUSTOM = log2(NR_CUSTOM),
214
    MAX_P_CUSTOM = T3,
215
    DSTPw_CUSTOM = log2(MAX_P_CUSTOM);
216 54 alirezamon
 
217 48 alirezamon
 
218
 
219
    /* verilator lint_off WIDTH */
220
    localparam
221
        PPSw = PPSw_MESH_TORI,
222
        // maximum number of port in a router in the topology
223
        MAX_P =
224
            (TOPOLOGY == "FATTREE")? MAX_P_FATTREE:
225
            (TOPOLOGY == "TREE")?  MAX_P_TREE:
226
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? MAX_P_MESH_TORI:
227
            (TOPOLOGY == "FMESH")? MAX_P_MESH_TORI:
228
            (TOPOLOGY == "STAR") ? MAX_P_STAR:
229
            MAX_P_CUSTOM,
230
 
231
        // destination port width in header flit           
232
        DSTPw =
233 54 alirezamon
           // Each asserted bit indicats that the flit should be sent to that port
234 48 alirezamon
            (TOPOLOGY == "FATTREE")? DSTPw_FATTREE:
235
            (TOPOLOGY == "TREE")?  DSTPw_TREE:
236 54 alirezamon
            (CAST_TYPE!= "UNICAST")? MAX_P:
237 48 alirezamon
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? DSTPw_MESH_TORI:
238
            (TOPOLOGY == "FMESH")? DSTPw_MESH_TORI:
239
            (TOPOLOGY == "STAR") ? DSTPw_STAR:
240
            DSTPw_CUSTOM,
241
        //router address width        
242
        RAw =
243
            (TOPOLOGY == "FATTREE")? RAw_FATTREE:
244
            (TOPOLOGY == "TREE")?  RAw_TREE:
245
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? RAw_MESH_TORI:
246
            (TOPOLOGY == "FMESH")? RAw_MESH_TORI:
247
            (TOPOLOGY == "STAR") ? RAw_STAR:
248
            RAw_CUSTOM,
249
        //endpoint address width
250
        EAw =
251
            (TOPOLOGY == "FATTREE")? EAw_FATTREE:
252
            (TOPOLOGY == "TREE")?  EAw_TREE:
253
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? EAw_MESH_TORI:
254
            (TOPOLOGY == "FMESH")? EAw_FMESH:
255
            (TOPOLOGY == "STAR") ? EAw_STAR:
256 54 alirezamon
            EAw_CUSTOM,
257 48 alirezamon
        // total number of endpoints         
258
        NE =
259
            (TOPOLOGY == "FATTREE")? NE_FATTREE:
260
            (TOPOLOGY == "TREE")?  NE_TREE:
261
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? NE_MESH_TORI:
262
            (TOPOLOGY == "FMESH")? NE_FMESH:
263
            (TOPOLOGY == "STAR")? NE_STAR:
264
            NE_CUSTOM,
265 54 alirezamon
 
266
       //Destination endpoint(s) address width
267
 
268
 
269
        DAw_OFFSETw  =  (TOPOLOGY=="MESH" || TOPOLOGY=="TORUS" ||  TOPOLOGY=="FMESH")?  NX : 0,
270
 
271
        MCAST_PRTLw = mcast_partial_width( MCAST_ENDP_LIST),
272
 
273
        MCASTw =
274
            (CAST_TYPE == "MULTICAST_FULL") ? NE :
275
            (CAST_TYPE == "MULTICAST_PARTIAL" && EAw >= MCAST_PRTLw) ? EAw +1 :
276
            (CAST_TYPE == "MULTICAST_PARTIAL" && EAw <  MCAST_PRTLw) ? MCAST_PRTLw +1 :
277
            EAw +1, //broadcast
278
 
279
        DAw =
280
            (CAST_TYPE == "UNICAST") ?   EAw:
281
            MCASTw +  DAw_OFFSETw,
282
 
283
 
284
 
285
 
286 48 alirezamon
        //total number of routers        
287
        NR =
288
            (TOPOLOGY == "FATTREE")? NR_FATTREE:
289
            (TOPOLOGY == "TREE")?  NR_TREE:
290
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? NR_MESH_TORI:
291
            (TOPOLOGY == "FMESH")? NR_FMESH:
292
            (TOPOLOGY == "STAR") ? NR_STAR:
293
            NR_CUSTOM,
294
        //routing algorithm type    
295
        ROUTE_TYPE =
296
            (TOPOLOGY == "FATTREE")? ROUTE_TYPE_FATTREE:
297
            (TOPOLOGY == "TREE")?  ROUTE_TYPE_TREE:
298
            (TOPOLOGY == "RING" || TOPOLOGY == "LINE" || TOPOLOGY == "MESH" || TOPOLOGY == "TORUS")? ROUTE_TYPE_MESH_TORI:
299
            (TOPOLOGY == "FMESH")? ROUTE_TYPE_MESH_TORI:
300
            (TOPOLOGY == "STAR") ? ROUTE_TYPE_STAR:
301
            ROUTE_TYPE_CUSTOM;
302
 
303
    /* verilator lint_on WIDTH */
304
 
305
 
306 54 alirezamon
 
307
 
308
 
309
 
310
    function automatic integer mcast_id_to_endp_id;
311
        input integer  mcast_id;
312
        reg [NE-1 : 0] mcast_list;
313
        integer  k;
314
        begin
315
        mcast_list =MCAST_ENDP_LIST;
316
        mcast_id_to_endp_id=0;
317
        k=0;
318
        /* verilator lint_off WIDTH */
319
        if (CAST_TYPE == "MULTICAST_FULL")begin
320
        /* verilator lint_on WIDTH */
321
            mcast_id_to_endp_id =mcast_id;
322
        end else begin
323
            while( k!=mcast_id+1) begin
324
                if( mcast_list[mcast_id_to_endp_id]==1'b1) begin
325
                   k=k+1;
326
                end
327
                mcast_id_to_endp_id= mcast_id_to_endp_id+1;
328
            end
329
        end
330
        end
331
    endfunction
332 48 alirezamon
 
333 54 alirezamon
   function automatic integer endp_id_to_mcast_id;
334
        input integer  endp_id;
335
        reg [NE-1 : 0] mcast_list;
336
        integer i;
337
        begin
338
         /* verilator lint_off WIDTH */
339
        if (CAST_TYPE == "MULTICAST_FULL") begin
340
         /* verilator lint_on WIDTH */
341
            endp_id_to_mcast_id = endp_id;
342
        end else begin
343
            mcast_list =MCAST_ENDP_LIST;
344
            endp_id_to_mcast_id=0;
345
            for (i=0;i<endp_id;i=i+1) begin
346
                if( mcast_list[i]==1'b1) endp_id_to_mcast_id=endp_id_to_mcast_id+1;
347
            end
348
            end
349
        end
350
    endfunction
351
 
352
 
353
 
354
    function automatic integer mcast_partial_width;
355
        input [NE-1 : 0] p;
356
        integer i;
357
        begin
358 48 alirezamon
 
359 54 alirezamon
            mcast_partial_width=0;
360
            for (i=0;i<NE;i=i+1) begin
361
                if (p [i]==1'b1) mcast_partial_width=mcast_partial_width+1;
362
            end
363
        end
364
    endfunction
365
 
366
 
367
 
368
 
369
    function automatic  integer fmesh_addrencode;
370
        input integer in;
371
        integer  y, x, l,p, diff,mul;begin
372
 
373
            mul  = NX*NY*NL;
374
            if(in < mul) begin
375
                y = ((in/NL) / NX );
376
                x = ((in/NL) % NX );
377
                l = (in % NL);
378
                p = (l==0)? LOCAL : 4+l;
379
            end else begin
380
                diff = in -  mul ;
381
                if( diff <  NX) begin //top mesh edge 
382
                    y = 0;
383
                    x = diff;
384
                    p = NORTH;
385
                end else if  ( diff < 2* NX) begin //bottom mesh edge 
386
                    y = NY-1;
387
                    x = diff-NX;
388
                    p = SOUTH;
389
                end else if  ( diff < (2* NX)+NY ) begin //left mesh edge 
390
                    y = diff - (2* NX);
391
                    x = 0;
392
                    p = WEST;
393
                end else begin //right mesh edge 
394
                    y = diff - (2* NX) -NY;
395
                    x = NX-1;
396
                    p = EAST;
397
                end
398
            end//else 
399
            fmesh_addrencode = ( p<<(NXw+NYw) | (y<<NXw) | x);
400
        end
401
    endfunction // addrencode    
402
 
403
 
404
 
405
    // synthesis translate_off
406
    /* verilator lint_off WIDTH */
407
   task display_noc_parameters;
408
   begin
409
      //print_parameter 
410
        $display ("NoC parameters:----------------");
411
        $display ("\tTopology: %s",TOPOLOGY);
412
        $display ("\tRouting algorithm: %s",ROUTE_NAME);
413
        $display ("\tVC_per port: %0d", V);
414
        $display ("\tNon-local port buffer_width per VC: %0d", B);
415
        $display ("\tLocal port buffer_width per VC: %0d", LB);
416
        if(TOPOLOGY=="MESH" || TOPOLOGY=="TORUS" || TOPOLOGY == "FMESH")begin
417
            $display ("\tRouter num in row: %0d",T1);
418
            $display ("\tRouter num in column: %0d",T2);
419
            $display ("\tEndpoint num per router: %0d",T3);
420
        end else if (TOPOLOGY=="RING" || TOPOLOGY == "LINE") begin
421
            $display ("\tTotal Router num: %0d",T1);
422
            $display ("\tEndpoint num per router: %0d",T3);
423
        end else if (TOPOLOGY == "TREE" ||  TOPOLOGY == "FATTREE")begin
424
            $display ("\tK: %0d",T1);
425
            $display ("\tL: %0d",T2);
426
        end else begin //CUSTOM
427
            $display ("\tTotal Endpoints number: %0d",T1);
428
            $display ("\tTotal Routers number: %0d",T2);
429
        end
430
        $display ("\tNumber of Class: %0d", C);
431
        $display ("\tFlit data width: %0d", Fpay);
432
        $display ("\tVC reallocation mechanism: %s",  VC_REALLOCATION_TYPE);
433
        $display ("\tVC/sw combination mechanism: %s", COMBINATION_TYPE);
434
        $display ("\tAVC_ATOMIC_EN:%0d", AVC_ATOMIC_EN);
435
        $display ("\tCongestion Index:%0d",CONGESTION_INDEX);
436
        $display ("\tADD_PIPREG_AFTER_CROSSBAR:%0d",ADD_PIPREG_AFTER_CROSSBAR);
437
        $display ("\tSSA_EN enabled:%s",SSA_EN);
438
        $display ("\tSwitch allocator arbitration type:%s",SWA_ARBITER_TYPE);
439
        $display ("\tMinimum supported packet size:%0d flit(s)",MIN_PCK_SIZE);
440
        $display ("\tLoop back is enabled:%s",SELF_LOOP_EN);
441
        $display ("\tNumber of multihop bypass (SMART max):%0d",SMART_MAX);
442
        $display ("\tCastying type:%s.",CAST_TYPE);
443
        if (CAST_TYPE == "MULTICAST_PARTIAL" || CAST_TYPE == "BROADCAST_PARTIAL")begin
444
            $display ("\tNumber of nodes in Cast list:%d",   MCAST_PRTLw);
445
            $display ("\tCAST LIST:%b", MCAST_ENDP_LIST);
446
        end
447
        $display ("NoC parameters:----------------");
448
      end
449
      endtask
450
      /* verilator lint_on WIDTH */
451
      // synthesis translate_on
452
 
453
 
454
 
455
 
456 48 alirezamon
 
457
 `endif
458
 
459
 

powered by: WebSVN 2.1.0

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