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_openpiton/] [wrapper.sv.bak] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 56 alirezamon
/****************************************************************************
2
 * wrapper.sv
3
 ****************************************************************************/
4
 
5
/**
6
 * Module: pronoc_to_piton_wrapper
7
 *
8
 * TODO: Add module documentation
9
 */
10
`timescale      1ns/1ps
11
 
12
`include "define.tmp.h"
13
`include "pronoc_def.v"
14
 
15
`define PRESERVED_DATw (`MSG_LENGTH_WIDTH + `MSG_TYPE_WIDTH + `MSG_MSHRID_WIDTH + `MSG_OPTIONS_1_WIDTH )
16
`define HEAD_DATw  (FPAYw-MSB_BE-1)
17
`define ADDR_CODED (`HEAD_DATw-`PRESERVED_DATw)
18
 
19
module piton_to_pronoc_endp_addr_converter
20
 
21
#(
22
       parameter CHIP_SET_PORT = 3,
23
           parameter NOC_ID=0
24
)
25
(
26
       default_chipid_i,
27
       piton_chipid_i,
28
       piton_coreid_x_i,
29
       piton_coreid_y_i,
30
       piton_fbits_i,
31
 
32
       pronoc_endp_addr_o,
33
       piton_end_addr_coded_o
34
);
35
 
36
       `NOC_CONF
37
 
38
       input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid_i;
39
       input  [`NOC_CHIPID_WIDTH-1:0]  piton_chipid_i;
40
       input  [`NOC_X_WIDTH-1:0]       piton_coreid_x_i;
41
       input  [`NOC_Y_WIDTH-1:0]       piton_coreid_y_i;
42
       input  [`MSG_SRC_FBITS_WIDTH-1:0]  piton_fbits_i;
43
 
44
       output [EAw-1 : 0] pronoc_endp_addr_o;
45
       output [`ADDR_CODED-1 : 0] piton_end_addr_coded_o;
46
 
47
       generate
48
        if(T3==1) begin:same
49
            piton_to_pronoc_endp_addr_converter_same_topology  #(
50
                .CHIP_SET_PORT(CHIP_SET_PORT),
51
                                .NOC_ID(NOC_ID)
52
            ) conv (
53
                .default_chipid_i  (default_chipid_i),
54
                .piton_chipid_i    (piton_chipid_i),
55
                .piton_coreid_x_i  (piton_coreid_x_i),
56
                .piton_coreid_y_i  (piton_coreid_y_i),
57
                .piton_fbits_i     (piton_fbits_i ),
58
                .pronoc_endp_addr_o (pronoc_endp_addr_o),
59
                .piton_end_addr_coded_o(piton_end_addr_coded_o)
60
            );
61
 
62
        end else begin :diff
63
            piton_to_pronoc_endp_addr_converter_diffrent_topology  #(
64
                .CHIP_SET_PORT(CHIP_SET_PORT),
65
                                .NOC_ID(NOC_ID)
66
            ) conv (
67
                .default_chipid_i  (default_chipid_i),
68
                .piton_chipid_i    (piton_chipid_i),
69
                .piton_coreid_x_i  (piton_coreid_x_i),
70
                .piton_coreid_y_i  (piton_coreid_y_i),
71
                .piton_fbits_i     (piton_fbits_i ),
72
                .pronoc_endp_addr_o (pronoc_endp_addr_o),
73
                .piton_end_addr_coded_o(piton_end_addr_coded_o)
74
            );
75
 
76
 
77
        end
78
       endgenerate
79
 
80
endmodule
81
 
82
 
83
module piton_to_pronoc_endp_addr_converter_diffrent_topology
84
#(
85
    parameter CHIP_SET_PORT = 3,
86
        parameter NOC_ID=0
87
)
88
(
89
    default_chipid_i,
90
    piton_chipid_i,
91
    piton_coreid_x_i,
92
    piton_coreid_y_i,
93
    piton_fbits_i,
94
 
95
    pronoc_endp_addr_o,
96
    piton_end_addr_coded_o
97
);
98
 
99
    `NOC_CONF
100
    input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid_i;
101
    input  [`NOC_CHIPID_WIDTH-1:0]  piton_chipid_i;
102
    input  [`NOC_X_WIDTH-1:0]       piton_coreid_x_i;
103
    input  [`NOC_Y_WIDTH-1:0]       piton_coreid_y_i;
104
    input  [`MSG_SRC_FBITS_WIDTH-1:0]  piton_fbits_i;
105
 
106
    output reg [EAw-1 : 0] pronoc_endp_addr_o;
107
    output reg [`ADDR_CODED-1 : 0] piton_end_addr_coded_o;
108
 
109
    localparam [3:0]
110
        FBIT_NONE = 4'b0000,
111
        FBIT_W  = 4'b0010,
112
        FBIT_S  = 4'b0011,
113
        FBIT_E  = 4'b0100,
114
        FBIT_N  = 4'b0101;
115
 
116
    localparam
117
        Xw = log2(NX),    // number of node in x axis
118
        Yw = log2(NY);    // number of node in y axis
119
 
120
    localparam
121
        PITON_TOPOLOGY = "FMESH",
122
        PITON_Xw = log2(`PITON_X_TILES),    // number of node in x axis
123
        PITON_Yw = log2(`PITON_Y_TILES),    // number of node in y axis
124
        PITON_NE =(`PITON_X_TILES * `PITON_Y_TILES) + 2 * (`PITON_X_TILES+`PITON_Y_TILES),
125
        PITON_MAX_P = 5,
126
        PITON_NLw= log2(PITON_MAX_P),
127
        PITON_EAw = PITON_Xw + PITON_Yw + log2(PITON_MAX_P),
128
        PITON_NEw = log2(PITON_NE);
129
 
130
    wire [PITON_NLw-1: 0] piton_edge_port;
131
    assign piton_edge_port =
132
        (piton_fbits_i [3:0] == FBIT_NONE) ? LOCAL:
133
        (piton_fbits_i [3:0] == FBIT_W   ) ? WEST:
134
        (piton_fbits_i [3:0] == FBIT_S   ) ? SOUTH:
135
        (piton_fbits_i [3:0] == FBIT_E   ) ? EAST: NORTH;
136
 
137
    wire [PITON_Xw-1 : 0] piton_x =  piton_coreid_x_i;
138
    wire [PITON_Xw-1 : 0] piton_y =  piton_coreid_y_i;
139
    wire [EAw-1 : 0] pronoc_endp_addr , chipset_endp_addr;
140
    wire [EAw-1 : 0] pronoc_endp_addr1,pronoc_endp_addr2;
141
    wire [PITON_NLw-1: 0] piton_l = (piton_chipid_i == default_chipid_i ) ? piton_edge_port  : CHIP_SET_PORT;
142
    //find  piton index
143
    wire [PITON_EAw-1 : 0] piton_e_addr = {piton_l,piton_y,piton_x};
144
    wire [PITON_NEw-1 : 0] piton_id;
145
    endp_addr_decoder #( .TOPOLOGY(PITON_TOPOLOGY),   .T1(`PITON_X_TILES), .T2(`PITON_Y_TILES), .T3(1), .EAw(PITON_EAw),  .NE(PITON_NE))
146
        encode1 ( .id(piton_id), .code(piton_e_addr ));
147
 
148
    reg [NEw-1 : 0] ProNoC_id;
149
 
150
    generate
151
        if (PITON_NEw < NEw) begin
152
            always @ (*) begin
153
                ProNoC_id =0;
154
                ProNoC_id [PITON_NEw-1 : 0] = piton_id;
155
            end
156
        end else begin
157
            always @ (*) begin
158
                ProNoC_id =0;
159
                ProNoC_id  = piton_id [ NEw-1 : 0];
160
            end
161
        end
162
    endgenerate
163
 
164
    endp_addr_encoder #( .TOPOLOGY(TOPOLOGY), .T1(T1), .T2(T2), .T3(T3), .EAw(EAw),  .NE(NE))
165
        encode2 ( .id(ProNoC_id), .code( pronoc_endp_addr1 ));
166
 
167
    // The address2 is generated for pronoc in OP and its not coded based on OP so no need to convert it.
168
    // It is indicated when msb of fbit is one
169
    wire   [`NOC_X_WIDTH + `NOC_Y_WIDTH-1 : 0]   input_merged = {piton_coreid_y_i ,    piton_coreid_x_i};
170
    assign pronoc_endp_addr2 = input_merged [EAw-1 : 0];
171
    assign pronoc_endp_addr  = (piton_fbits_i[3]) ? pronoc_endp_addr2 : pronoc_endp_addr1;
172
 
173
    localparam [NEw-1 : 0] CHIP_SET_ID = T1*T2*T3+2*T1; // endp connected  of west port of router 0-0
174
    endp_addr_encoder #( .TOPOLOGY(TOPOLOGY), .T1(T1), .T2(T2), .T3(T3), .EAw(EAw),  .NE(NE))
175
        encode3 ( .id(CHIP_SET_ID), .code( chipset_endp_addr ));
176
 
177
    assign pronoc_endp_addr_o =  (piton_chipid_i == default_chipid_i ) ? pronoc_endp_addr : chipset_endp_addr;
178
 
179
    always @ (*) begin
180
        piton_end_addr_coded_o = {`ADDR_CODED{1'b0}};
181
        piton_end_addr_coded_o [Yw+Xw-1 : 0] =   {piton_coreid_y_i[Yw-1 : 0],  piton_coreid_x_i[Xw-1 : 0]};
182
        if(piton_chipid_i == 8192 ) begin
183
            piton_end_addr_coded_o[`ADDR_CODED-1]=1'b1;
184
        end// TODO need to know how chip id coded from zero to max or from 8192 to zero
185
    end
186
 
187
endmodule
188
 
189
 
190
 
191
module piton_to_pronoc_endp_addr_converter_same_topology
192
#(
193
    parameter CHIP_SET_PORT = 3,
194
        parameter NOC_ID=0
195
)
196
(
197
    default_chipid_i,
198
    piton_chipid_i,
199
    piton_coreid_x_i,
200
    piton_coreid_y_i,
201
    piton_fbits_i,
202
 
203
    pronoc_endp_addr_o,
204
    piton_end_addr_coded_o
205
);
206
 
207
 `NOC_CONF
208
 
209
    input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid_i;
210
    input  [`NOC_CHIPID_WIDTH-1:0]  piton_chipid_i;
211
    input  [`NOC_X_WIDTH-1:0]       piton_coreid_x_i;
212
    input  [`NOC_Y_WIDTH-1:0]       piton_coreid_y_i;
213
    input  [`MSG_SRC_FBITS_WIDTH-1:0]  piton_fbits_i;
214
 
215
 
216
    output reg [EAw-1 : 0] pronoc_endp_addr_o;
217
    output reg    [`ADDR_CODED-1 : 0] piton_end_addr_coded_o;
218
 
219
    localparam [3:0]
220
        FBIT_NONE    =4'b0000,
221
        FBIT_W    =4'b0010,
222
        FBIT_S    =4'b0011,
223
        FBIT_E    =4'b0100,
224
        FBIT_N    =4'b0101;
225
 
226
    localparam
227
        Xw = log2(NX),    // number of node in x axis
228
        Yw = log2(NY);    // number of node in y axis
229
 
230
 
231
    wire [EAw-Yw-Xw-1 : 0] edge_port;
232
        assign edge_port = (piton_fbits_i [3:0] == FBIT_NONE) ? LOCAL:
233
                           (piton_fbits_i [3:0] == FBIT_W   ) ? WEST:
234
                           (piton_fbits_i [3:0] == FBIT_S   ) ? SOUTH:
235
                           (piton_fbits_i [3:0] == FBIT_E   ) ? EAST: NORTH;
236
 
237
    //coded for FMESH topology
238
    generate
239
 
240
 
241
    if(TOPOLOGY == "FMESH") begin
242
        always @ (*) begin
243
            pronoc_endp_addr_o = {EAw{1'b0}};
244
            if(piton_chipid_i == default_chipid_i ) begin
245
                pronoc_endp_addr_o [Yw+Xw-1 : 0] =  {piton_coreid_y_i[Yw-1 : 0],  piton_coreid_x_i[Xw-1 : 0]};
246
                `ifdef PITON_EXTRA_MEMS
247
                pronoc_endp_addr_o [EAw-1 : Yw+Xw] = edge_port ;
248
                `endif
249
            end else begin //send it to next chip
250
                pronoc_endp_addr_o [EAw-1 : Yw+Xw] =  CHIP_SET_PORT;  // router 0,0 west port;
251
            end
252
        end
253
    end else begin //"mesh"
254
        always @ (*) begin
255
            pronoc_endp_addr_o = {EAw{1'b0}};
256
            pronoc_endp_addr_o [Yw+Xw-1 : 0] =  {piton_coreid_y_i[Yw-1 : 0],  piton_coreid_x_i[Xw-1 : 0]};
257
        end
258
    end
259
    endgenerate
260
 
261
    always @ (*) begin
262
        piton_end_addr_coded_o = {`ADDR_CODED{1'b0}};
263
        piton_end_addr_coded_o [Yw+Xw-1 : 0] =   {piton_coreid_y_i[Yw-1 : 0],  piton_coreid_x_i[Xw-1 : 0]};
264
        if(piton_chipid_i == 8192 ) begin
265
            piton_end_addr_coded_o[`ADDR_CODED-1]=1'b1;
266
        end// TODO need to know how chip id coded from zero to max or from 8192 to zero
267
    end
268
 
269
 
270
endmodule
271
 
272
 
273
module pronoc_to_piton_endp_addr_converter #(
274
        parameter NOC_ID=0
275
)(
276
    piton_end_addr_coded_i,
277
 
278
    piton_chipid_o,
279
    piton_coreid_x_o,
280
    piton_coreid_y_o
281
 
282
);
283
 
284
 `NOC_CONF
285
 
286
//coded for FMESH topology
287
localparam
288
    Xw = log2(NX),    // number of node in x axis
289
    Yw = log2(NY);    // number of node in y axis
290
 
291
output  [`NOC_CHIPID_WIDTH-1:0]  piton_chipid_o;
292
output  reg [`NOC_X_WIDTH-1:0]   piton_coreid_x_o;
293
output  reg [`NOC_Y_WIDTH-1:0]   piton_coreid_y_o;
294
 
295
input   [`ADDR_CODED-1 : 0] piton_end_addr_coded_i;
296
 
297
 
298
    always @(*)begin
299
        piton_coreid_x_o = {`MSG_DST_X_WIDTH{1'b0}};
300
        piton_coreid_y_o = {`MSG_DST_Y_WIDTH{1'b0}};
301
        {piton_coreid_y_o[Yw-1 : 0],  piton_coreid_x_o[Xw-1 : 0]}=piton_end_addr_coded_i [Yw+Xw-1 : 0];
302
    end
303
    //TODO regen chip ID
304
    assign piton_chipid_o = (piton_end_addr_coded_i[`ADDR_CODED-1]==1'b1)? 8192 : 0;
305
 
306
endmodule
307
 
308
 
309
 
310
module piton_to_pronoc_wrapper
311
 
312
    #(
313
    parameter NOC_ID=0,
314
    parameter TILE_NUM =0,
315
    parameter CHIP_SET_PORT = 3,
316
    parameter FLATID_WIDTH=8
317
    )(
318
    default_chipid,  default_coreid_x, default_coreid_y, flat_tileid,
319
    reset, clk,
320
    dataIn, validIn, yummyIn,
321
    current_r_addr_i,
322
    chan_out
323
    );
324
 
325
     `NOC_CONF
326
 
327
    //piton
328
    input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid;
329
    input  [`NOC_X_WIDTH-1:0]       default_coreid_x;
330
    input  [`NOC_Y_WIDTH-1:0]       default_coreid_y;
331
    input  [FLATID_WIDTH-1:0] flat_tileid;
332
 
333
    input [Fpay-1:0]         dataIn;
334
    input                               validIn;
335
    input                               yummyIn;
336
 
337
    //pronoc
338
    input [RAw-1 : 0] current_r_addr_i;
339
    output  smartflit_chanel_t chan_out;
340
 
341
    input reset,clk;
342
 
343
    wire [`MSG_DST_CHIPID_WIDTH-1   :0] dest_chipid = dataIn [ `MSG_DST_CHIPID];
344
    wire [`MSG_DST_X_WIDTH-1        :0] dest_x      = dataIn [ `MSG_DST_X];
345
    wire [`MSG_DST_Y_WIDTH-1        :0] dest_y      = dataIn [ `MSG_DST_Y];
346
    wire [`MSG_DST_FBITS_WIDTH-1    :0] dest_fbits  = dataIn [ `MSG_DST_FBITS];
347
    wire [`MSG_LENGTH_WIDTH-1       :0] length      = dataIn [ `MSG_LENGTH ];
348
    wire [`MSG_TYPE_WIDTH-1         :0] msg_type    = dataIn [ `MSG_TYPE ];
349
    wire [`MSG_MSHRID_WIDTH-1       :0] mshrid      = dataIn [ `MSG_MSHRID ];
350
    wire [`MSG_OPTIONS_1_WIDTH-1    :0] option1     = dataIn [ `MSG_OPTIONS_1];
351
 
352
    wire tail,head;
353
    tail_hdr_detect #(
354
        .FLIT_WIDTH(Fpay)
355
    )piton_hdr(
356
        .reset(reset),
357
        .clk(clk),
358
        .flit_in(dataIn),
359
        .valid(validIn),
360
        .ready(1'b1),
361
        .is_tail(tail),
362
        .is_header(head)
363
    );
364
 
365
    wire [EAw-1 : 0] src_e_addr, dest_e_addr;
366
    wire [DSTPw-1 : 0] destport;
367
    wire [`ADDR_CODED-1 : 0] dest_coded;
368
 
369
    piton_to_pronoc_endp_addr_converter #(
370
                .NOC_ID(NOC_ID),
371
                .CHIP_SET_PORT(CHIP_SET_PORT)
372
                ) src_conv (
373
        .default_chipid_i  (default_chipid),
374
        .piton_chipid_i    (default_chipid),
375
        .piton_coreid_x_i  (default_coreid_x),
376
        .piton_coreid_y_i  (default_coreid_y),
377
        .piton_fbits_i     (4'd0),
378
 
379
        .pronoc_endp_addr_o (src_e_addr),
380
        .piton_end_addr_coded_o()
381
 
382
    );
383
 
384
    piton_to_pronoc_endp_addr_converter  #(
385
                .NOC_ID(NOC_ID)
386
        )dst_conv (
387
        .default_chipid_i  (default_chipid),
388
        .piton_chipid_i    (dest_chipid),
389
        .piton_coreid_x_i  (dest_x),
390
        .piton_coreid_y_i  (dest_y),
391
        .piton_fbits_i     (dest_fbits),
392
        .pronoc_endp_addr_o (dest_e_addr),
393
        .piton_end_addr_coded_o(dest_coded)
394
 
395
    );
396
 
397
    conventional_routing #(
398
        .TOPOLOGY(TOPOLOGY),
399
        .ROUTE_NAME(ROUTE_NAME),
400
        .ROUTE_TYPE(ROUTE_TYPE),
401
        .T1(T1),
402
        .T2(T2),
403
        .T3(T3),
404
        .RAw(RAw),
405
        .EAw(EAw),
406
        .DSTPw(DSTPw),
407
        .LOCATED_IN_NI(1)
408
    ) routing_module (
409
        .reset(reset),
410
        .clk(clk),
411
        .current_r_addr(current_r_addr_i),
412
        .dest_e_addr(dest_e_addr),
413
        .src_e_addr(src_e_addr),
414
        .destport(destport)
415
    );
416
 
417
 
418
    //endp_addr_decoder  #( .TOPOLOGY(TOPOLOGY), .T1(T1), .T2(T2), .T3(T3), .EAw(EAw),  .NE(NE)) decod1 ( .id(TILE_NUM), .code(current_e_addr));
419
 
420
    localparam DATA_w = `HEAD_DATw + Fpay - 64;
421
    wire [DATA_w-1 : 0] head_data;
422
    generate
423
        if(Fpay == 64) begin :F64
424
            assign head_data=  {dest_coded ,length, msg_type,  mshrid,option1};
425
        end else begin : FL
426
            assign head_data=  {dataIn[Fpay -1  : 65],dest_coded ,length, msg_type,  mshrid,option1};
427
        end
428
    endgenerate
429
 
430
    wire [Fw-1 : 0] header_flit;
431
    reg [WEIGHTw-1 : 0] win;
432
 
433
    always @(*) begin
434
        win={WEIGHTw{1'b0}};
435
        win[0]=1'b1;
436
    end
437
 
438
 
439
    header_flit_generator    #(
440
        .NOC_ID(NOC_ID),
441
                .DATA_w(DATA_w) // header flit can carry Optional data. The data will be placed after control data.  Fpay >= DATA_w + CTRL_BITS_w
442
    )head_gen(
443
        .flit_out(header_flit),
444
        .src_e_addr_in(src_e_addr),
445
        .dest_e_addr_in(dest_e_addr),
446
        .destport_in(destport),
447
        .class_in(1'b0),
448
        .weight_in(win),
449
        .vc_num_in(1'b1),
450
        .be_in(1'b0),
451
        .data_in(head_data)
452
    );
453
 
454
    assign chan_out.ctrl_chanel.credit_init_val = 4;
455
 
456
    assign chan_out.flit_chanel.flit.hdr_flag =head;
457
    assign chan_out.flit_chanel.flit.tail_flag=tail;
458
    assign chan_out.flit_chanel.flit.vc=1'b1;
459
    assign chan_out.flit_chanel.flit_wr=validIn;
460
    assign chan_out.flit_chanel.credit=yummyIn;
461
    assign chan_out.flit_chanel.flit.payload = (head)? header_flit[Fpay-1 : 0] : dataIn;
462
    assign chan_out.smart_chanel = {SMART_CHANEL_w{1'b0}};
463
    assign chan_out.flit_chanel.congestion = {CONGw{1'b0}};
464
 
465
    /*
466
    always @ (posedge clk) begin
467
        if(validIn==1'b1 && flit_type==    HEADER)begin
468
            $display("%t***Tile %d ***NoC %d************payload length =%d*************************",$time,TILE_NUM,NOC_ID,length);
469
            $display("%t*** src (c=%d,x=%d,y=%d) sends to dst (c=%d,x=%d,y=%d chan_out=%x)",$time,
470
                    default_chipid, default_coreid_x, default_coreid_y, dest_chipid,dest_x,dest_y,chan_out);
471
//$finish;
472
        end
473
    end
474
    */
475
    /*
476
    //synthesis translate_off
477
    reg [7: 0] yy;
478
    initial begin //make sure address decoding match between ProNoC and Openpiton
479
        #100
480
        yy = (TILE_NUM / `X_TILES )%`Y_TILES ;
481
        if((default_coreid_y != yy ) ||
482
        (default_coreid_x != (TILE_NUM % `X_TILES ))) begin
483
        $display ("ERROR: Address missmatch! ");
484
        $finish;
485
        end
486
    end
487
    //synthesis translate_on
488
    */
489
endmodule
490
/********************************
491
 *         pronoc_to_piton_wrapper
492
 * ***************************/
493
 
494
 
495
 
496
module pronoc_to_piton_wrapper
497
#(
498
    parameter NOC_ID=0,
499
    parameter PORT_NUM=0,
500
    parameter TILE_NUM =0,
501
    parameter FLATID_WIDTH=8
502
)(
503
    default_chipid,  default_coreid_x, default_coreid_y, flat_tileid,
504
    reset, clk,
505
    dataOut, validOut, yummyOut,
506
    current_r_addr_o,
507
    chan_in
508
);
509
 
510
    `NOC_CONF
511
 
512
    //piton out
513
    input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid;
514
    input  [`NOC_X_WIDTH-1:0]       default_coreid_x;
515
    input  [`NOC_Y_WIDTH-1:0]       default_coreid_y;
516
    input  [FLATID_WIDTH-1:0] flat_tileid;
517
 
518
    output [Fpay-1:0]        dataOut;
519
    output                              validOut;
520
    output                              yummyOut;
521
 
522
    output [RAw-1 : 0] current_r_addr_o;
523
 
524
    //pronoc in
525
    input  smartflit_chanel_t chan_in;
526
 
527
    input reset,clk;
528
 
529
 
530
    assign current_r_addr_o = chan_in.ctrl_chanel.neighbors_r_addr;
531
 
532
 
533
    localparam
534
        Xw = log2(NX),    // number of node in x axis
535
        Yw = log2(NY);    // number of node in y axis
536
 
537
 
538
    enum bit [1:0] {HEADER, BODY,TAIL} flit_type,flit_type_next;
539
 
540
    localparam DATA_w = `HEAD_DATw + Fpay - 64;
541
    hdr_flit_t hdr_flit;
542
    wire [DATA_w-1 : 0] head_dat;
543
 
544
    //extract ProNoC header flit data
545
    header_flit_info #(
546
                .NOC_ID(NOC_ID),
547
        .DATA_w(DATA_w)
548
    )extract(
549
        .flit(chan_in.flit_chanel.flit),
550
        .hdr_flit(hdr_flit),
551
        .data_o(head_dat)
552
    );
553
 
554
    wire [Fpay-1:0] header_flit;
555
 
556
    wire [`MSG_DST_CHIPID_WIDTH-1   :0] dest_chipid;
557
    reg  [`MSG_DST_X_WIDTH-1        :0] dest_x     ;
558
    reg  [`MSG_DST_Y_WIDTH-1        :0] dest_y     ;
559
    wire [`MSG_DST_FBITS_WIDTH-1    :0] dest_fbits ;
560
    wire [`MSG_LENGTH_WIDTH-1       :0] length     ;
561
    wire [`MSG_TYPE_WIDTH-1         :0] msg_type   ;
562
    wire [`MSG_MSHRID_WIDTH-1       :0] mshrid     ;
563
    wire [`MSG_OPTIONS_1_WIDTH-1    :0] option1    ;
564
 
565
    wire [`ADDR_CODED-1 : 0] dest_coded;
566
 
567
 
568
    assign {dest_coded, length, msg_type, mshrid, option1}  =  head_dat [`HEAD_DATw-1 : 0];
569
 
570
    pronoc_to_piton_endp_addr_converter#(
571
                .NOC_ID(NOC_ID)
572
                )addr_conv (
573
        .piton_end_addr_coded_i(dest_coded),
574
        .piton_chipid_o (dest_chipid),
575
        .piton_coreid_x_o(dest_x),
576
        .piton_coreid_y_o(dest_y)
577
    );
578
 
579
 
580
    wire [MAX_P-1:0] destport_one_hot;
581
 
582
 
583
    //    FBITS coding
584
    localparam [3: 0]
585
        FBITS_WEST         =  4'b0010,
586
        FBITS_SOUTH      =  4'b0011,
587
        FBITS_EAST       =  4'b0100,
588
        FBITS_NORTH      =  4'b0101,
589
        FBITS_PROCESSOR  =  4'b0000;
590
    /*
591
        ProNoC destination port order num
592
        LOCAL   =   0
593
        EAST    =   1
594
        NORTH   =   2
595
        WEST    =   3
596
        SOUTH   =   4
597
    */
598
 
599
    //assign dest_fbits =        (PORT_NUM==0) ? 4'b0000:4'b0010;//offchip
600
 
601
    /*
602
    always @(posedge clk) begin
603
        if(validOut) begin
604
            $display("********************************************destport_one_hot=%b; dest_fbits=%b",destport_one_hot,dest_fbits);
605
            $finish;
606
        end
607
    end
608
    */
609
 
610
    assign dest_fbits =
611
        (destport_one_hot [LOCAL]) ? FBITS_PROCESSOR:
612
        (destport_one_hot [EAST ]) ? FBITS_EAST:
613
        (destport_one_hot [NORTH]) ? FBITS_NORTH:
614
        (destport_one_hot [WEST ]) ? FBITS_WEST:
615
        (destport_one_hot [SOUTH ]) ? FBITS_SOUTH: FBITS_PROCESSOR;
616
 
617
    wire [DSTPw-1 : 0] dstp_encoded = hdr_flit.destport;
618
 
619
 
620
 
621
    localparam
622
        ELw = log2(T3),
623
        Pw  = log2(MAX_P),
624
        PLw = (TOPOLOGY == "FMESH") ? Pw : ELw;
625
 
626
    wire [PLw-1 : 0] endp_p_in;
627
    generate
628
    if(TOPOLOGY == "FMESH") begin : fmesh
629
        fmesh_endp_addr_decode #(
630
            .T1(T1),
631
            .T2(T2),
632
            .T3(T3),
633
            .EAw(EAw)
634
        )
635
        endp_addr_decode
636
        (
637
            .e_addr(hdr_flit.dest_e_addr),
638
            .ex(),
639
            .ey(),
640
            .ep(endp_p_in),
641
            .valid()
642
        );
643
    end else begin : mesh
644
        mesh_tori_endp_addr_decode #(
645
            .TOPOLOGY("MESH"),
646
            .T1(T1),
647
            .T2(T2),
648
            .T3(T3),
649
            .EAw(EAw)
650
        )
651
        endp_addr_decode
652
        (
653
            .e_addr(hdr_flit.dest_e_addr),
654
            .ex( ),
655
            .ey( ),
656
            .el(endp_p_in),
657
            .valid( )
658
        );
659
 
660
    end
661
    endgenerate
662
    destp_generator #(
663
            .TOPOLOGY(TOPOLOGY),
664
            .ROUTE_NAME(ROUTE_NAME),
665
            .ROUTE_TYPE(ROUTE_TYPE),
666
            .T1(T1),
667
            .NL(T3),
668
            .P(MAX_P),
669
            .PLw(PLw),
670
            .DSTPw(DSTPw),
671
            .SELF_LOOP_EN (SELF_LOOP_EN),
672
            .SW_LOC(PORT_NUM)
673
        )
674
        decoder
675
        (
676
            .destport_one_hot (destport_one_hot),
677
            .dest_port_encoded(dstp_encoded),
678
            .dest_port_out(),
679
            .endp_localp_num(endp_p_in),
680
            .swap_port_presel(),
681
            .port_pre_sel(),
682
            .odd_column(1'b0)
683
        );
684
 
685
 
686
 
687
    assign header_flit [ `MSG_DST_CHIPID] = dest_chipid;
688
    assign header_flit [ `MSG_DST_X]      = dest_x;
689
    assign header_flit [ `MSG_DST_Y]      = dest_y;
690
    assign header_flit [ `MSG_DST_FBITS]  = dest_fbits;
691
    assign header_flit [ `MSG_LENGTH ]    = length;
692
    assign header_flit [ `MSG_TYPE ]      = msg_type;
693
    assign header_flit [ `MSG_MSHRID ]    = mshrid;
694
    assign header_flit [ `MSG_OPTIONS_1]  = option1;
695
 
696
    generate
697
    if(Fpay > 64) begin :R_
698
        assign  header_flit [Fpay - 1 : 65] =  head_dat[Fpay + `HEAD_DATw -65 :`HEAD_DATw];
699
    end
700
    endgenerate
701
 
702
 
703
    wire head = chan_in.flit_chanel.flit.hdr_flag;
704
    wire tail = chan_in.flit_chanel.flit.tail_flag;
705
 
706
    assign validOut = chan_in.flit_chanel.flit_wr;
707
    assign yummyOut = chan_in.flit_chanel.credit;
708
    assign dataOut  = (head)? header_flit[Fpay-1 : 0] : chan_in.flit_chanel.flit.payload;
709
 
710
 
711
endmodule
712
 
713
 
714
/*********************
715
 *   pack noc_top ports
716
 *
717
 * ******************/
718
 
719
 
720
 
721
 
722
module  noc_top_packed #(
723
        parameter NOC_ID=0
724
)
725
(
726
    reset,
727
    clk,
728
    chan_in_all,
729
    chan_out_all
730
);
731
 
732
    `NOC_CONF
733
 
734
    input   clk,reset;
735
    //local ports
736
    input   smartflit_chanel_t [NE-1 : 0] chan_in_all  ;
737
    output  smartflit_chanel_t [NE-1 : 0] chan_out_all ;
738
 
739
    smartflit_chanel_t chan_in_all_unpacked  [NE-1 : 0];
740
    smartflit_chanel_t chan_out_all_unpacked [NE-1 : 0];
741
 
742
 
743
    genvar i;
744
 
745
    generate
746
    for (i=0;i
747
        assign chan_in_all_unpacked[i]=chan_in_all[i];
748
        assign chan_out_all[i] = chan_out_all_unpacked[i];
749
    end//for
750
    endgenerate
751
 
752
 
753
    noc_top #(
754
                .NOC_ID(NOC_ID)
755
                )unpacked (
756
        .reset(reset),
757
        .clk(clk),
758
        .chan_in_all(chan_in_all_unpacked),
759
        .chan_out_all(chan_out_all_unpacked)
760
    );
761
 
762
    //synthesis translate_off
763
    initial begin
764
        display_noc_parameters();
765
    end
766
    //synthesis translate_on
767
 
768
 
769
 
770
 
771
endmodule
772
 
773
 
774
module ground_pronoc_end_port
775
    #(
776
        parameter TILE_NUM=0,
777
        parameter NOC_ID=0
778
    )(
779
        clk,
780
        reset,
781
        chan_in,
782
        chan_out
783
    );
784
 
785
    `NOC_CONF
786
 
787
    input  reset,clk;
788
    input   smartflit_chanel_t chan_in;
789
    output  smartflit_chanel_t    chan_out;
790
 
791
    assign chan_out = {SMARTFLIT_CHANEL_w{1'b0}};
792
    //synthesis translate_off
793
    always @(posedge clk) begin
794
        if(chan_in.flit_chanel.flit_wr) begin
795
            $display("%t: ERROR: a flit has been recived in grounded NoC %d port %d:flit:%h",$time,NOC_ID,TILE_NUM,chan_in.flit_chanel.flit);
796
            $finish;
797
        end
798
    end
799
    //synthesis translate_on
800
 
801
endmodule
802
 
803
 
804
 
805
 
806
module pronoc_noc
807
    #(
808
    parameter NOC_ID=0,
809
    parameter CHIP_SET_PORT=3,
810
    parameter FLATID_WIDTH=8
811
    )(
812
        dataIn_flatten,
813
        validIn,
814
        yummyIn,
815
 
816
        dataOut_flatten,
817
        validOut,
818
        yummyOut,
819
 
820
        default_chipid,
821
        default_coreid_x_flatten,
822
        default_coreid_y_flatten,
823
        flat_tileid_flatten,
824
 
825
        reset,
826
        clk
827
 
828
    );
829
 
830
    `NOC_CONF
831
 
832
    input clk,reset;
833
    input [Fpay*NE-1:0] dataIn_flatten;
834
    input [NE-1 : 0] validIn;
835
    input [NE-1 : 0] yummyIn;
836
 
837
    output [Fpay*NE-1:0] dataOut_flatten;
838
    output [NE-1 : 0] validOut;
839
    output [NE-1 : 0] yummyOut;
840
 
841
    input  [`NOC_CHIPID_WIDTH-1:0]  default_chipid;
842
    input  [`NOC_X_WIDTH*NE-1:0]    default_coreid_x_flatten;
843
    input  [`NOC_Y_WIDTH*NE-1:0]    default_coreid_y_flatten;
844
    input  [FLATID_WIDTH*NE-1:0]    flat_tileid_flatten;
845
 
846
 
847
    wire [Fpay-1:0] dataIn [NE-1 : 0];
848
    wire [Fpay-1:0] dataOut [NE-1 : 0];
849
    wire [`NOC_X_WIDTH-1:0]  default_coreid_x[NE-1 : 0];
850
    wire [`NOC_Y_WIDTH-1:0]  default_coreid_y[NE-1 : 0];
851
    wire [FLATID_WIDTH-1:0]  flat_tileid[NE-1 : 0];
852
 
853
    smartflit_chanel_t pronoc_chan_in  [NE-1 : 0];
854
    smartflit_chanel_t pronoc_chan_out [NE-1 : 0];
855
    wire [RAw-1 : 0] current_r_addr  [NE-1 : 0];
856
 
857
    genvar i;
858
 
859
 
860
    generate
861
    for (i=0;i
862
 
863
        assign dataIn [i] = dataIn_flatten [(i+1)* Fpay -1 :  i * Fpay];
864
        assign dataOut_flatten [(i+1)* Fpay -1 :  i * Fpay] = dataOut [i];
865
        assign default_coreid_x[i]=default_coreid_x_flatten[(i+1)*`NOC_X_WIDTH-1 : i*`NOC_X_WIDTH];
866
        assign default_coreid_y[i]=default_coreid_y_flatten[(i+1)*`NOC_Y_WIDTH-1 : i*`NOC_Y_WIDTH];
867
        assign flat_tileid[i]=flat_tileid_flatten[(i+1)*FLATID_WIDTH-1 : i*FLATID_WIDTH];
868
 
869
        pronoc_to_piton_wrapper
870
        #(
871
            .NOC_ID(NOC_ID),
872
            .PORT_NUM(0),
873
            .TILE_NUM(i),
874
            .FLATID_WIDTH(FLATID_WIDTH)
875
        )pr2pi
876
        (
877
            .default_chipid(default_chipid),
878
            .default_coreid_x(default_coreid_x[i]),
879
            .default_coreid_y(default_coreid_y[i]),
880
            .flat_tileid(flat_tileid[i]),
881
            .reset(reset),
882
            .clk(clk),
883
            .dataOut(dataOut[i]),
884
            .validOut(validOut[i]),
885
            .yummyOut(yummyOut[i]),
886
            .current_r_addr_o(current_r_addr[i]),
887
            .chan_in(pronoc_chan_out[i])
888
        );
889
 
890
        piton_to_pronoc_wrapper
891
        #(
892
            .NOC_ID(NOC_ID),
893
            .TILE_NUM(i),
894
            .CHIP_SET_PORT(CHIP_SET_PORT),
895
            .FLATID_WIDTH(FLATID_WIDTH)
896
        )pi2pr
897
        (
898
            .default_chipid (default_chipid),
899
            .default_coreid_x(default_coreid_x[i]),
900
            .default_coreid_y(default_coreid_y[i]),
901
            .flat_tileid(flat_tileid[i]),
902
            .reset(reset),
903
            .clk(clk),
904
            .dataIn(dataIn[i]),
905
            .validIn(validIn[i]),
906
            .yummyIn(yummyIn[i]),
907
            .current_r_addr_i(current_r_addr[i]),
908
            .chan_out(pronoc_chan_in[i])
909
        );
910
 
911
 
912
 
913
 
914
    end//for
915
    endgenerate
916
 
917
 
918
    noc_top #(
919
                .NOC_ID(NOC_ID)
920
                )noc (
921
        .reset(reset),
922
        .clk(clk),
923
        .chan_in_all (pronoc_chan_in ),
924
        .chan_out_all(pronoc_chan_out),
925
        .router_event()
926
    );
927
 
928
 
929
 
930
endmodule
931
 

powered by: WebSVN 2.1.0

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