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_reg_bas.v] - Blame information for rev 48

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: iport_regster_base
3
* Date:2020-02-21
4
* Author: alireza
5
*
6
* Description:
7
***************************************/
8
`timescale 1ns / 1ps
9
 
10
module  flit_buffer_reg_base #(
11
    parameter V        =   4,
12
    parameter B        =   4,   // buffer space :flit per VC 
13
    parameter Fpay     =   32,
14
    parameter PCK_TYPE = "MULTI_FLIT",
15
    parameter DEBUG_EN =   1,
16
    parameter C=1,
17
    parameter DSTPw=4,
18
    parameter SSA_EN="YES" // "YES" , "NO"       
19
)(
20
    din,
21
    vc_num_wr,
22
    wr_en,
23
    vc_num_rd,
24
    rd_en,
25
    dout,
26
    vc_not_empty,
27
    reset,
28
    clk,
29
 
30
    //header flit dat
31
    class_all
32
 
33
);
34
 
35
    function integer log2;
36
      input integer number; begin
37
         log2=(number <=1) ? 1: 0;
38
         while(2**log2<number) begin
39
            log2=log2+1;
40
         end
41
      end
42
    endfunction // log2 
43
 
44
    localparam
45
        Cw = (C>1)? log2(C): 1,
46
        Vw         =   log2(V),
47
        REGFw      =   2+Fpay,   //Fpay + headr flags
48
        Fw =2+V+Fpay,
49
        VFw        =   V * Fw,
50
        VCw        =   V * Cw,
51
        VDSTPw     =   V * DSTPw;
52
 
53
    input  [Fw-1      :0]   din;     // Data in    
54
    input  [V-1       :0]   vc_num_wr;//write vertual chanel   
55
    input                   wr_en;   // Write enable
56
 
57
 
58
    input  [V-1       :0]   vc_num_rd;//read vertual chanel    
59
    input                   rd_en;   // Read the next word
60
 
61
 
62
    output [Fw-1       :0]  dout;    // Data out
63
    output [V-1        :0]  vc_not_empty;
64
    input                   reset;
65
    input                   clk;
66
 
67
    output [VCw-1 : 0] class_all;
68
   // output [VDSTPw-1 :0 ] dest_port_encoded_all;
69
   // input  [V-1        :0]  ssa_rd;
70
 
71
    wire [Fw-1       :0]  dout_all [V-1 : 0];    // Data out
72
    reg  [VCw-1 : 0] class_vc [V-1 : 0];
73
    reg [REGFw-1 : 0] flit_regs [V-1 : 0];   // a register array save the head of each quque
74
    reg [V-1 : 0] valid,valid_next; // if valid is asseted it shows the VC queue has a flit waiting to be sent 
75
 
76
    wire [Fw-1 : 0] bram_dout;
77
    wire [V-1 : 0] bram_not_empty;
78
    wire bram_wr_en;
79
    wire [V-1 : 0] vc_num_wr_en,vc_num_rd_en;
80
 
81
    wire[REGFw-1 : 0] flit_reg_mux_out;
82
    wire flit_reg_mux_sel;
83
    reg flit_reg_mux_sel_delay;
84
    wire [V-1 : 0] flit_reg_wr_en,pass_din_to_flit_reg,bram_empty;
85
    wire [V-1 : 0]  bram_out_is_valid;
86
    wire bram_rd_en = |(vc_num_rd_en & bram_not_empty);
87
 
88
    //header flit info 
89
    wire [Cw-1:0] class_i;
90
    wire [DSTPw-1 : 0] destport_i;
91
 
92
    wire [Vw-1: 0] vc_num_rd_bin;
93
    reg [Vw-1 : 0] vc_num_rd_bin_delaied;
94
    reg [V-1 : 0]  bram_out_is_valid_delaied,pass_din_to_flit_reg_delaied;
95
 
96
    reg  [Fw-1      :0]   din_reg;
97
 
98
    assign bram_empty = ~bram_not_empty;
99
    assign vc_num_wr_en = (wr_en)?    vc_num_wr : {V{1'b0}};
100
    assign vc_num_rd_en = (rd_en)?    vc_num_rd : {V{1'b0}};
101
 
102
    assign pass_din_to_flit_reg = (vc_num_wr_en & ~valid)| // a write has been recived while the reg_flit is not valid
103
                            (vc_num_wr_en & valid & bram_empty & vc_num_rd_en); //or its valid but bram is empty and its got a read request
104
 
105
 
106
    assign flit_reg_mux_sel = | pass_din_to_flit_reg ;// 1 :din, 0: bram
107
    //2-1 mux. Select between the bram and input flit. 
108
    assign flit_reg_mux_out = (flit_reg_mux_sel_delay)?   {din[Fw-1:Fw-2],din_reg[Fpay-1:0]} : {bram_dout[Fw-1:Fw-2],bram_dout[Fpay-1:0]};
109
    assign bram_wr_en =  (flit_reg_mux_sel)?  1'b0 :wr_en ; //make sure not write on the Bram if the reg fifo is empty 
110
 
111
    assign  flit_reg_wr_en = pass_din_to_flit_reg | bram_out_is_valid;
112
 
113
    assign  bram_out_is_valid = (bram_rd_en )? (vc_num_rd &  bram_not_empty): {V{1'b0}};
114
 
115
 
116
 
117
 
118
    one_hot_to_bin #(
119
        .ONE_HOT_WIDTH(V),
120
        .BIN_WIDTH(Vw)
121
    )
122
    conv
123
    (
124
        .one_hot_code(vc_num_rd),
125
        .bin_code(vc_num_rd_bin)
126
    );
127
 
128
    always @(posedge clk) vc_num_rd_bin_delaied<=vc_num_rd_bin;
129
    always @(posedge clk) pass_din_to_flit_reg_delaied<=pass_din_to_flit_reg;
130
    assign  dout = dout_all[vc_num_rd_bin_delaied];
131
 
132
 
133
    flit_buffer #(
134
        .V(V),
135
        .B(B),
136
        .PCK_TYPE(PCK_TYPE),
137
        .Fw(Fw),
138
        .DEBUG_EN(DEBUG_EN),
139
        .SSA_EN("NO")// should be "NO" even if SSA is enabled
140
    )
141
    flit_buffer
142
    (
143
        .din(din),
144
        .vc_num_wr(vc_num_wr),
145
        .wr_en(bram_wr_en),
146
 
147
        .vc_num_rd(vc_num_rd),
148
 
149
        .rd_en(bram_rd_en),
150
        .dout(bram_dout),
151
        .vc_not_empty(bram_not_empty),
152
        .reset(reset),
153
        .clk(clk),
154
        .ssa_rd({V{1'b0}})
155
    );
156
 
157
 
158
    always @(posedge clk) begin
159
        if(reset)  begin
160
                valid<={V{1'b0}};
161
                bram_out_is_valid_delaied<={V{1'b0}};
162
        //      din_reg<={Fw{1'b0}};
163
        end
164
        else begin
165
            valid<=valid_next;
166
                bram_out_is_valid_delaied<=bram_out_is_valid;
167
                din_reg<=din;
168
                flit_reg_mux_sel_delay<=flit_reg_mux_sel;
169
 
170
        end
171
    end
172
    assign vc_not_empty = valid;
173
 
174
 
175
     extract_header_flit_info #(
176
        .DATA_w(0)
177
     )
178
     header_extractor
179
     (
180
         .flit_in({flit_reg_mux_out[REGFw-1:REGFw-2],flit_reg_wr_en,flit_reg_mux_out[Fpay-1 : 0]}),
181
         .flit_in_wr(),
182
         .class_o(class_i),
183
         .destport_o(destport_i),
184
         .dest_e_addr_o( ),
185
         .src_e_addr_o( ),
186
         .vc_num_o(),
187
         .hdr_flit_wr_o(),
188
         .hdr_flg_o(),
189
         .tail_flg_o( ),
190
         .weight_o( ),
191
         .be_o( ),
192
         .data_o( )
193
     );
194
 
195
 
196
    genvar i;
197
    generate
198
    for (i = 0; i < V; i = i + 1) begin : Vblock
199
       // assign  dout_all[(i+1)*Fw-1 : i*Fw] = {flit_regs [i][REGFw-1: REGFw-2],i[V-1:0] ,flit_regs[i][Fpay-1:0]};
200
        assign  dout_all[i] = {flit_regs [i][REGFw-1: REGFw-2],i[V-1:0] ,flit_regs[i][Fpay-1:0]};
201
        assign  class_all[(i+1)*Cw-1 : i*Cw] = class_vc[i];
202
 
203
 
204
 
205
 
206
 
207
`ifdef SYNC_RESET_MODE
208
        always @ (posedge clk )begin
209
`else
210
        always @ (posedge clk or posedge reset)begin
211
`endif
212
            if(reset)begin
213
                flit_regs[i]<= {REGFw{1'b0}};
214
                class_vc[i]<=  {Cw{1'b0}};
215
            //    dest_port_encoded_vc[i]<={DSTPw{1'b0}}; 
216
            end
217
            else begin //1 :din, 0: bram
218
               // if(pass_din_to_flit_reg_delaied[i] & (flit_reg_mux_sel_delay==1'b0)) $display("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");
219
               // if( bram_out_is_valid_delaied[i] & flit_reg_mux_sel_delay)  $display("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
220
                if(pass_din_to_flit_reg_delaied[i]) flit_regs[i] <= {din[Fw-1:Fw-2],din_reg[Fpay-1:0]} ;
221
                if(bram_out_is_valid_delaied[i])    flit_regs[i] <= {bram_dout[Fw-1:Fw-2],bram_dout[Fpay-1:0]};
222
                if(flit_reg_wr_en[i] & flit_reg_mux_out[REGFw-1] ) class_vc[i]<=class_i;// writing header flit 
223
             //   if(destport_clear[i]>0) dest_port_encoded_vc<= dest_port_encoded_vc & ~destport_clear[i];
224
              //  else if(flit_reg_wr_en[i] & flit_reg_mux_out[REGFw-1] ) dest_port_encoded_vc <=destport_i;
225
            end
226
        end
227
 
228
 
229
 
230
        /* verilator lint_off WIDTH */
231
         /*
232
        if( ROUTE_TYPE=="DETERMINISTIC") begin : dtrmn_dest
233
`ifdef SYNC_RESET_MODE
234
            always @ (posedge clk )begin
235
`else
236
            always @ (posedge clk or posedge reset)begin
237
`endif
238
                if(reset)begin
239
 
240
                end else begin
241
                    dest_port_encoded_vc[i]<= destport_in_encoded;
242
                end
243
            end//always
244
       end  else begin : adptv_dest
245
 
246
 
247
        */
248
 
249
 
250
 
251
 
252
        always @(*) begin
253
                valid_next[i] = valid[i];
254
                if(flit_reg_wr_en[i]) valid_next[i] =1'b1;
255
                else if( bram_empty[i] & vc_num_rd_en[i]) valid_next[i] =1'b0;
256
         end
257
 
258
    end //for  
259
 
260
     /* verilator lint_off WIDTH */
261
  //  if(TOPOLOGY=="FATTREE" && ROUTE_NAME == "NCA_STRAIGHT_UP") begin : fat
262
    /* verilator lint_on WIDTH */
263
 /*
264
     fattree_destport_up_select #(
265
         .K(T1),
266
         .SW_LOC(SW_LOC)
267
     )
268
     static_sel
269
     (
270
        .destport_in(destport_in),
271
        .destport_o(destport_in_encoded)
272
     );
273
 
274
    end else begin : other
275
        assign destport_in_encoded = destport_in;
276
    end
277
 
278
  */
279
    endgenerate
280
 
281
 
282
 
283
    // Update header flit info registers
284
 
285
 
286
 
287
 
288
 
289
 
290
 
291
 
292
 
293
endmodule
294
 
295
 
296
 

powered by: WebSVN 2.1.0

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