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] - Diff between revs 54 and 56

Only display areas with differences | Details | Blame | View Log

Rev 54 Rev 56
// synthesis translate_off
// synthesis translate_off
`timescale   1ns/1ns
`include "pronoc_def.v"
 
 
module synfull_top;
module synfull_top;
 
    parameter NOC_ID=0;
    import pronoc_pkg::*;
    `NOC_CONF
    import dpi_int_pkg::*;
    import dpi_int_pkg::*;
    reg     reset ,clk;
    reg     reset ,clk;
    reg print_router_st;
    reg print_router_st;
    initial begin
    initial begin
        clk = 1'b0;
        clk = 1'b0;
        forever clk = #10 ~clk;
        forever clk = #10 ~clk;
    end
    end
    smartflit_chanel_t chan_in_all  [NE-1 : 0];
    smartflit_chanel_t chan_in_all  [NE-1 : 0];
    smartflit_chanel_t chan_out_all [NE-1 : 0];
    smartflit_chanel_t chan_out_all [NE-1 : 0];
    router_event_t router_event [NR-1 : 0] [MAX_P-1 : 0];
    router_event_t router_event [NR-1 : 0] [MAX_P-1 : 0];
    pck_injct_t pck_injct_in [NE-1 : 0];
    pck_injct_t pck_injct_in [NE-1 : 0];
    pck_injct_t _pck_injct_in [NE-1 : 0];
    pck_injct_t _pck_injct_in [NE-1 : 0];
    pck_injct_t pck_injct_out[NE-1 : 0];
    pck_injct_t pck_injct_out[NE-1 : 0];
    logic [NE-1 : 0] NE_ready_all    ;
    logic [NE-1 : 0] NE_ready_all    ;
    logic [NE-1 : 0] init_socket     ;
    logic [NE-1 : 0] init_socket     ;
    logic [NE-1 : 0] wakeup_synfull  ;
    logic [NE-1 : 0] wakeup_synfull  ;
    logic [NE-1 : 0] end_injection   ;
    logic [NE-1 : 0] end_injection   ;
    logic            end_synfull     ;
    logic            end_synfull     ;
    req_t     [NE-1 : 0] synfull_pronoc_req_all  ;
    req_t     [NE-1 : 0] synfull_pronoc_req_all  ;
    deliver_t [NE-1 : 0] pronoc_synfull_del_all  ;
    deliver_t [NE-1 : 0] pronoc_synfull_del_all  ;
 
 
    noc_top     the_noc
    noc_top #(
    (
                .NOC_ID(NOC_ID)
 
        ) the_noc (
        .reset(reset),
        .reset(reset),
        .clk(clk),
        .clk(clk),
        .chan_in_all(chan_in_all),
        .chan_in_all(chan_in_all),
        .chan_out_all(chan_out_all),
        .chan_out_all(chan_out_all),
        .router_event(router_event)
        .router_event(router_event)
    );
    );
    top_dpi_interface synfull (
    top_dpi_interface synfull (
        .clk_i(clk), .rst_i(reset),
        .clk_i(clk), .rst_i(reset),
        .init_i                     (init_socket[0]         ),
        .init_i                     (init_socket[0]         ),
        .startCom_i                 (wakeup_synfull[0]      ),
        .startCom_i                 (wakeup_synfull[0]      ),
        .pronoc_synfull_del_all_i   (pronoc_synfull_del_all ),
        .pronoc_synfull_del_all_i   (pronoc_synfull_del_all ),
        .synfull_pronoc_req_all_o   (synfull_pronoc_req_all ),
        .synfull_pronoc_req_all_o   (synfull_pronoc_req_all ),
        .NE_ready_all_i             (NE_ready_all           ),
        .NE_ready_all_i             (NE_ready_all           ),
        .endCom_o                   (end_injection[0]       )
        .endCom_o                   (end_injection[0]       )
    );
    );
    reg [NEw-1 : 0] dest_id [NE-1 : 0];
    reg [NEw-1 : 0] dest_id [NE-1 : 0];
    wire [NEw-1: 0] current_e_addr [NE-1 : 0];
    wire [NEw-1: 0] current_e_addr [NE-1 : 0];
    reg [63 : 0]  total_sent_pck_count;
    reg [63 : 0]  total_sent_pck_count;
    reg [63 : 0]  total_sent_flit_count;
    reg [63 : 0]  total_sent_flit_count;
    reg [63 : 0]  total_rsv_pck_count;
    reg [63 : 0]  total_rsv_pck_count;
    reg [63 : 0]  total_rsv_flit_count;
    reg [63 : 0]  total_rsv_flit_count;
    reg [63 : 0]  total_queued_pck_count;
    reg [63 : 0]  total_queued_pck_count;
    reg [63 : 0]  clk_count;
    reg [63 : 0]  clk_count;
    initial begin
    initial begin
                //print_parameter
                //print_parameter
        display_noc_parameters();
        display_noc_parameters();
                $display ("Simulation parameters-------------");
                $display ("Simulation parameters-------------");
                if(DEBUG_EN)
                if(DEBUG_EN)
                        $display ("\tDebuging is enabled");
                        $display ("\tDebuging is enabled");
                else
                else
                        $display ("\tDebuging is disabled");
                        $display ("\tDebuging is disabled");
        end//initial
        end//initial
        wire [31:0] fifo_id [NE-1 : 0];
        wire [31:0] fifo_id [NE-1 : 0];
        wire [PCK_SIZw-1 : 0]  fifo_size [NE-1 :0];
        wire [PCK_SIZw-1 : 0]  fifo_size [NE-1 :0];
    wire [NEw-1 : 0] fifo_dest [NE-1 : 0];
    wire [NEw-1 : 0] fifo_dest [NE-1 : 0];
    wire [NE-1 : 0] fifo_wr,fifo_rd ,fifo_full,fifo_not_empty;
    wire [NE-1 : 0] fifo_wr,fifo_rd ,fifo_full,fifo_not_empty;
    genvar i;
    genvar i;
    generate
    generate
    for(i=0; i< NE; i=i+1) begin
    for(i=0; i< NE; i=i+1) begin
        assign fifo_wr[i] =
        assign fifo_wr[i] =
                (pck_injct_out[i].ready == 1'b0 &&  synfull_pronoc_req_all[i].valid==1'b1) ||
                (pck_injct_out[i].ready == 1'b0 &&  synfull_pronoc_req_all[i].valid==1'b1) ||
                (fifo_not_empty[i]==1'b1  &&  synfull_pronoc_req_all[i].valid==1'b1);
                (fifo_not_empty[i]==1'b1  &&  synfull_pronoc_req_all[i].valid==1'b1);
        assign fifo_rd[i] =
        assign fifo_rd[i] =
                (pck_injct_out[i].ready == 1'b1 && fifo_not_empty[i]==1'b1 );
                (pck_injct_out[i].ready == 1'b1 && fifo_not_empty[i]==1'b1 );
            fwft_fifo_bram #(
            fwft_fifo_bram #(
                        .DATA_WIDTH(32+PCK_SIZw+NEw),
                        .DATA_WIDTH(32+PCK_SIZw+NEw),
                        .MAX_DEPTH(1000000),
                        .MAX_DEPTH(1000000),
                        .IGNORE_SAME_LOC_RD_WR_WARNING("NO")
                        .IGNORE_SAME_LOC_RD_WR_WARNING("NO")
                )
                )
                fifo
                fifo
                (
                (
                        .din({synfull_pronoc_req_all[i].id,synfull_pronoc_req_all[i].size,synfull_pronoc_req_all[i].dest}),     // Data in
                        .din({synfull_pronoc_req_all[i].id,synfull_pronoc_req_all[i].size,synfull_pronoc_req_all[i].dest}),     // Data in
                        .wr_en(fifo_wr[i]),   // Write enable
                        .wr_en(fifo_wr[i]),   // Write enable
                        .rd_en(fifo_rd[i]),   // Read the next word
                        .rd_en(fifo_rd[i]),   // Read the next word
                        .dout({fifo_id[i],fifo_size[i],fifo_dest[i]}),    // Data out
                        .dout({fifo_id[i],fifo_size[i],fifo_dest[i]}),    // Data out
                        .full( fifo_full[i]),
                        .full( fifo_full[i]),
                        .nearly_full(),
                        .nearly_full(),
                        .recieve_more_than_0(fifo_not_empty[i]),
                        .recieve_more_than_0(fifo_not_empty[i]),
                        .recieve_more_than_1(),
                        .recieve_more_than_1(),
                        .reset(reset),
                        .reset(reset),
                        .clk (clk)
                        .clk (clk)
                );
                );
        //from synfull
        //from synfull
        assign pck_injct_in[i].data = (fifo_not_empty[i])?  fifo_id[i] : synfull_pronoc_req_all[i].id;
        assign pck_injct_in[i].data = (fifo_not_empty[i])?  fifo_id[i] : synfull_pronoc_req_all[i].id;
        assign pck_injct_in[i].size = (fifo_not_empty[i])?  fifo_size[i] : synfull_pronoc_req_all[i].size;
        assign pck_injct_in[i].size = (fifo_not_empty[i])?  fifo_size[i] : synfull_pronoc_req_all[i].size;
        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);
        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);
        assign pck_injct_in[i].ready = 1'b1;
        assign pck_injct_in[i].ready = 1'b1;
        assign dest_id[i] =(fifo_not_empty[i])? fifo_dest[i] : synfull_pronoc_req_all[i].dest;
        assign dest_id[i] =(fifo_not_empty[i])? fifo_dest[i] : synfull_pronoc_req_all[i].dest;
        //to synfull
        //to synfull
        assign pronoc_synfull_del_all[i].id    = pck_injct_out[i].data   ;
        assign pronoc_synfull_del_all[i].id    = pck_injct_out[i].data   ;
        assign pronoc_synfull_del_all[i].valid = pck_injct_out[i].pck_wr ;
        assign pronoc_synfull_del_all[i].valid = pck_injct_out[i].pck_wr ;
        assign NE_ready_all[i] = 1'b1 ; //pck_injct_out[i].ready;
        assign NE_ready_all[i] = 1'b1 ; //pck_injct_out[i].ready;
        assign pck_injct_in[i].class_num = _pck_injct_in[i].class_num;
        assign pck_injct_in[i].class_num = _pck_injct_in[i].class_num;
        assign pck_injct_in[i].init_weight = _pck_injct_in[i].init_weight;
        assign pck_injct_in[i].init_weight = _pck_injct_in[i].init_weight;
        assign pck_injct_in[i].vc = _pck_injct_in[i].vc;
        assign pck_injct_in[i].vc = _pck_injct_in[i].vc;
        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]));
        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]));
 
 
        packet_injector pck_inj(
        packet_injector #(
 
                        .NOC_ID(NOC_ID)
 
                ) pck_inj(
            //general
            //general
            .current_e_addr(current_e_addr[i]),
            .current_e_addr(current_e_addr[i]),
            .reset(reset),
            .reset(reset),
            .clk(clk),
            .clk(clk),
            //noc port
            //noc port
            .chan_in(chan_out_all[i]),
            .chan_in(chan_out_all[i]),
            .chan_out(chan_in_all[i]),
            .chan_out(chan_in_all[i]),
            //control interafce
            //control interafce
            .pck_injct_in(pck_injct_in[i]),
            .pck_injct_in(pck_injct_in[i]),
            .pck_injct_out(pck_injct_out[i])
            .pck_injct_out(pck_injct_out[i])
        );
        );
        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));
        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));
       reg [31:0]k;
       reg [31:0]k;
        initial begin
        initial begin
 
`ifdef ACTIVE_LOW_RESET_MODE
 
        reset = 1'b0;
 
 `else
            reset = 1'b1;
            reset = 1'b1;
 
`endif
            k=0;
            k=0;
            init_socket[i] = 1'b0;
            init_socket[i] = 1'b0;
            wakeup_synfull[i] = 1'b0;
            wakeup_synfull[i] = 1'b0;
            print_router_st=1'b0;
            print_router_st=1'b0;
            @(posedge clk) #1;
            @(posedge clk) #1;
            _pck_injct_in[i].class_num=0;
            _pck_injct_in[i].class_num=0;
            _pck_injct_in[i].init_weight=1;
            _pck_injct_in[i].init_weight=1;
            _pck_injct_in[i].vc=1;
            _pck_injct_in[i].vc=1;
            #100
            #100
            @(posedge clk) #1;
            @(posedge clk) #1;
            reset=1'b0;
            reset=~reset;
            #100
            #100
            init_socket[i] = 1'b1;
            init_socket[i] = 1'b1;
            @(posedge clk) #1;
            @(posedge clk) #1;
            init_socket[i] = 1'b0;
            init_socket[i] = 1'b0;
            #100
            #100
            wakeup_synfull[i] = 1'b1;
            wakeup_synfull[i] = 1'b1;
            @(posedge clk) #1;
            @(posedge clk) #1;
            while (!end_injection[0]) @(posedge clk) #1;
            while (!end_injection[0]) @(posedge clk) #1;
            // if(i==0) $display ( "All packet are sent. We wait for NoC to be ideal now");
            // if(i==0) $display ( "All packet are sent. We wait for NoC to be ideal now");
            // while (total_sent_pck_count != total_rsv_pck_count) @(posedge clk) #1;
            // while (total_sent_pck_count != total_rsv_pck_count) @(posedge clk) #1;
            print_router_st=1;
            print_router_st=1;
            #1
            #1
            $display ( "Statistics:");
            $display ( "Statistics:");
            $display ( "\t simulation clk count = %d",   clk_count);
            $display ( "\t simulation clk count = %d",   clk_count);
            $display ( "\t Total queued packets = %d",total_queued_pck_count);
            $display ( "\t Total queued packets = %d",total_queued_pck_count);
            $display ( "\t Total sent packets = %d", total_sent_pck_count);
            $display ( "\t Total sent packets = %d", total_sent_pck_count);
                        $display ( "\t Total sent flits = %d",   total_sent_flit_count);
                        $display ( "\t Total sent flits = %d",   total_sent_flit_count);
                        $display ( "\t Total received packets = %d", total_rsv_pck_count);
                        $display ( "\t Total received packets = %d", total_rsv_pck_count);
                        $display ( "\t Total received flits = %d",       total_rsv_flit_count);
                        $display ( "\t Total received flits = %d",       total_rsv_flit_count);
            $finish;
            $finish;
        end
        end
        always @(posedge clk) begin
        always @(posedge clk) begin
                        if(pck_injct_out[i].pck_wr) begin
                        if(pck_injct_out[i].pck_wr) begin
                                $display ("%t:pck_inj(%d) got a packet: source=%d, size=%d, data=%h",$time,i,
                                $display ("%t:pck_inj(%d) got a packet: source=%d, size=%d, data=%h",$time,i,
                                pck_injct_out[i].endp_addr,pck_injct_out[i].size,pck_injct_out[i].data);
                                pck_injct_out[i].endp_addr,pck_injct_out[i].size,pck_injct_out[i].data);
                        end
                        end
        end
        end
    end//for
    end//for
    endgenerate
    endgenerate
    integer k;
    integer k;
    always @(posedge clk) begin
    always @(posedge clk) begin
        if(reset) begin
        if(`pronoc_reset) begin
                clk_count =0;
                clk_count =0;
                total_sent_pck_count =0;
                total_sent_pck_count =0;
                total_sent_flit_count=0;
                total_sent_flit_count=0;
                total_rsv_pck_count  =0;
                total_rsv_pck_count  =0;
                total_rsv_flit_count =0;
                total_rsv_flit_count =0;
                total_queued_pck_count = 0;
                total_queued_pck_count = 0;
        end else begin
        end else begin
                clk_count++;
                clk_count++;
                for(k=0; k< NE; k=k+1) begin : endpoints
                for(k=0; k< NE; k=k+1) begin : endpoints
                        if(pck_injct_out[k].pck_wr) begin
                        if(pck_injct_out[k].pck_wr) begin
                                total_rsv_pck_count++;
                                total_rsv_pck_count++;
                                total_rsv_flit_count+=pck_injct_out[k].size;
                                total_rsv_flit_count+=pck_injct_out[k].size;
                        end
                        end
                        if(pck_injct_in[k].pck_wr) begin
                        if(pck_injct_in[k].pck_wr) begin
                                total_sent_pck_count++;
                                total_sent_pck_count++;
                                total_sent_flit_count+=pck_injct_in[k].size;
                                total_sent_flit_count+=pck_injct_in[k].size;
                        end
                        end
                        if(synfull_pronoc_req_all[k].valid) begin
                        if(synfull_pronoc_req_all[k].valid) begin
                                total_queued_pck_count++;
                                total_queued_pck_count++;
                        end
                        end
                end
                end
            end
            end
    end
    end
 
 
    routers_statistic_collector router_stat(
    routers_statistic_collector # (
 
        .NOC_ID(NOC_ID)
 
    ) router_stat (
                .reset(reset),
                .reset(reset),
                .clk(clk),
        .clk(clk),
                .router_event(router_event),
        .router_event(router_event),
                .print(print_router_st)
        .print(print_router_st)
        );
    );
endmodule
endmodule
// synthesis translate_on
// synthesis translate_on
 
 

powered by: WebSVN 2.1.0

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