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_synfull/] [synfull_top.sv] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 54 alirezamon
// synthesis translate_off
2 56 alirezamon
`include "pronoc_def.v"
3 54 alirezamon
 
4
 
5
module synfull_top;
6 56 alirezamon
    parameter NOC_ID=0;
7
    `NOC_CONF
8 54 alirezamon
    import dpi_int_pkg::*;
9
 
10
    reg     reset ,clk;
11
    reg print_router_st;
12
 
13
    initial begin
14
        clk = 1'b0;
15
        forever clk = #10 ~clk;
16
    end
17
 
18
 
19
    smartflit_chanel_t chan_in_all  [NE-1 : 0];
20
    smartflit_chanel_t chan_out_all [NE-1 : 0];
21
    router_event_t router_event [NR-1 : 0] [MAX_P-1 : 0];
22
 
23
    pck_injct_t pck_injct_in [NE-1 : 0];
24
    pck_injct_t _pck_injct_in [NE-1 : 0];
25
    pck_injct_t pck_injct_out[NE-1 : 0];
26
 
27
    logic [NE-1 : 0] NE_ready_all    ;
28
    logic [NE-1 : 0] init_socket     ;
29
    logic [NE-1 : 0] wakeup_synfull  ;
30
    logic [NE-1 : 0] end_injection   ;
31
    logic            end_synfull     ;
32
 
33
    req_t     [NE-1 : 0] synfull_pronoc_req_all  ;
34
    deliver_t [NE-1 : 0] pronoc_synfull_del_all  ;
35
 
36 56 alirezamon
    noc_top #(
37
                .NOC_ID(NOC_ID)
38
        ) the_noc (
39 54 alirezamon
        .reset(reset),
40
        .clk(clk),
41
        .chan_in_all(chan_in_all),
42
        .chan_out_all(chan_out_all),
43
        .router_event(router_event)
44
    );
45
 
46
 
47
    top_dpi_interface synfull (
48
        .clk_i(clk), .rst_i(reset),
49
        .init_i                     (init_socket[0]         ),
50
        .startCom_i                 (wakeup_synfull[0]      ),
51
        .pronoc_synfull_del_all_i   (pronoc_synfull_del_all ),
52
        .synfull_pronoc_req_all_o   (synfull_pronoc_req_all ),
53
        .NE_ready_all_i             (NE_ready_all           ),
54
        .endCom_o                   (end_injection[0]       )
55
    );
56
 
57
 
58
    reg [NEw-1 : 0] dest_id [NE-1 : 0];
59
    wire [NEw-1: 0] current_e_addr [NE-1 : 0];
60
 
61
    reg [63 : 0]  total_sent_pck_count;
62
    reg [63 : 0]  total_sent_flit_count;
63
    reg [63 : 0]  total_rsv_pck_count;
64
    reg [63 : 0]  total_rsv_flit_count;
65
    reg [63 : 0]  total_queued_pck_count;
66
    reg [63 : 0]  clk_count;
67
 
68
 
69
 
70
    initial begin
71
 
72
                //print_parameter
73
        display_noc_parameters();
74
                $display ("Simulation parameters-------------");
75
                if(DEBUG_EN)
76
                        $display ("\tDebuging is enabled");
77
                else
78
                        $display ("\tDebuging is disabled");
79
 
80
 
81
 
82
        end//initial
83
 
84
 
85
 
86
        wire [31:0] fifo_id [NE-1 : 0];
87
        wire [PCK_SIZw-1 : 0]  fifo_size [NE-1 :0];
88
    wire [NEw-1 : 0] fifo_dest [NE-1 : 0];
89
    wire [NE-1 : 0] fifo_wr,fifo_rd ,fifo_full,fifo_not_empty;
90
 
91
    genvar i;
92
    generate
93
    for(i=0; i< NE; i=i+1) begin
94
 
95
        assign fifo_wr[i] =
96
                (pck_injct_out[i].ready == 1'b0 &&  synfull_pronoc_req_all[i].valid==1'b1) ||
97
                (fifo_not_empty[i]==1'b1  &&  synfull_pronoc_req_all[i].valid==1'b1);
98
 
99
 
100
        assign fifo_rd[i] =
101
                (pck_injct_out[i].ready == 1'b1 && fifo_not_empty[i]==1'b1 );
102
 
103
 
104
            fwft_fifo_bram #(
105
                        .DATA_WIDTH(32+PCK_SIZw+NEw),
106
                        .MAX_DEPTH(1000000),
107
                        .IGNORE_SAME_LOC_RD_WR_WARNING("NO")
108
                )
109
                fifo
110
                (
111
                        .din({synfull_pronoc_req_all[i].id,synfull_pronoc_req_all[i].size,synfull_pronoc_req_all[i].dest}),     // Data in
112
                        .wr_en(fifo_wr[i]),   // Write enable
113
                        .rd_en(fifo_rd[i]),   // Read the next word
114
                        .dout({fifo_id[i],fifo_size[i],fifo_dest[i]}),    // Data out
115
                        .full( fifo_full[i]),
116
                        .nearly_full(),
117
                        .recieve_more_than_0(fifo_not_empty[i]),
118
                        .recieve_more_than_1(),
119
                        .reset(reset),
120
                        .clk (clk)
121
 
122
                );
123
 
124
 
125
 
126
 
127
 
128
        //from synfull
129
        assign pck_injct_in[i].data = (fifo_not_empty[i])?  fifo_id[i] : synfull_pronoc_req_all[i].id;
130
        assign pck_injct_in[i].size = (fifo_not_empty[i])?  fifo_size[i] : synfull_pronoc_req_all[i].size;
131
        assign pck_injct_in[i].pck_wr =  (fifo_not_empty[i])?   fifo_rd[i] :  (  synfull_pronoc_req_all[i].valid & pck_injct_out[i].ready == 1'b1);
132
        assign pck_injct_in[i].ready = 1'b1;
133
        assign dest_id[i] =(fifo_not_empty[i])? fifo_dest[i] : synfull_pronoc_req_all[i].dest;
134
 
135
        //to synfull
136
        assign pronoc_synfull_del_all[i].id    = pck_injct_out[i].data   ;
137
        assign pronoc_synfull_del_all[i].valid = pck_injct_out[i].pck_wr ;
138
        assign NE_ready_all[i] = 1'b1 ; //pck_injct_out[i].ready;
139
 
140
        assign pck_injct_in[i].class_num = _pck_injct_in[i].class_num;
141
        assign pck_injct_in[i].init_weight = _pck_injct_in[i].init_weight;
142
        assign pck_injct_in[i].vc = _pck_injct_in[i].vc;
143
 
144
 
145
        endp_addr_encoder #( .TOPOLOGY(TOPOLOGY), .T1(T1), .T2(T2), .T3(T3), .EAw(EAw),  .NE(NE)) encode1 ( .id(i[NEw-1 :0]), .code(current_e_addr[i]));
146
 
147 56 alirezamon
        packet_injector #(
148
                        .NOC_ID(NOC_ID)
149
                ) pck_inj(
150 54 alirezamon
            //general
151
            .current_e_addr(current_e_addr[i]),
152
            .reset(reset),
153
            .clk(clk),
154
            //noc port
155
            .chan_in(chan_out_all[i]),
156
            .chan_out(chan_in_all[i]),
157
            //control interafce
158
            .pck_injct_in(pck_injct_in[i]),
159
            .pck_injct_out(pck_injct_out[i])
160
        );
161
 
162
 
163
        endp_addr_encoder #( .TOPOLOGY(TOPOLOGY), .T1(T1), .T2(T2), .T3(T3), .EAw(EAw),  .NE(NE)) encode2 ( .id(dest_id[i]), .code(pck_injct_in[i].endp_addr));
164
 
165
 
166
       reg [31:0]k;
167
 
168
 
169
 
170
 
171
        initial begin
172 56 alirezamon
`ifdef ACTIVE_LOW_RESET_MODE
173
        reset = 1'b0;
174
 `else
175
        reset = 1'b1;
176
`endif
177 54 alirezamon
            k=0;
178
            init_socket[i] = 1'b0;
179
            wakeup_synfull[i] = 1'b0;
180
            print_router_st=1'b0;
181
 
182
            @(posedge clk) #1;
183
            _pck_injct_in[i].class_num=0;
184
            _pck_injct_in[i].init_weight=1;
185
            _pck_injct_in[i].vc=1;
186
            #100
187
            @(posedge clk) #1;
188 56 alirezamon
            reset=~reset;
189 54 alirezamon
            #100
190
            init_socket[i] = 1'b1;
191
            @(posedge clk) #1;
192
            init_socket[i] = 1'b0;
193
            #100
194
            wakeup_synfull[i] = 1'b1;
195
            @(posedge clk) #1;
196
            while (!end_injection[0]) @(posedge clk) #1;
197
            // if(i==0) $display ( "All packet are sent. We wait for NoC to be ideal now");
198
            // while (total_sent_pck_count != total_rsv_pck_count) @(posedge clk) #1;
199
            print_router_st=1;
200
            #1
201
            $display ( "Statistics:");
202
            $display ( "\t simulation clk count = %d",   clk_count);
203
            $display ( "\t Total queued packets = %d",total_queued_pck_count);
204
            $display ( "\t Total sent packets = %d", total_sent_pck_count);
205
                        $display ( "\t Total sent flits = %d",   total_sent_flit_count);
206
                        $display ( "\t Total received packets = %d", total_rsv_pck_count);
207
                        $display ( "\t Total received flits = %d",       total_rsv_flit_count);
208
 
209
 
210
            $finish;
211
        end
212
 
213
        always @(posedge clk) begin
214
                        if(pck_injct_out[i].pck_wr) begin
215
                                $display ("%t:pck_inj(%d) got a packet: source=%d, size=%d, data=%h",$time,i,
216
                                pck_injct_out[i].endp_addr,pck_injct_out[i].size,pck_injct_out[i].data);
217
 
218
                        end
219
        end
220
 
221
 
222
    end//for
223
    endgenerate
224
 
225
    integer k;
226
 
227
    always @(posedge clk) begin
228 56 alirezamon
        if(`pronoc_reset) begin
229 54 alirezamon
                clk_count =0;
230
                total_sent_pck_count =0;
231
                total_sent_flit_count=0;
232
                total_rsv_pck_count  =0;
233
                total_rsv_flit_count =0;
234
                total_queued_pck_count = 0;
235
        end else begin
236
                clk_count++;
237
                for(k=0; k< NE; k=k+1) begin : endpoints
238
                        if(pck_injct_out[k].pck_wr) begin
239
                                total_rsv_pck_count++;
240
                                total_rsv_flit_count+=pck_injct_out[k].size;
241
                        end
242
                        if(pck_injct_in[k].pck_wr) begin
243
                                total_sent_pck_count++;
244
                                total_sent_flit_count+=pck_injct_in[k].size;
245
                        end
246
                        if(synfull_pronoc_req_all[k].valid) begin
247
                                total_queued_pck_count++;
248
                        end
249
                end
250
            end
251
 
252
    end
253
 
254
 
255 56 alirezamon
    routers_statistic_collector # (
256
        .NOC_ID(NOC_ID)
257
    ) router_stat (
258
        .reset(reset),
259
        .clk(clk),
260
        .router_event(router_event),
261
        .print(print_router_st)
262
    );
263 54 alirezamon
 
264
 
265
 
266
endmodule
267
// synthesis translate_on
268
 

powered by: WebSVN 2.1.0

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