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 54

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 54 alirezamon
    wire [VCw-1 : 0] class_vc [V-1 : 0];
73
    reg  [VCw-1 : 0] class_vc_next [V-1 : 0];
74
    wire [REGFw-1 : 0] flit_regs [V-1 : 0];   // a register array save the head of each quque
75
    reg  [REGFw-1 : 0] flit_regs_next [V-1 : 0];
76 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 
77
 
78
    wire [Fw-1 : 0] bram_dout;
79
    wire [V-1 : 0] bram_not_empty;
80
    wire bram_wr_en;
81
    wire [V-1 : 0] vc_num_wr_en,vc_num_rd_en;
82
 
83
    wire[REGFw-1 : 0] flit_reg_mux_out;
84
    wire flit_reg_mux_sel;
85
    reg flit_reg_mux_sel_delay;
86
    wire [V-1 : 0] flit_reg_wr_en,pass_din_to_flit_reg,bram_empty;
87
    wire [V-1 : 0]  bram_out_is_valid;
88
    wire bram_rd_en = |(vc_num_rd_en & bram_not_empty);
89
 
90
    //header flit info 
91
    wire [Cw-1:0] class_i;
92
    wire [DSTPw-1 : 0] destport_i;
93
 
94
    wire [Vw-1: 0] vc_num_rd_bin;
95
    reg [Vw-1 : 0] vc_num_rd_bin_delaied;
96
    reg [V-1 : 0]  bram_out_is_valid_delaied,pass_din_to_flit_reg_delaied;
97
 
98
    reg  [Fw-1      :0]   din_reg;
99
 
100
    assign bram_empty = ~bram_not_empty;
101
    assign vc_num_wr_en = (wr_en)?    vc_num_wr : {V{1'b0}};
102
    assign vc_num_rd_en = (rd_en)?    vc_num_rd : {V{1'b0}};
103
 
104
    assign pass_din_to_flit_reg = (vc_num_wr_en & ~valid)| // a write has been recived while the reg_flit is not valid
105
                            (vc_num_wr_en & valid & bram_empty & vc_num_rd_en); //or its valid but bram is empty and its got a read request
106
 
107
 
108
    assign flit_reg_mux_sel = | pass_din_to_flit_reg ;// 1 :din, 0: bram
109
    //2-1 mux. Select between the bram and input flit. 
110
    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]};
111
    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 
112
 
113
    assign  flit_reg_wr_en = pass_din_to_flit_reg | bram_out_is_valid;
114
 
115
    assign  bram_out_is_valid = (bram_rd_en )? (vc_num_rd &  bram_not_empty): {V{1'b0}};
116
 
117
 
118
 
119
 
120
    one_hot_to_bin #(
121
        .ONE_HOT_WIDTH(V),
122
        .BIN_WIDTH(Vw)
123
    )
124
    conv
125
    (
126
        .one_hot_code(vc_num_rd),
127
        .bin_code(vc_num_rd_bin)
128
    );
129
 
130
    always @(posedge clk) vc_num_rd_bin_delaied<=vc_num_rd_bin;
131
    always @(posedge clk) pass_din_to_flit_reg_delaied<=pass_din_to_flit_reg;
132
    assign  dout = dout_all[vc_num_rd_bin_delaied];
133
 
134
 
135
    flit_buffer #(
136
        .B(B),
137
        .SSA_EN("NO")// should be "NO" even if SSA is enabled
138
    )
139
    flit_buffer
140
    (
141
        .din(din),
142
        .vc_num_wr(vc_num_wr),
143
        .wr_en(bram_wr_en),
144
 
145
        .vc_num_rd(vc_num_rd),
146
 
147
        .rd_en(bram_rd_en),
148
        .dout(bram_dout),
149
        .vc_not_empty(bram_not_empty),
150
        .reset(reset),
151
        .clk(clk),
152 54 alirezamon
        .ssa_rd({V{1'b0}}),
153
        .multiple_dest(),
154
        .sub_rd_ptr_ld(),
155
        .flit_is_tail()
156
 
157
 
158 48 alirezamon
    );
159
 
160
 
161
    always @(posedge clk) begin
162
        if(reset)  begin
163
                valid<={V{1'b0}};
164
                bram_out_is_valid_delaied<={V{1'b0}};
165
        //      din_reg<={Fw{1'b0}};
166
        end
167
        else begin
168
            valid<=valid_next;
169
                bram_out_is_valid_delaied<=bram_out_is_valid;
170
                din_reg<=din;
171
                flit_reg_mux_sel_delay<=flit_reg_mux_sel;
172
 
173
        end
174
    end
175
    assign vc_not_empty = valid;
176
 
177
 
178
     extract_header_flit_info #(
179
        .DATA_w(0)
180
     )
181
     header_extractor
182
     (
183
         .flit_in({flit_reg_mux_out[REGFw-1:REGFw-2],flit_reg_wr_en,flit_reg_mux_out[Fpay-1 : 0]}),
184
         .flit_in_wr(),
185
         .class_o(class_i),
186
         .destport_o(destport_i),
187
         .dest_e_addr_o( ),
188
         .src_e_addr_o( ),
189
         .vc_num_o(),
190
         .hdr_flit_wr_o(),
191
         .hdr_flg_o(),
192
         .tail_flg_o( ),
193
         .weight_o( ),
194
         .be_o( ),
195
         .data_o( )
196
     );
197
 
198
 
199
    genvar i;
200
    generate
201
    for (i = 0; i < V; i = i + 1) begin : Vblock
202
       // 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]};
203
        assign  dout_all[i] = {flit_regs [i][REGFw-1: REGFw-2],i[V-1:0] ,flit_regs[i][Fpay-1:0]};
204
        assign  class_all[(i+1)*Cw-1 : i*Cw] = class_vc[i];
205
 
206
 
207 54 alirezamon
      pronoc_register #(
208
           .W(REGFw)
209
      ) reg1 (
210
           .in(flit_regs_next[i]),
211
           .reset(reset),
212
           .clk(clk),
213
           .out(flit_regs[i])
214
      );
215
 
216
 
217
       pronoc_register #(
218
           .W(Cw)
219
      ) reg2 (
220
           .in(class_vc_next[i]),
221
           .reset(reset),
222
           .clk(clk),
223
           .out(class_vc[i])
224
      );
225
 
226
 
227 48 alirezamon
 
228 54 alirezamon
        always @ (*)begin
229
            flit_regs_next[i] = flit_regs[i];
230
            class_vc_next[i]  = class_vc[i];
231
            if(pass_din_to_flit_reg_delaied[i]) flit_regs_next[i] = {din[Fw-1:Fw-2],din_reg[Fpay-1:0]} ;
232
            if(bram_out_is_valid_delaied[i])    flit_regs_next[i] = {bram_dout[Fw-1:Fw-2],bram_dout[Fpay-1:0]};
233
            if(flit_reg_wr_en[i] & flit_reg_mux_out[REGFw-1] ) class_vc_next[i] = class_i;// writing header flit 
234 48 alirezamon
        end
235
 
236
 
237
 
238
        /* verilator lint_off WIDTH */
239
         /*
240
        if( ROUTE_TYPE=="DETERMINISTIC") begin : dtrmn_dest
241 54 alirezamon
        always @ (`pronoc_clk_reset_edge )begin
242
               if(`pronoc_reset)begin
243 48 alirezamon
 
244
                end else begin
245
                    dest_port_encoded_vc[i]<= destport_in_encoded;
246
                end
247
            end//always
248
       end  else begin : adptv_dest
249
 
250
 
251
        */
252
 
253
 
254
 
255
 
256
        always @(*) begin
257
                valid_next[i] = valid[i];
258
                if(flit_reg_wr_en[i]) valid_next[i] =1'b1;
259
                else if( bram_empty[i] & vc_num_rd_en[i]) valid_next[i] =1'b0;
260
         end
261
 
262
    end //for  
263
 
264
     /* verilator lint_off WIDTH */
265
  //  if(TOPOLOGY=="FATTREE" && ROUTE_NAME == "NCA_STRAIGHT_UP") begin : fat
266
    /* verilator lint_on WIDTH */
267
 /*
268
     fattree_destport_up_select #(
269
         .K(T1),
270
         .SW_LOC(SW_LOC)
271
     )
272
     static_sel
273
     (
274
        .destport_in(destport_in),
275
        .destport_o(destport_in_encoded)
276
     );
277
 
278
    end else begin : other
279
        assign destport_in_encoded = destport_in;
280
    end
281
 
282
  */
283
    endgenerate
284
 
285
 
286
 
287
    // Update header flit info registers
288
 
289
 
290
 
291
 
292
 
293
 
294
 
295
 
296
 
297
endmodule
298
 
299
 
300
 

powered by: WebSVN 2.1.0

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