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/] [tree_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
*
5
*   tree route function
6
*
7
***************************************/
8
 
9
// ============================================================
10
//  TREE: Nearest Common Ancestor w
11
// ============================================================
12
 
13
module tree_nca_routing  #(
14
   parameter K   = 2, // number of last level individual router`s endpoints.
15
   parameter L   = 2 // Fattree layer number (The height of FT)
16
 
17
)
18
(
19
 
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
        DSPw= log2(K+1);
43
 
44
    input  [LKw-1 :0]    current_addr_encoded;
45
    input  [Lw-1  :0]    current_level;
46
    input  [LKw-1 :0]    dest_addr_encoded;
47
    output [DSPw-1:0]    destport_encoded;
48
 
49
    /******************
50
        There is always one destination path that can be selected for each destination endpoint
51
        Hence we can use the binary address of destination port
52
    *******************/
53
 
54
    wire  [Kw-1 :0]  current_addr [L-1 : 0];
55
    wire  [Kw-1 :0]  parrent_dest_addr [L-1 : 0];
56
    wire  [Kw-1 :0]  dest_addr [L-1 : 0];
57
    wire  [DSPw-1 :0]  current_node_dest_port;
58
 
59
    wire [L-1 : 0] parrents_node_missmatch;
60
 
61
    assign current_addr [0]={Kw{1'b0}};
62
    assign parrent_dest_addr [0]={Kw{1'b0}};
63
 
64
    genvar i;
65
    generate
66
    for(i=1; i<L; i=i+1)begin : caddr
67
        /* verilator lint_off WIDTH */
68
        assign current_addr [i] = (current_level <i)? current_addr_encoded[i*Kw-1 : (i-1)*Kw] : {Kw{1'b0}};
69
        assign parrent_dest_addr [i] = (current_level<i)? dest_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
70
        /* verilator lint_on WIDTH */
71
    end
72
 
73
 
74
    for(i=0; i<L; i=i+1) begin : daddr
75
       // assign current_addr [i] = (current_level >=i)? current_addr_encoded[(i+1)*Kw-1 : i*Kw] : {Kw{1'b0}};
76
 
77
        assign dest_addr [i] =  dest_addr_encoded[(i+1)*Kw-1 : i*Kw];
78
        assign parrents_node_missmatch[i]=  current_addr [i] !=  parrent_dest_addr [i];
79
    end//for
80
 
81
    if(DSPw==Kw) begin :eq
82
        assign current_node_dest_port = dest_addr[current_level];
83
    end else begin :neq
84
        assign current_node_dest_port = {1'b0,dest_addr[current_level]};
85
    end
86
    endgenerate
87
 
88
    assign destport_encoded = (parrents_node_missmatch != {L{1'b0}}) ? /*go up*/ K[DSPw-1: 0] :  /*go down*/current_node_dest_port;
89
 
90
endmodule
91
 
92
 
93
/*************************
94
 *  tree_conventional_routing
95
 * **********************/
96
 
97
 
98
module tree_conventional_routing #(
99
    parameter ROUTE_NAME = "NCA",
100
    parameter K   = 2, // number of last level individual router`s endpoints.
101
    parameter L   = 2 // Fattree layer number (The height of FT)
102
 )
103
(
104
 
105
    current_addr_encoded,    // connected to current router x address
106
    current_level,    //connected to current router y address
107
    dest_addr_encoded,        // destination address
108
    destport_encoded    // router output port
109
 
110
);
111
 
112
 
113
    function integer log2;
114
      input integer number; begin
115
         log2=(number <=1) ? 1: 0;
116
         while(2**log2<number) begin
117
            log2=log2+1;
118
         end
119
      end
120
    endfunction // log2 
121
 
122
    localparam
123
        Kw = log2(K),
124
        LKw= L*Kw,
125
        Lw = log2(L),
126
        DSPw= log2(K+1);
127
 
128
    input  [LKw-1 :0]    current_addr_encoded;
129
    input  [Lw-1  :0]    current_level;
130
    input  [LKw-1 :0]    dest_addr_encoded;
131
    output [DSPw-1  :0]    destport_encoded;
132
 
133
        tree_nca_routing #(
134
            .K(K),
135
            .L(L)
136
        )
137
        nca_random_up
138
        (
139
            .current_addr_encoded(current_addr_encoded),
140
            .current_level(current_level),
141
            .dest_addr_encoded(dest_addr_encoded),
142
            .destport_encoded(destport_encoded)
143
        );
144
 
145
 
146
endmodule
147
 
148
 
149
 
150
/************************************************
151
        deterministic_look_ahead_routing
152
**********************************************/
153
 
154
module  tree_deterministic_look_ahead_routing #(
155
    parameter P=4,
156
    parameter ROUTE_NAME = "NCA_RND_UP",
157
    parameter K   = 2, // number of last level individual router`s endpoints.
158
    parameter L   = 2 // Fattree layer number (The height of FT)
159
 
160
  )
161
  (
162
    destport_encoded,// current router destination port 
163
    dest_addr_encoded,
164
    neighbors_rx,
165
    neighbors_ry,
166
    lkdestport_encoded // look ahead destination port     
167
 );
168
 
169
 
170
   function integer log2;
171
      input integer number; begin
172
         log2=(number <=1) ? 1: 0;
173
         while(2**log2<number) begin
174
            log2=log2+1;
175
         end
176
      end
177
    endfunction // log2 
178
 
179
 
180
    localparam
181
        Kw = log2(K),
182
        LKw= L*Kw,
183
        Lw = log2(L),
184
        Pw=log2(P),
185
        PLw = P * Lw,
186
        PLKw = P * LKw,
187
        DSPw= log2(K+1);
188
 
189
 
190
    input  [DSPw-1 :0]    destport_encoded;
191
    input  [LKw-1 :0]    dest_addr_encoded;
192
    input  [PLKw-1 : 0]  neighbors_rx;
193
    input  [PLw-1 : 0]  neighbors_ry;
194
    output [DSPw-1: 0]    lkdestport_encoded;
195
 
196
 
197
    wire  [LKw-1 :0]    next_addr_encoded;
198
    wire  [Lw-1  :0]    next_level;
199
    wire  [DSPw-1:0] lkdestport_encoded;
200
 
201
    next_router_addr_selector_bin #(
202
         .P(P),
203
         .RXw(LKw),
204
         .RYw(Lw)
205
    )
206
    addr_predictor
207
    (
208
        .destport_bin(destport_encoded[Pw-1 : 0]),
209
        .neighbors_rx(neighbors_rx),
210
        .neighbors_ry(neighbors_ry),
211
        .next_rx(next_addr_encoded),
212
        .next_ry(next_level)
213
    );
214
 
215
 
216
    tree_conventional_routing #(
217
        .ROUTE_NAME(ROUTE_NAME),
218
        .K(K),
219
        .L(L)
220
    )
221
    conv_routing
222
    (
223
 
224
        .current_addr_encoded(next_addr_encoded),
225
        .current_level(next_level),
226
        .dest_addr_encoded(dest_addr_encoded),
227
        .destport_encoded(lkdestport_encoded)
228
    );
229
 
230
 endmodule
231
 
232
 
233
 
234
/************************************
235
 
236
     tree_look_ahead_routing
237
 
238
*************************************/
239
 
240
module tree_look_ahead_routing #(
241
    parameter ROUTE_NAME = "NCA",
242
    parameter P = 4,
243
    parameter L = 2,
244
    parameter K = 2
245
 
246
)
247
(
248
    reset,
249
    clk,
250
    destport_encoded,// current router destination port 
251
    dest_addr_encoded,
252
    neighbors_rx,
253
    neighbors_ry,
254
    lkdestport_encoded // look ahead destination port     
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
        PLw = P * Lw,
272
        PLKw = P * LKw,
273
        DSPw= log2(K+1);
274
 
275
    input  [DSPw-1 :0]    destport_encoded;
276
    input  [LKw-1 :0]    dest_addr_encoded;
277
    input  [PLKw-1 : 0]  neighbors_rx;
278
    input  [PLw-1 : 0]  neighbors_ry;
279
    output [DSPw-1: 0]    lkdestport_encoded;
280
    input                   reset,clk;
281
 
282 54 alirezamon
    wire  [DSPw-1 :0]    destport_encoded_delayed;
283
    wire  [LKw-1 :0]    dest_addr_encoded_delayed;
284 48 alirezamon
 
285
     tree_deterministic_look_ahead_routing #(
286
        .P(P),
287
        .ROUTE_NAME(ROUTE_NAME),
288
        .K(K),
289
        .L(L)
290
     )
291
     look_ahead_routing
292
     (
293
        .destport_encoded(destport_encoded_delayed),
294
        .dest_addr_encoded(dest_addr_encoded_delayed),
295
        .neighbors_rx(neighbors_rx),
296
        .neighbors_ry(neighbors_ry),
297
        .lkdestport_encoded(lkdestport_encoded)
298
     );
299
 
300 54 alirezamon
      pronoc_register #(.W(DSPw)) reg1 (.in(destport_encoded  ), .out(destport_encoded_delayed), .reset(reset), .clk(clk));
301
      pronoc_register #(.W(LKw )) reg2 (.in(dest_addr_encoded ), .out(dest_addr_encoded_delayed),.reset(reset), .clk(clk));
302
 
303 48 alirezamon
 
304 54 alirezamon
 
305 48 alirezamon
 
306
endmodule
307
 
308
 
309
 
310
 
311
 
312
 /*************
313
 * tree_destport_encoder
314
 * ***********/
315
 
316
 module tree_destport_decoder #(
317
     parameter K=2
318
 )(
319
    destport_decoded_o,
320
    destport_encoded_i
321
 );
322
     function integer log2;
323
      input integer number; begin
324
         log2=(number <=1) ? 1: 0;
325
         while(2**log2<number) begin
326
            log2=log2+1;
327
         end
328
      end
329
    endfunction // log2 
330
 
331
    localparam
332
        MAX_P = K+1,
333
        DSPw= log2(MAX_P);
334
 
335
    input  [DSPw-1 : 0] destport_encoded_i;
336
    output [MAX_P-1 : 0] destport_decoded_o;
337
 
338
 
339
    bin_to_one_hot #(
340
        .BIN_WIDTH(DSPw),
341
        .ONE_HOT_WIDTH(MAX_P)
342
    )
343
    cnvt
344
    (
345
        .bin_code(destport_encoded_i),
346
        .one_hot_code(destport_decoded_o)
347
    );
348
 
349
endmodule
350
 
351
 
352
 
353
//decode and mask destport  
354
module  tree_destp_generator #(
355
    parameter K=2,
356
    parameter P=K+1,
357
    parameter SW_LOC=0,
358
    parameter DSTPw=4,
359
    parameter SELF_LOOP_EN = "NO"
360
)(
361
    dest_port_in_encoded,
362
    dest_port_out
363
);
364
 
365
 
366
    localparam
367
        MAX_P = K+1,
368
        P_1 = (SELF_LOOP_EN == "NO")? P-1 : P;
369
 
370
    input  [DSTPw-1:0] dest_port_in_encoded;
371
    output [P_1-1 : 0] dest_port_out;
372
 
373
    wire [MAX_P-1 : 0] destport_decoded;
374
 
375
        tree_destport_decoder #(
376
            .K(K)
377
        )
378
        destport_decoder
379
        (
380
            .destport_encoded_i(dest_port_in_encoded),
381
            .destport_decoded_o(destport_decoded)
382
        );
383
 
384
    generate
385
    if(SELF_LOOP_EN == "NO") begin : nslp
386
        remove_sw_loc_one_hot #(
387
            .P(P),
388
            .SW_LOC(SW_LOC)
389
        )
390
        conv
391
        (
392
            .destport_in(destport_decoded[P-1 : 0]),
393
            .destport_out(dest_port_out[P_1-1  :   0 ])
394
        );
395
    end else begin : slp
396
        assign dest_port_out = destport_decoded;
397
    end
398
    endgenerate
399
 endmodule

powered by: WebSVN 2.1.0

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