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

Show entire file | Details | Blame | View Log

Rev 54 Rev 56
Line 26... Line 26...
 **
 **
 **************************************************************/
 **************************************************************/
 
 
 
 
module flit_buffer
module flit_buffer
                import pronoc_pkg::*;
 
        #(
        #(
                parameter B =4,
                parameter B =4,
                parameter SSA_EN="YES" // "YES" , "NO"
                parameter SSA_EN="YES", // "YES" , "NO"
 
                parameter Fw=32,
 
                parameter PCK_TYPE ="MULTI_FLIT",
 
                parameter CAST_TYPE = "UNICAST",
 
                parameter DEBUG_EN = 1,
 
                parameter V=1
                )
                )
                (
                (
                        din,     // Data in
                        din,     // Data in
                        vc_num_wr,//write virtual channel
                        vc_num_wr,//write virtual channel
                        vc_num_rd,//read virtual channel
                        vc_num_rd,//read virtual channel
Line 49... Line 53...
                        multiple_dest, // incr rd-sub
                        multiple_dest, // incr rd-sub
                        sub_rd_ptr_ld,  // load rd_ptr to sub_rd_pt
                        sub_rd_ptr_ld,  // load rd_ptr to sub_rd_pt
                        flit_is_tail
                        flit_is_tail
                );
                );
 
 
 
     function  integer log2;
 
      input integer number; begin
 
         log2=(number <=1) ? 1: 0;
 
         while(2**log2
 
            log2=log2+1;
 
         end
 
      end
 
    endfunction // log2
 
 
 
 
        localparam
        localparam
                Bw      =   (B==1)? 1 : log2(B),
                Bw      =   (B==1)? 1 : log2(B),
                BV      =   B   *   V,
                BV      =   B   *   V,
Line 716... Line 727...
                                wire    [DATA_WIDTH-1       :   0] mux_out;
                                wire    [DATA_WIDTH-1       :   0] mux_out;
                                reg     [MAX_DEPTH-2        :   0] shiftreg [DATA_WIDTH-1      :0];
                                reg     [MAX_DEPTH-2        :   0] shiftreg [DATA_WIDTH-1      :0];
 
 
                                for(i=0;i
                                for(i=0;i
                                        always @(posedge clk ) begin
                                        always @(posedge clk ) begin
                                                //if (reset) begin
                                                //if (`pronoc_reset) begin
                                                //  shiftreg[i] <= {MAX_DEPTH{1'b0}};
                                                //  shiftreg[i] <= {MAX_DEPTH{1'b0}};
                                                //end else begin
                                                //end else begin
                                                if(wr_en) shiftreg[i] <= {shiftreg[i][MAX_DEPTH-3   :   0]  ,din[i]};
                                                if(wr_en) shiftreg[i] <= {shiftreg[i][MAX_DEPTH-3   :   0]  ,din[i]};
                                                //end
                                                //end
                                        end
                                        end
Line 918... Line 929...
                                wire    [DATA_WIDTH-1       :   0] mux_out;
                                wire    [DATA_WIDTH-1       :   0] mux_out;
                                reg     [MAX_DEPTH-2        :   0] shiftreg [DATA_WIDTH-1      :0];
                                reg     [MAX_DEPTH-2        :   0] shiftreg [DATA_WIDTH-1      :0];
 
 
                                for(i=0;i
                                for(i=0;i
                                        always @(posedge clk ) begin
                                        always @(posedge clk ) begin
                                                //if (reset) begin
                                                //if (`pronoc_reset) begin
                                                //  shiftreg[i] <= {MAX_DEPTH{1'b0}};
                                                //  shiftreg[i] <= {MAX_DEPTH{1'b0}};
                                                //end else begin
                                                //end else begin
                                                if(wr_en) shiftreg[i] <= {shiftreg[i][MAX_DEPTH-3   :   0]  ,din[i]};
                                                if(wr_en) shiftreg[i] <= {shiftreg[i][MAX_DEPTH-3   :   0]  ,din[i]};
                                                //end
                                                //end
                                        end
                                        end
Line 1009... Line 1020...
        //synthesis translate_off
        //synthesis translate_off
        //synopsys  translate_off
        //synopsys  translate_off
        always @(posedge clk)
        always @(posedge clk)
 
 
        begin
        begin
                if(~reset)begin
                if(`pronoc_reset==0)begin
                        if (wr_en && ~rd_en && full) begin
                        if (wr_en && ~rd_en && full) begin
                                $display("%t: ERROR: Attempt to write to full FIFO:FIFO size is %d. %m",$time,MAX_DEPTH);
                                $display("%t: ERROR: Attempt to write to full FIFO:FIFO size is %d. %m",$time,MAX_DEPTH);
                                $finish;
                                $finish;
                        end
                        end
                        /* verilator lint_off WIDTH */
                        /* verilator lint_off WIDTH */
Line 1032... Line 1043...
        //synopsys  translate_on
        //synopsys  translate_on
        //synthesis translate_on
        //synthesis translate_on
endmodule
endmodule
 
 
 
 
 
/***************
 
fwft_fifo_bram
 
****************/
 
 
 
 
 
 
 
 
module fwft_fifo_bram #(
module fwft_fifo_bram #(
                parameter DATA_WIDTH = 2,
                parameter DATA_WIDTH = 2,
                parameter MAX_DEPTH = 2,
                parameter MAX_DEPTH = 2,
                parameter IGNORE_SAME_LOC_RD_WR_WARNING="YES" // "YES" , "NO"
                parameter IGNORE_SAME_LOC_RD_WR_WARNING="YES" // "YES" , "NO"
Line 1081... Line 1089...
        wire bram_empty, bram_rd_en, bram_wr_en;
        wire bram_empty, bram_rd_en, bram_wr_en;
        wire [DATA_WIDTH-1 : 0] bram_dout;
        wire [DATA_WIDTH-1 : 0] bram_dout;
        wire [DATA_WIDTH-1 : 0] out_reg;
        wire [DATA_WIDTH-1 : 0] out_reg;
        reg  [DATA_WIDTH-1 : 0] out_reg_next;
        reg  [DATA_WIDTH-1 : 0] out_reg_next;
 
 
 
        wire [DEPTH_DATA_WIDTH-1         :   0]  depth;
 
        reg  [DEPTH_DATA_WIDTH-1         :   0]  depth_next;
 
 
        assign dout = (bram_out_is_valid)?  bram_dout : out_reg;
        assign dout = (bram_out_is_valid)?  bram_dout : out_reg;
 
 
 
 
        assign  pass_din_to_out_reg = (wr_en & ~valid)| // a write has been recived while the reg_flit is not valid
        assign  pass_din_to_out_reg = (wr_en & ~valid)| // a write has been recived while the reg_flit is not valid
                (wr_en & valid & bram_empty & rd_en); //or its valid but bram is empty and its got a read request
                (wr_en & valid & bram_empty & rd_en); //or its valid but bram is empty and its got a read request
Line 1098... Line 1109...
        assign  bram_out_is_valid_next = (bram_rd_en )? (rd_en &  ~bram_empty): 1'b0;
        assign  bram_out_is_valid_next = (bram_rd_en )? (rd_en &  ~bram_empty): 1'b0;
 
 
 
 
        always @(*) begin
        always @(*) begin
                valid_next = valid;
                valid_next = valid;
                if(out_reg_wr_en) valid_next =1'b1;
                if(depth_next == {DEPTH_DATA_WIDTH{1'b0}}) valid_next =1'b0;
 
                else if(out_reg_wr_en) valid_next =1'b1;
                else if( bram_empty & rd_en) valid_next =1'b0;
                else if( bram_empty & rd_en) valid_next =1'b0;
        end
        end
 
 
 
 
        bram_based_fifo  #(
        bram_based_fifo  #(
Line 1118... Line 1130...
                        .empty(bram_empty),
                        .empty(bram_empty),
                        .reset(reset),
                        .reset(reset),
                        .clk(clk)
                        .clk(clk)
                );
                );
 
 
        wire [DEPTH_DATA_WIDTH-1         :   0]  depth;
 
        reg  [DEPTH_DATA_WIDTH-1         :   0]  depth_next;
 
 
 
 
 
        pronoc_register #(.W(DATA_WIDTH)      ) reg1 (.in(out_reg_next           ), .out(out_reg), .reset(reset), .clk(clk));
        pronoc_register #(.W(DATA_WIDTH)      ) reg1 (.in(out_reg_next           ), .out(out_reg), .reset(reset), .clk(clk));
        pronoc_register #(.W(1)               ) reg2 (.in(valid_next             ), .out(valid), .reset(reset), .clk(clk));
        pronoc_register #(.W(1)               ) reg2 (.in(valid_next             ), .out(valid), .reset(reset), .clk(clk));
        pronoc_register #(.W(1)               ) reg3 (.in(bram_out_is_valid_next ), .out(bram_out_is_valid), .reset(reset), .clk(clk));
        pronoc_register #(.W(1)               ) reg3 (.in(bram_out_is_valid_next ), .out(bram_out_is_valid), .reset(reset), .clk(clk));
Line 1135... Line 1146...
                out_reg_next = out_reg;
                out_reg_next = out_reg;
                depth_next   = depth;
                depth_next   = depth;
                if (wr_en & ~rd_en) depth_next =   depth + 1'h1;
                if (wr_en & ~rd_en) depth_next =   depth + 1'h1;
                else if (~wr_en & rd_en) depth_next  = depth - 1'h1;
                else if (~wr_en & rd_en) depth_next  = depth - 1'h1;
                if(pass_din_to_out_reg) out_reg_next = din;
                if(pass_din_to_out_reg) out_reg_next = din;
                if(bram_out_is_valid)   out_reg_next = bram_dout;
                else if(bram_out_is_valid)   out_reg_next = bram_dout;
        end
        end
 
 
 
 
 
 
 
 
Line 1254... Line 1265...
                        dout <=   queue[rd_ptr];
                        dout <=   queue[rd_ptr];
        end
        end
 
 
        always @(posedge clk)
        always @(posedge clk)
        begin
        begin
                if (reset) begin
                if (`pronoc_reset) begin
                        rd_ptr <= {Bw{1'b0}};
                        rd_ptr <= {Bw{1'b0}};
                        wr_ptr <= {Bw{1'b0}};
                        wr_ptr <= {Bw{1'b0}};
                        depth  <= {DEPTHw{1'b0}};
                        depth  <= {DEPTHw{1'b0}};
                end
                end
                else begin
                else begin
Line 1279... Line 1290...
 
 
        //synthesis translate_off
        //synthesis translate_off
        //synopsys  translate_off
        //synopsys  translate_off
        always @(posedge clk)
        always @(posedge clk)
        begin
        begin
                if(~reset)begin
                if(`pronoc_reset==1'b0)begin
                        if (wr_en && depth == B[DEPTHw-1   :   0] && !rd_en) begin
                        if (wr_en && depth == B[DEPTHw-1   :   0] && !rd_en) begin
                                $display(" %t: ERROR: Attempt to write to full FIFO: %m",$time);
                                $display(" %t: ERROR: Attempt to write to full FIFO: %m",$time);
                                $finish;
                                $finish;
                        end
                        end
                        if (rd_en && depth == {DEPTHw{1'b0}}) begin
                        if (rd_en && depth == {DEPTHw{1'b0}}) begin

powered by: WebSVN 2.1.0

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