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_modelsim/] [multicast_injector.sv] - Diff between revs 54 and 56

Show entire file | Details | Blame | View Log

Rev 54 Rev 56
Line 1... Line 1...
`timescale  1ns/1ps
`include "pronoc_def.v"
 
 
/****************************
/****************************
 * This module can inject and eject packets from the NoC.
 * This module can inject and eject packets from the NoC.
 * It can be used in simulation for injecting real application traces to the NoC
 * It can be used in simulation for injecting real application traces to the NoC
 * *************************/
 * *************************/
 
 
 
 
module multicast_injector
module multicast_injector #(
                import pronoc_pkg::*;
        parameter NOC_ID=0
        (
)(
                //general
                //general
                current_e_addr,
                current_e_addr,
                reset,
                reset,
                clk,
                clk,
                //noc port
                //noc port
Line 18... Line 19...
                //control interafce
                //control interafce
                pck_injct_in,
                pck_injct_in,
                pck_injct_out
                pck_injct_out
        );
        );
 
 
 
        `NOC_CONF
 
 
        //general
        //general
        input reset,clk;
        input reset,clk;
        input [EAw-1 :0 ] current_e_addr;
        input [EAw-1 :0 ] current_e_addr;
 
 
        // the destination endpoint address
        // the destination endpoint address
Line 37... Line 40...
        wire  [RAw-1 :0 ] current_r_addr;
        wire  [RAw-1 :0 ] current_r_addr;
 
 
        wire  [DSTPw-1 : 0 ] destport;
        wire  [DSTPw-1 : 0 ] destport;
        reg flit_wr;
        reg flit_wr;
 
 
 
 
 
 
 
 
 
 
 
 
        assign current_r_addr = chan_in.ctrl_chanel.neighbors_r_addr;
        assign current_r_addr = chan_in.ctrl_chanel.neighbors_r_addr;
 
 
 
 
 
 
        /*
        /*
        conventional_routing #(
        conventional_routing #(
 
                .NOC_ID(NOC_ID),
                .TOPOLOGY(TOPOLOGY),
                .TOPOLOGY(TOPOLOGY),
                .ROUTE_NAME(ROUTE_NAME),
                .ROUTE_NAME(ROUTE_NAME),
                .ROUTE_TYPE(ROUTE_TYPE),
                .ROUTE_TYPE(ROUTE_TYPE),
                .T1(T1),
                .T1(T1),
                .T2(T2),
                .T2(T2),
Line 73... Line 70...
 
 
*/
*/
 
 
assign destport = 7;
assign destport = 7;
 
 
 
 
        localparam
        localparam
                HDR_BYTE_NUM =  HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
                HDR_BYTE_NUM =  HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
                HDR_DATA_w_tmp   =  HDR_BYTE_NUM * 8,
                HDR_DATA_w_tmp   =  HDR_BYTE_NUM * 8,
                HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp;
                HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp;
 
 
        wire [HDR_DATA_w-1 : 0] hdr_data_in = pck_injct_in.data [HDR_DATA_w-1 : 0];
        wire [HDR_DATA_w-1 : 0] hdr_data_in = pck_injct_in.data [HDR_DATA_w-1 : 0];
        wire [Fw-1 : 0] hdr_flit_out;
        wire [Fw-1 : 0] hdr_flit_out;
 
 
        header_flit_generator #(
        header_flit_generator #(
 
                .NOC_ID(NOC_ID),
                .DATA_w(HDR_DATA_w)
                .DATA_w(HDR_DATA_w)
        )
        ) the_header_flit_generator (
        the_header_flit_generator
 
        (
 
                .flit_out                       (hdr_flit_out),
                .flit_out                       (hdr_flit_out),
                .vc_num_in                      (pck_injct_in.vc),
                .vc_num_in                      (pck_injct_in.vc),
                .class_in                       (pck_injct_in.class_num),
                .class_in                       (pck_injct_in.class_num),
                .dest_e_addr_in         (pck_injct_in.endp_addr),
                .dest_e_addr_in         (pck_injct_in.endp_addr),
                .src_e_addr_in          (current_e_addr),
                .src_e_addr_in          (current_e_addr),
Line 198... Line 193...
                        end
                        end
                end
                end
                reg [V-1 : 0] credit_o;
                reg [V-1 : 0] credit_o;
 
 
                always @ (posedge clk) begin
                always @ (posedge clk) begin
                        if(reset) begin
                        if(`pronoc_reset) begin
                                flit_type<=HEADER;
                                flit_type<=HEADER;
                                counter<=0;
                                counter<=0;
                                counter2<=0;
                                counter2<=0;
                                credit_o<={V{1'b0}};
                                credit_o<={V{1'b0}};
                        end else begin
                        end else begin
Line 216... Line 211...
 
 
 
 
 
 
 
 
 
 
        injector_ovc_status #(
        multi_cast_injector_ovc_status #(
                .V(V),
                .V(V),
                .B(LB),
                .B(LB),
                .CRDTw(CRDTw)
                .CRDTw(CRDTw)
        )
        )
        the_ovc_status
        the_ovc_status
Line 234... Line 229...
                .clk(clk),
                .clk(clk),
                .reset(reset)
                .reset(reset)
        );
        );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
        wire [HDR_DATA_w-1 : 0] hdr_data_o;
        wire [HDR_DATA_w-1 : 0] hdr_data_o;
        hdr_flit_t hdr_flit_i;
        hdr_flit_t hdr_flit_i;
 
 
        header_flit_info
        header_flit_info
        #(
        #(
 
                .NOC_ID (NOC_ID),
                .DATA_w         (HDR_DATA_w       )
                .DATA_w         (HDR_DATA_w       )
        ) extractor (
        ) extractor (
                .flit(chan_in.flit_chanel.flit),
                .flit(chan_in.flit_chanel.flit),
                .hdr_flit(hdr_flit_i),
                .hdr_flit(hdr_flit_i),
                .data_o(hdr_data_o)
                .data_o(hdr_data_o)
Line 283... Line 274...
                        end//always
                        end//always
 
 
 
 
 
 
 
 
                        always_ff @(posedge clk or posedge reset) begin
                        always_ff @(`pronoc_clk_reset_edge) begin
                                if (reset)  begin
                                if (`pronoc_reset)  begin
                                        rsv_counter[i]<= {PCK_SIZw{1'b0}};
                                        rsv_counter[i]<= {PCK_SIZw{1'b0}};
                                        h2t_counter[i]<= 16'd0;
                                        h2t_counter[i]<= 16'd0;
                                        sender_endp_addr_reg [i]<= {EAw{1'b0}};
                                        sender_endp_addr_reg [i]<= {EAw{1'b0}};
                                end else begin
                                end else begin
                                        h2t_counter[i]<=h2t_counter_next[i];
                                        h2t_counter[i]<=h2t_counter_next[i];
Line 311... Line 302...
 
 
 
 
 
 
                        for (k=0;k< REMAIN_DAT_FLIT+1;k++)begin : K_
                        for (k=0;k< REMAIN_DAT_FLIT+1;k++)begin : K_
 
 
                                always_ff @(posedge clk or posedge reset) begin
                                always_ff @(`pronoc_clk_reset_edge) begin
                                        if (reset)  begin
                                        if (`pronoc_reset)  begin
                                                pck_data_o_gen [i][k] <= {Fpay{1'b0}};
                                                pck_data_o_gen [i][k] <= {Fpay{1'b0}};
 
 
                                        end else begin
                                        end else begin
                                                if(chan_in.flit_chanel.flit.vc[i] & chan_in.flit_chanel.flit_wr ) begin
                                                if(chan_in.flit_chanel.flit.vc[i] & chan_in.flit_chanel.flit_wr ) begin
                                                        if (chan_in.flit_chanel.flit.hdr_flag )begin
                                                        if (chan_in.flit_chanel.flit.hdr_flag )begin
Line 460... Line 451...
 
 
/******************
/******************
 *   ovc_status
 *   ovc_status
 *******************/
 *******************/
 
 
module injector_ovc_status #(
module multi_cast_injector_ovc_status #(
                parameter V     =   4,
                parameter V     =   4,
                parameter B =   16,
                parameter B =   16,
                parameter CRDTw =4
                parameter CRDTw =4
                )
                )
                (
                (
Line 498... Line 489...
 
 
 
 
        genvar i;
        genvar i;
        generate
        generate
                for(i=0;i
                for(i=0;i
                        `ifdef SYNC_RESET_MODE
        always @ (`pronoc_clk_reset_edge)begin
                                always @ (posedge clk )begin
            if(`pronoc_reset)begin
                                `else
 
                                        always @ (posedge clk or posedge reset)begin
 
                                        `endif
 
                                        if(reset)begin
 
                                                credit[i]<= credit_init_val_in[i][DEPTH_WIDTH-1:0];
                                                credit[i]<= credit_init_val_in[i][DEPTH_WIDTH-1:0];
                                        end else begin
                                        end else begin
                                                if(  wr_in[i]  && ~credit_in[i])   credit[i] <= credit[i]-1'b1;
                                                if(  wr_in[i]  && ~credit_in[i])   credit[i] <= credit[i]-1'b1;
                                                if( ~wr_in[i]  &&  credit_in[i])   credit[i] <= credit[i]+1'b1;
                                                if( ~wr_in[i]  &&  credit_in[i])   credit[i] <= credit[i]+1'b1;
                                        end //reset
                                        end //reset
Line 517... Line 504...
                                assign  nearly_full_vc[i]=  (credit[i] == 1) |  full_vc[i];
                                assign  nearly_full_vc[i]=  (credit[i] == 1) |  full_vc[i];
                                assign  empty_vc[i]  = (credit[i] == credit_init_val_in[i][DEPTH_WIDTH-1:0]);
                                assign  empty_vc[i]  = (credit[i] == credit_init_val_in[i][DEPTH_WIDTH-1:0]);
                        end//for
                        end//for
                        endgenerate
                        endgenerate
endmodule
endmodule
 
 
 
 
 
 
 
 
/**************************************
 
 *
 
 *
 
 * ***********************************/
 
 
 
 
 
 
 
module packet_injector_verilator
 
import pronoc_pkg::*;
 
(
 
        //general
 
        current_e_addr,
 
        reset,
 
        clk,
 
        //noc port
 
        chan_in,
 
        chan_out,
 
        //control interafce
 
        pck_injct_in_data,
 
        pck_injct_in_size,
 
        pck_injct_in_endp_addr,
 
        pck_injct_in_class_num,
 
        pck_injct_in_init_weight,
 
        pck_injct_in_vc,
 
        pck_injct_in_pck_wr,
 
        pck_injct_in_ready,
 
 
 
        pck_injct_out_data,
 
        pck_injct_out_size,
 
        pck_injct_out_endp_addr,
 
        pck_injct_out_class_num,
 
        pck_injct_out_init_weight,
 
        pck_injct_out_vc,
 
        pck_injct_out_pck_wr,
 
        pck_injct_out_ready,
 
        pck_injct_out_distance,
 
        pck_injct_out_h2t_delay,
 
        min_pck_size
 
 
 
 
 
);
 
 
 
 
 
//general
 
input reset,clk;
 
input [EAw-1 :0 ] current_e_addr;
 
 
 
// the destination endpoint address
 
//NoC interface
 
input   smartflit_chanel_t      chan_in;
 
output  smartflit_chanel_t      chan_out;
 
//control interafce
 
 
 
 
 
 input [PCK_INJ_Dw-1 : 0] pck_injct_in_data;
 
 input [PCK_SIZw-1   : 0] pck_injct_in_size;
 
 input [EAw-1        : 0] pck_injct_in_endp_addr;
 
 input [Cw-1         : 0] pck_injct_in_class_num;
 
 input [WEIGHTw-1    : 0] pck_injct_in_init_weight;
 
 input [V-1          : 0] pck_injct_in_vc;
 
 input                    pck_injct_in_pck_wr;
 
 input [V-1          : 0] pck_injct_in_ready;
 
 
 
 output [PCK_INJ_Dw-1 : 0] pck_injct_out_data;
 
 output [PCK_SIZw-1   : 0] pck_injct_out_size;
 
 output [EAw-1        : 0] pck_injct_out_endp_addr;
 
 output [Cw-1         : 0] pck_injct_out_class_num;
 
 output [WEIGHTw-1    : 0] pck_injct_out_init_weight;
 
 output [V-1          : 0] pck_injct_out_vc;
 
 output                    pck_injct_out_pck_wr;
 
 output [V-1          : 0] pck_injct_out_ready;
 
 output [DISTw-1          : 0] pck_injct_out_distance;
 
 output [15                       : 0] pck_injct_out_h2t_delay;
 
 output [4                        : 0] min_pck_size;
 
 
 
 pck_injct_t pck_injct_in;
 
 pck_injct_t pck_injct_out;
 
 
 
 assign pck_injct_in.data         = pck_injct_in_data;
 
 assign pck_injct_in.size         = pck_injct_in_size;
 
 assign pck_injct_in.endp_addr    = pck_injct_in_endp_addr;
 
 assign pck_injct_in.class_num    = pck_injct_in_class_num;
 
 assign pck_injct_in.init_weight  = pck_injct_in_init_weight;
 
 assign pck_injct_in.vc           = pck_injct_in_vc;
 
 assign pck_injct_in.pck_wr       = pck_injct_in_pck_wr;
 
 assign pck_injct_in.ready        = pck_injct_in_ready;
 
 
 
 assign pck_injct_out_data        = pck_injct_out.data;
 
 assign pck_injct_out_size        = pck_injct_out.size;
 
 assign pck_injct_out_endp_addr   = pck_injct_out.endp_addr;
 
 assign pck_injct_out_class_num   = pck_injct_out.class_num;
 
 assign pck_injct_out_init_weight = pck_injct_out.init_weight;
 
 assign pck_injct_out_vc          = pck_injct_out.vc;
 
 assign pck_injct_out_pck_wr      = pck_injct_out.pck_wr;
 
 assign pck_injct_out_ready       = pck_injct_out.ready;
 
 assign pck_injct_out_distance    = pck_injct_out.distance;
 
 assign pck_injct_out_h2t_delay   = pck_injct_out.h2t_delay;
 
 
 
 packet_injector injector (
 
        .current_e_addr  (current_e_addr ),
 
        .reset           (reset          ),
 
        .clk             (clk            ),
 
        .chan_in         (chan_in        ),
 
        .chan_out        (chan_out       ),
 
        .pck_injct_in    (pck_injct_in   ),
 
        .pck_injct_out   (pck_injct_out  ));
 
 
 
 
 
 localparam
 
        HDR_BYTE_NUM =  HDR_MAX_DATw / 8, // = HDR_MAX_DATw / (8 - HDR_MAX_DATw %8)
 
        HDR_DATA_w_tmp   =  HDR_BYTE_NUM * 8,
 
        HDR_DATA_w = (PCK_INJ_Dw < HDR_DATA_w_tmp)? PCK_INJ_Dw : HDR_DATA_w_tmp,
 
        REMAIN_DATw =  PCK_INJ_Dw - HDR_DATA_w,
 
        REMAIN_DAT_FLIT_I = (REMAIN_DATw / Fpay),
 
        REMAIN_DAT_FLIT_F = (REMAIN_DATw % Fpay == 0)? 0 : 1,
 
        REMAIN_DAT_FLIT   = REMAIN_DAT_FLIT_I + REMAIN_DAT_FLIT_F,
 
        CNTw = log2(REMAIN_DAT_FLIT),
 
        MIN_PCK_SIZ = REMAIN_DAT_FLIT +1;
 
 
 
 assign  min_pck_size = MIN_PCK_SIZ[4:0];
 
 
 
 
 
// `ifdef VERILATOR
 
//      logic  endp_is_active   /*verilator public_flat_rd*/ ;
 
//
 
//      always @ (*) begin
 
//              endp_is_active  = 1'b0;
 
//              if (chan_out.flit_chanel.flit_wr) endp_is_active=1'b1;
 
//              if (chan_out.flit_chanel.credit > {V{1'b0}} ) endp_is_active=1'b1;
 
//              if (chan_out.smart_chanel.requests > {SMART_NUM{1'b0}} ) endp_is_active=1'b1;
 
//      end
 
// `endif
 
 
 
 
 
endmodule
 

powered by: WebSVN 2.1.0

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