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 56

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

powered by: WebSVN 2.1.0

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