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

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

Line No. Rev Author Line
1 54 alirezamon
`include "pronoc_def.v"
2 48 alirezamon
/**************************************
3
* Module: fattree
4
* Date:2019-01-01
5
* Author: alireza
6
*
7
*
8
Description:
9
 
10
    FatTree
11
 
12
      Each level of the hierarchical indirect Network has
13
      k^(l-1) Routers. The Routers are organized such that
14
      each node has k descendents, and each parent is
15
      replicated k  times.
16
      most routers has 2K ports, excep the top level has only K
17
 
18
***************************************/
19
 
20
 
21
module  fattree_noc_top
22
                import pronoc_pkg::*;
23
        (
24
                reset,
25
                clk,
26
                chan_in_all,
27 54 alirezamon
                chan_out_all,
28
                router_event
29 48 alirezamon
        );
30
 
31
 
32
        input   clk,reset;
33 54 alirezamon
        //Endpoints ports
34 48 alirezamon
        input   smartflit_chanel_t chan_in_all  [NE-1 : 0];
35
        output  smartflit_chanel_t chan_out_all [NE-1 : 0];
36 54 alirezamon
        //Events
37
        output  router_event_t  router_event [NR-1 : 0][MAX_P-1 : 0];
38 48 alirezamon
 
39
        //all routers port
40
        smartflit_chanel_t    router_chan_in   [NR-1 :0][MAX_P-1 : 0];
41
        smartflit_chanel_t    router_chan_out  [NR-1 :0][MAX_P-1 : 0];
42
 
43
 
44
 
45
                localparam
46
                        PV = V * MAX_P,
47
                        PFw = MAX_P * Fw,
48
                        NRL= NE/K, //number of router in  each layer
49
                        NEFw = NE * Fw,
50
                        NEV = NE * V,
51
                        CONG_ALw = CONGw * MAX_P,
52
                        PLKw = MAX_P * LKw,
53
                        PLw = MAX_P * Lw,
54
                        PRAw = MAX_P * RAw; // {layer , Pos} width
55
 
56
  function integer addrencode;
57
        input integer pos,k,n,kw;
58
        integer pow,i,tmp;begin
59
        addrencode=0;
60
        pow=1;
61
        for (i = 0; i 
62
            tmp=(pos/pow);
63
            tmp=tmp%k;
64
            tmp=tmp<
65
            addrencode=addrencode | tmp;
66
            pow=pow * k;
67
        end
68
        end
69
    endfunction
70
 
71
    wire [LKw-1 : 0] current_pos_addr [NR-1 :0];
72
    wire [Lw-1  : 0] current_layer_addr [NR-1 :0];
73
    wire [RAw-1 : 0] current_r_addr [NR-1 : 0];
74
 
75
//add roots
76
 
77
genvar pos,level,port;
78
 
79
 
80
 
81
generate
82
for( pos=0; pos
83 54 alirezamon
          localparam RID = pos;
84 48 alirezamon
          router_top # (
85
               .P(K)
86
      )
87
      the_router
88
      (
89 54 alirezamon
                .current_r_id    (RID),
90
                .current_r_addr  (current_r_addr [RID]),
91
                .chan_in         (router_chan_in [RID][K-1 : 0]),
92
                .chan_out        (router_chan_out[RID][K-1 : 0]),
93
                .router_event    (router_event[RID][K-1 : 0]),
94 48 alirezamon
                .clk             (clk            ),
95
                .reset           (reset          )
96 54 alirezamon
      );
97 48 alirezamon
end
98
 
99
//add leaves
100
 
101
for( level=1; level
102
   for( pos=0; pos
103 54 alirezamon
    localparam RID = NRL*level+pos;
104
 
105 48 alirezamon
        router_top # (
106
                        .P(2*K)
107
                )
108
                the_router
109
                (
110 54 alirezamon
                        .current_r_id    (RID),
111
                        .current_r_addr  (current_r_addr [RID]),
112
                        .chan_in         (router_chan_in [RID]),
113
                        .chan_out        (router_chan_out[RID]),
114
                        .router_event    (router_event[RID]),
115 48 alirezamon
                        .clk             (clk            ),
116
                        .reset           (reset          )
117
                );
118
 
119
    end
120
end
121
 
122
 
123
//connect all down input chanels
124
localparam NPOS = powi( K, L-1);
125
localparam CHAN_PER_DIRECTION = (K * powi( L , L-1 )); //up or down
126
localparam CHAN_PER_LEVEL = 2*(K * powi( K , L-1 )); //up+down
127
 
128
for (level = 0; level
129
/* verilator lint_off WIDTH */
130
    localparam [Lw-1 : 0] LEAVE_L = L-1-level;
131
/* verilator lint_on WIDTH */
132
    //input chanel are numbered interleavely, the interleaev depends on level
133
    localparam ROUTERS_PER_NEIGHBORHOOD = powi(K,L-1-(level));
134
    localparam ROUTERS_PER_BRANCH = powi(K,L-1-(level+1));
135
    localparam LEVEL_OFFSET = ROUTERS_PER_NEIGHBORHOOD*K;
136
    for ( pos = 0; pos < NPOS; pos=pos+1 ) begin : pos_c
137
        localparam ADRRENCODED=addrencode(pos,K,L,Kw);
138
        localparam NEIGHBORHOOD = (pos/ROUTERS_PER_NEIGHBORHOOD);
139
        localparam NEIGHBORHOOD_POS = pos % ROUTERS_PER_NEIGHBORHOOD;
140
        for ( port = 0; port < K; port=port+1 ) begin : port_c
141
            localparam LINK =
142
                ((level+1)*CHAN_PER_LEVEL - CHAN_PER_DIRECTION)  //which levellevel
143
                +NEIGHBORHOOD* LEVEL_OFFSET   //region in level
144
                +port*ROUTERS_PER_BRANCH*K //sub region in region
145
                +(NEIGHBORHOOD_POS)%ROUTERS_PER_BRANCH*K //router in subregion
146
                +(NEIGHBORHOOD_POS)/ROUTERS_PER_BRANCH; //port on router
147
 
148
 
149
            localparam L2= (LINK+CHAN_PER_DIRECTION)/CHAN_PER_LEVEL;
150
            localparam POS2 = ((LINK+CHAN_PER_DIRECTION) % CHAN_PER_LEVEL)/K;
151
            localparam PORT2= (((LINK+CHAN_PER_DIRECTION) % CHAN_PER_LEVEL)  %K)+K;
152
            localparam ID1 =NRL*level+pos;
153
            localparam ID2 =NRL*L2 + POS2;
154
            localparam POS_ADR_CODE2= addrencode(POS2,K,L,Kw);
155
            localparam POS_ADR_CODE1= addrencode(pos,K,L,Kw);
156
 
157
 
158
           // $dotfile=$dotfile.node_connection('R',$id1,undef,$port,'R',$connect_id,undef,$connect_port);
159
                assign  router_chan_in [ID1][port ] = router_chan_out [ID2][PORT2];
160
                        assign  router_chan_in [ID2][PORT2] = router_chan_out [ID1][port ];
161
 
162
            assign current_layer_addr [ID1] = LEAVE_L;
163
            assign current_pos_addr [ID1] = ADRRENCODED[LKw-1 :0];
164
            assign current_r_addr [ID1] = {current_layer_addr [ID1],current_pos_addr[ID1]};
165
 
166
                        if(level==L-2)begin
167
                                 assign current_layer_addr [ID2] ={Lw{1'b0}};
168
                 assign current_pos_addr [ID2] = POS_ADR_CODE2[LKw-1 :0];
169
                 assign current_r_addr [ID2] = {current_layer_addr [ID2],current_pos_addr[ID2]};
170
                        end
171
 
172
 
173
         end
174
    end
175
end
176
 
177
 
178
 
179
 for ( pos = 0; pos <  NE; pos=pos+1 ) begin : endpoints
180
    localparam RID= NRL*(L-1)+(pos/K);
181
    localparam RPORT = pos%K;
182
 
183
     //$dotfile=$dotfile.node_connection('T',$i,undef,undef,'R',$r,undef,$i%($k));
184
 
185
            assign router_chan_in [RID][RPORT] =    chan_in_all [pos];
186
            assign chan_out_all [pos] = router_chan_out [RID][RPORT];
187
 
188
 
189
 end
190
 endgenerate
191
 
192
 
193
endmodule
194
 
195
 
196
 
197
 

powered by: WebSVN 2.1.0

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