Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_rdmc_buf_manager.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_rdmc_buf_manager.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/*************************************************************************
36 *
37 * File Name : niu_rdmc_buf_manager.v
38 * Author Name : Jeanne Cai
39 * Description :
40 * Date Created : 07/18/2004
41 *
42 * Copyright (c) 2001, Sun Microsystems, Inc.
43 * Sun Proprietary and Confidential
44 *
45 *
46 *************************************************************************/
47`include "niu_rdmc.h"
48module niu_rdmc_buf_manager (
49 clk,
50 reset,
51 wred_enable,
52 random_num,
53 dma_chnl_grp_id,
54 dma_data_offset,
55 full_header,
56 dma_en,
57 dma_reset,
58 page_valid0,
59 addr_mask0,
60 comp_value0,
61 relo_value0,
62 page_valid1,
63 addr_mask1,
64 comp_value1,
65 relo_value1,
66 dma_fatal_err,
67 rx_log_page_hdl_reg,
68 rdc_red_param_reg,
69 rbr_cfig_a_reg,
70 rbr_cfig_b_reg,
71 rbr_kick_reg,
72 rbr_cfig_a_reg_wenu,
73 rbr_cfig_a_reg_wenl,
74 rbr_kick_reg_wen,
75 muxed_pkt_len,
76 muxed_rdc_num_r,
77 muxed_drop_pkt_r,
78 muxed_s_event_r,
79 sel_buf_en, //it is stage0_en_r, in stage1
80 pkt_req_cnt_e_done_mod,
81 pkt_buf_done,
82 is_hdr_wr_data,
83 is_jmb1_wr_data,
84 fetch_desp_req_sm,
85 fetch_desp_pre_done,
86 fetch_desp_done,
87 fetch_desp_resp_vld,
88 rdmc_resp_data_valid,
89 cache_start_addr,
90 cache_end_addr,
91 cache_buf_rd_gnt,
92 cache_buf_rd_data,
93 cache_parity_err,
94 rcr_curr_qlen,
95 shadw_curr_space_cnt,
96
97 chnl_sel_buf_en_r,
98 desp_init_valid,
99 fetch_desp_trig,
100 fetch_desp_addr,
101 fetch_desp_num,
102 cache_read_req,
103 cache_rd_ptr,
104 cache_wr_ptr,
105 drop_pkt,
106 pkt_buf_gnt,
107 pkt_buf_size,
108 pkt_buf_addr,
109 orig_buf_addr,
110 pref_buf_used_num,
111 pkt_trans_len,
112 desp_curr_addr,
113 desp_curr_cnt,
114 desp_addr_not_valid,
115 buf_addr_not_valid,
116 rbr_addr_overflow,
117 desp_curr_cnt_overflow,
118 rbr_empty,
119 wred_drop_pkt,
120 rcr_drop_pkt,
121 rbr_drop_pkt,
122 chnl_sel_buf_en,
123 chnl_cache_parity_err
124
125 );
126
127input clk;
128input reset;
129input wred_enable;
130input[15:0] random_num;
131input[4:0] dma_chnl_grp_id;
132input[1:0] dma_data_offset;
133input full_header;
134input dma_reset;
135input dma_en;
136input page_valid0;
137input[31:0] addr_mask0;
138input[31:0] comp_value0;
139input[31:0] relo_value0;
140input page_valid1;
141input[31:0] addr_mask1;
142input[31:0] comp_value1;
143input[31:0] relo_value1;
144input dma_fatal_err;
145input[19:0] rx_log_page_hdl_reg;
146input[31:0] rdc_red_param_reg;
147input[53:0] rbr_cfig_a_reg;
148input[10:0] rbr_cfig_b_reg;
149input[15:0] rbr_kick_reg;
150input rbr_cfig_a_reg_wenu;
151input rbr_cfig_a_reg_wenl;
152input rbr_kick_reg_wen;
153input[13:0] muxed_pkt_len;
154input[4:0] muxed_rdc_num_r;
155input muxed_drop_pkt_r;
156input muxed_s_event_r;
157input sel_buf_en;
158input pkt_req_cnt_e_done_mod;
159input pkt_buf_done;
160input is_hdr_wr_data;
161input is_jmb1_wr_data;
162input fetch_desp_req_sm;
163input fetch_desp_pre_done;
164input fetch_desp_done;
165input fetch_desp_resp_vld;
166input rdmc_resp_data_valid;
167input[7:0] cache_start_addr;
168input[7:0] cache_end_addr;
169input cache_buf_rd_gnt;
170input[131:0] cache_buf_rd_data;
171input cache_parity_err;
172input[15:0] rcr_curr_qlen;
173input[7:0] shadw_curr_space_cnt;
174
175output chnl_sel_buf_en_r;
176output desp_init_valid;
177output fetch_desp_trig;
178output[63:0] fetch_desp_addr;
179output[4:0] fetch_desp_num;
180output cache_read_req;
181output[7:0] cache_rd_ptr;
182output[7:0] cache_wr_ptr;
183output drop_pkt;
184output pkt_buf_gnt;
185output[1:0] pkt_buf_size;
186output[63:0] pkt_buf_addr;
187output[35:0] orig_buf_addr;
188output[1:0] pref_buf_used_num;
189output[13:0] pkt_trans_len;
190output[15:0] desp_curr_addr;
191output[16:0] desp_curr_cnt;
192output desp_addr_not_valid;
193output buf_addr_not_valid;
194output rbr_addr_overflow;
195output desp_curr_cnt_overflow;
196output rbr_empty;
197output wred_drop_pkt;
198output rcr_drop_pkt;
199output rbr_drop_pkt;
200output chnl_sel_buf_en;
201output chnl_cache_parity_err;
202
203
204reg rbr_cfig_a_reg_wenu_dly2;
205reg rbr_cfig_a_reg_wenu_dly;
206reg rbr_cfig_a_reg_wenl_dly2;
207reg rbr_cfig_a_reg_wenl_dly;
208
209reg rbr_kick_reg_wen_dly;
210reg[16:0] rbr_end_addr_r;
211
212
213always @ (posedge clk)
214if (reset)
215 rbr_cfig_a_reg_wenu_dly <= 1'b0;
216else if (dma_reset)
217 rbr_cfig_a_reg_wenu_dly <= 1'b0;
218else
219 rbr_cfig_a_reg_wenu_dly <= rbr_cfig_a_reg_wenu;
220
221always @ (posedge clk)
222if (reset)
223 rbr_cfig_a_reg_wenu_dly2 <= 1'b0;
224else if (dma_reset)
225 rbr_cfig_a_reg_wenu_dly2 <= 1'b0;
226else
227 rbr_cfig_a_reg_wenu_dly2 <= rbr_cfig_a_reg_wenu_dly;
228
229always @ (posedge clk)
230if (reset)
231 rbr_cfig_a_reg_wenl_dly <= 1'b0;
232else if (dma_reset)
233 rbr_cfig_a_reg_wenl_dly <= 1'b0;
234else
235 rbr_cfig_a_reg_wenl_dly <= rbr_cfig_a_reg_wenl;
236
237always @ (posedge clk)
238if (reset)
239 rbr_cfig_a_reg_wenl_dly2 <= 1'b0;
240else if (dma_reset)
241 rbr_cfig_a_reg_wenl_dly2 <= 1'b0;
242else
243 rbr_cfig_a_reg_wenl_dly2 <= rbr_cfig_a_reg_wenl_dly;
244
245
246always @ (posedge clk)
247if (reset)
248 rbr_kick_reg_wen_dly <= 1'b0;
249else if (dma_reset)
250 rbr_kick_reg_wen_dly <= 1'b0;
251else
252 rbr_kick_reg_wen_dly <= rbr_kick_reg_wen;
253
254/**********************************************/
255//PIO programmed parameters
256/**********************************************/
257wire[19:0] page_handle = rx_log_page_hdl_reg[19:0];
258wire[3:0] wred_window = rdc_red_param_reg[3:0];
259wire[11:0] wred_thresh = rdc_red_param_reg[15:4];
260wire[3:0] wred_window_syn = rdc_red_param_reg[19:16];
261wire[11:0] wred_thresh_syn = rdc_red_param_reg[31:20];
262
263wire[15:0] rbr_max_len = rbr_cfig_a_reg[53:38];
264wire[25:0] rbr_base_addr = rbr_cfig_a_reg[37:12];
265wire[15:0] rbr_start_addr = {rbr_cfig_a_reg[11:0], 4'b0}; //4 bytes aligned
266wire[15:0] rbr_end_addr = rbr_end_addr_r[15:0];
267wire rbr_addr_overflow = rbr_end_addr_r[16] & dma_en;
268
269wire[1:0] cache_buf_size_sel = rbr_cfig_b_reg[10:9]; //{00:4k, 01:8k, 10:16k,11:32k}
270wire size2_config_valid = rbr_cfig_b_reg[8];
271wire[1:0] size2_buf_size_sel = rbr_cfig_b_reg[7:6]; //{00:2k, 01:4k, 10:8k,11:16k}
272wire size1_config_valid = rbr_cfig_b_reg[5];
273wire[1:0] size1_buf_size_sel = rbr_cfig_b_reg[4:3]; //{00:1k, 01:2k, 10:4k,11:8k}
274wire size0_config_valid = rbr_cfig_b_reg[2];
275wire[1:0] size0_buf_size_sel = rbr_cfig_b_reg[1:0]; //{00:256, 01:512, 10:1k,11:2k}
276
277
278/************************/
279//descriptor manager
280/************************/
281reg cal_addr_en;
282reg[4:0] addr_cnt; // at most, fetch 16 addresses
283reg[15:0] desp_curr_addr_tmp;
284reg[15:0] desp_curr_addr; // always on 4 bytes boundry
285reg[16:0] desp_curr_cnt; // bit[16] is overflow bit
286reg inc_desp_curr_cnt;
287reg desp_curr_cnt_overflow_r;
288reg[15:0] desp_addr_avail_num;
289
290reg[7:0] cache_space_cnt; //support 255 lines, for most cases, it is 8 lines
291reg[7:0] cache_buf_cnt;
292reg inc_cache_buf_cnt;
293reg cache_buf_empty;
294reg cache_buf_full;
295
296reg[4:0] fetch_desp_num;
297
298wire[15:0] rbr_end_addr_sub = rbr_max_len[15:0] - 16'd1;
299
300always @ (posedge clk)
301if (reset)
302 rbr_end_addr_r <= 17'b0;
303else if (dma_reset)
304 rbr_end_addr_r <= 17'b0;
305else if (rbr_cfig_a_reg_wenu_dly & (|rbr_max_len))
306 rbr_end_addr_r <= {1'b0, rbr_end_addr_sub[15:0]};
307else if (rbr_cfig_a_reg_wenl_dly2 | rbr_cfig_a_reg_wenu_dly2)
308 rbr_end_addr_r <= {1'b0, rbr_start_addr[15:0]} + rbr_end_addr_r;
309else
310 rbr_end_addr_r <= rbr_end_addr_r;
311
312always @ (posedge clk)
313if (reset)
314 addr_cnt <= 5'b0;
315else if (dma_reset)
316 addr_cnt <= 5'b0;
317else if (cal_addr_en)
318 addr_cnt <= fetch_desp_num;
319else if (addr_cnt != 5'b0)
320 addr_cnt <= addr_cnt - 5'd1;
321else
322 addr_cnt <= addr_cnt;
323
324always @ (posedge clk)
325if (reset)
326 desp_curr_addr_tmp <= 16'b0;
327else if (dma_reset)
328 desp_curr_addr_tmp <= 16'b0;
329else if ((addr_cnt != 5'b0) & (desp_curr_addr_tmp == rbr_end_addr))
330 desp_curr_addr_tmp <= rbr_start_addr;
331else if (addr_cnt != 5'b0)
332 desp_curr_addr_tmp <= desp_curr_addr_tmp + 16'd1;
333else if (cal_addr_en)
334 desp_curr_addr_tmp <= desp_curr_addr;
335else
336 desp_curr_addr_tmp <= desp_curr_addr_tmp;
337
338always @ (posedge clk)
339if (reset)
340 desp_curr_addr <= 16'b0;
341else if (rbr_cfig_a_reg_wenl_dly)
342 desp_curr_addr <= rbr_start_addr;
343else if (fetch_desp_done)
344 desp_curr_addr <= desp_curr_addr_tmp;
345else
346 desp_curr_addr <= desp_curr_addr;
347
348always @ (posedge clk)
349if (reset)
350 desp_addr_avail_num <= 16'b0;
351else if (dma_reset)
352 desp_addr_avail_num <= 16'b0;
353else if (rbr_cfig_a_reg_wenu_dly)
354 desp_addr_avail_num <= rbr_max_len[15:0];
355else if (fetch_desp_pre_done)
356 desp_addr_avail_num <= rbr_end_addr[15:0] - desp_curr_addr_tmp[15:0];
357else if (fetch_desp_done)
358 desp_addr_avail_num <= desp_addr_avail_num + 16'd1;
359else
360 desp_addr_avail_num <= desp_addr_avail_num;
361
362
363always @ (posedge clk)
364if (reset)
365 inc_desp_curr_cnt <= 1'b0;
366else if (dma_reset)
367 inc_desp_curr_cnt <= 1'b0;
368else if (rbr_kick_reg_wen & !fetch_desp_pre_done | rbr_kick_reg_wen_dly & !inc_desp_curr_cnt)
369 inc_desp_curr_cnt <= 1'b1;
370else
371 inc_desp_curr_cnt <= 1'b0;
372
373always @ (posedge clk)
374if (reset)
375 desp_curr_cnt <= 17'b0; //pio read only
376else if (dma_reset)
377 desp_curr_cnt <= 17'b0;
378else if (desp_curr_cnt[16] | desp_curr_cnt_overflow_r)
379 desp_curr_cnt <= desp_curr_cnt;
380else if (inc_desp_curr_cnt)
381 desp_curr_cnt <= desp_curr_cnt + {1'b0, rbr_kick_reg[15:0]}; // bit[16] is overflow bit
382else if (fetch_desp_done)
383 desp_curr_cnt <= desp_curr_cnt - {12'b0, fetch_desp_num[4:0]};
384else
385 desp_curr_cnt <= desp_curr_cnt;
386
387
388wire desp_curr_cnt_overflow = (desp_curr_cnt > {1'b0, rbr_max_len}) & dma_en;
389
390always @ (posedge clk)
391if (reset)
392 desp_curr_cnt_overflow_r <= 1'b0;
393else if (dma_reset)
394 desp_curr_cnt_overflow_r <= 1'b0;
395else if (desp_curr_cnt_overflow)
396 desp_curr_cnt_overflow_r <= 1'b1;
397else
398 desp_curr_cnt_overflow_r <= desp_curr_cnt_overflow_r;
399
400/*****************************/
401//request descriptor
402/*****************************/
403reg[31:0] desp_relo_addr_r;
404wire rbr_empty = (|cache_space_cnt[7:2]) & !(|desp_curr_cnt[15:0]) & dma_en;
405wire fetch_desp_trig = (cache_space_cnt[7:0] > 8'd4) & (|desp_curr_cnt[15:0]);
406wire[4:0] desp_cnt_avail_num = (|desp_curr_cnt[15:4]) ? 5'b10000 : desp_curr_cnt[4:0];
407wire[4:0] desp_addr_avail_num1 = (|desp_addr_avail_num[15:4]) ? 5'b10000 : desp_addr_avail_num[4:0];
408wire[4:0] fetch_desp_min_num = (desp_addr_avail_num1[4:0] > desp_cnt_avail_num[4:0]) ? desp_cnt_avail_num[4:0] :
409 desp_addr_avail_num1[4:0];
410
411wire[43:0] desp_full_addr = {rbr_base_addr[25:0], desp_curr_addr[15:0], 2'b0};
412
413wire desp_addr_valid0 = ((desp_full_addr[43:12] & addr_mask0) == (comp_value0 & addr_mask0)) & page_valid0;
414wire desp_addr_valid1 = ((desp_full_addr[43:12] & addr_mask1) == (comp_value1 & addr_mask1)) & page_valid1;
415
416wire[31:0] desp_relo_addr0 = (desp_full_addr[43:12] & ~addr_mask0) | (relo_value0 & addr_mask0);
417wire[31:0] desp_relo_addr1 = (desp_full_addr[43:12] & ~addr_mask1) | (relo_value1 & addr_mask1);
418
419wire[31:0] desp_relo_addr = desp_addr_valid0 ? desp_relo_addr0 : desp_relo_addr1;
420wire[63:0] fetch_desp_addr = {page_handle[19:0], desp_relo_addr_r[31:0], desp_full_addr[11:0]};
421
422wire desp_addr_not_valid = !(desp_addr_valid0 | desp_addr_valid1) & dma_en;
423wire desp_init_valid = (desp_addr_valid0 | desp_addr_valid1) & dma_en;
424
425
426always @ (posedge clk)
427if (reset)
428 cal_addr_en <= 1'b0;
429else
430 cal_addr_en <= fetch_desp_req_sm;
431
432always @ (posedge clk)
433if (reset)
434 desp_relo_addr_r <= 32'b0;
435else if (fetch_desp_req_sm)
436 desp_relo_addr_r <= desp_relo_addr;
437else
438 desp_relo_addr_r <= desp_relo_addr_r;
439
440always @ (posedge clk)
441if (reset)
442 fetch_desp_num <= 5'b0;
443else if (fetch_desp_req_sm)
444 fetch_desp_num <= fetch_desp_min_num;
445else
446 fetch_desp_num <= fetch_desp_num;
447
448
449/******************************/
450//buffer size decode
451/******************************/
452reg[7:0] cache_buf_size_dec;
453reg[7:0] size2_buf_size_dec;
454reg[7:0] size1_buf_size_dec;
455reg[7:0] size0_buf_size_dec;
456reg[7:0] size2_buf_num_dec;
457reg[7:0] size1_buf_num_dec;
458reg[7:0] size0_buf_num_dec;
459reg[7:0] cache_buf_size_pre;
460reg[9:0] cache_buf_size1_pre; //one cache - data_offset
461reg[10:0] cache_buf_size2_pre; //for two cache buf size - 1 data_offset
462reg[10:0] cache_buf_size3_pre; //for three cache buf size - 2 data_offset
463reg[7:0] size2_buf_size_pre;
464reg[7:0] size1_buf_size_pre;
465reg[7:0] size0_buf_size_pre;
466reg[7:0] start_size2_buf_num;
467reg[7:0] start_size1_buf_num;
468reg[7:0] start_size0_buf_num;
469
470
471wire[7:0] byte_offset = (dma_data_offset[1:0] == 2'b01) ? 8'd64 :
472 (dma_data_offset[1:0] == 2'b10) ? 8'd128 : 8'd0;
473
474
475always @(cache_buf_size_sel)
476case(cache_buf_size_sel) //synopsys parallel_case full_case
4772'd0: cache_buf_size_dec = 8'h10; //4k
4782'd1: cache_buf_size_dec = 8'h20; //8k
4792'd2: cache_buf_size_dec = 8'h40; //16k
4802'd3: cache_buf_size_dec = 8'h80; //32k
481default: cache_buf_size_dec = 8'h10;
482endcase
483
484always @(size2_buf_size_sel)
485case(size2_buf_size_sel) //synopsys parallel_case full_case
4862'd0: size2_buf_size_dec = 8'h08; //2k
4872'd1: size2_buf_size_dec = 8'h10; //4k
4882'd2: size2_buf_size_dec = 8'h20; //8k
4892'd3: size2_buf_size_dec = 8'h40; //16k
490default: size2_buf_size_dec = 8'h08;
491endcase
492
493always @(size1_buf_size_sel)
494case(size1_buf_size_sel) //synopsys parallel_case full_case
4952'd0: size1_buf_size_dec = 8'h04; //1k
4962'd1: size1_buf_size_dec = 8'h08; //2k
4972'd2: size1_buf_size_dec = 8'h10; //4k
4982'd3: size1_buf_size_dec = 8'h20; //8k
499default: size1_buf_size_dec = 8'h04;
500endcase
501
502always @(size0_buf_size_sel)
503case(size0_buf_size_sel) //synopsys parallel_case full_case
5042'd0: size0_buf_size_dec = 8'h01; //256
5052'd1: size0_buf_size_dec = 8'h02; //512
5062'd2: size0_buf_size_dec = 8'h04; //1k
5072'd3: size0_buf_size_dec = 8'h08; //2k
508default: size0_buf_size_dec = 8'h01;
509endcase
510
511
512always @(cache_buf_size_sel or size2_buf_size_sel)
513case(cache_buf_size_sel) //synopsys parallel_case full_case
5142'b00: begin
515 case(size2_buf_size_sel) //synopsys parallel_case full_case
516 2'b00: size2_buf_num_dec = 8'd2;
517 2'b01: size2_buf_num_dec = 8'd1;
518 2'b10: size2_buf_num_dec = 8'd0;
519 2'b11: size2_buf_num_dec = 8'd0;
520 default:size2_buf_num_dec = 8'd0;
521 endcase
522 end
5232'b01: begin
524 case(size2_buf_size_sel) //synopsys parallel_case full_case
525 2'b00: size2_buf_num_dec = 8'd4;
526 2'b01: size2_buf_num_dec = 8'd2;
527 2'b10: size2_buf_num_dec = 8'd1;
528 2'b11: size2_buf_num_dec = 8'd0;
529 default:size2_buf_num_dec = 8'd0;
530 endcase
531 end
5322'b10: begin
533 case(size2_buf_size_sel) //synopsys parallel_case full_case
534 2'b00: size2_buf_num_dec = 8'd8;
535 2'b01: size2_buf_num_dec = 8'd4;
536 2'b10: size2_buf_num_dec = 8'd2;
537 2'b11: size2_buf_num_dec = 8'd1;
538 default:size2_buf_num_dec = 8'd1;
539 endcase
540 end
5412'b11: begin
542 case(size2_buf_size_sel) //synopsys parallel_case full_case
543 2'b00: size2_buf_num_dec = 8'd16;
544 2'b01: size2_buf_num_dec = 8'd8;
545 2'b10: size2_buf_num_dec = 8'd4;
546 2'b11: size2_buf_num_dec = 8'd2;
547 default:size2_buf_num_dec = 8'd2;
548 endcase
549 end
550default: size2_buf_num_dec = 8'd0;
551endcase
552
553always @(cache_buf_size_sel or size1_buf_size_sel)
554case(cache_buf_size_sel) //synopsys parallel_case full_case
5552'b00: begin
556 case(size1_buf_size_sel) //synopsys parallel_case full_case
557 2'b00: size1_buf_num_dec = 8'd4;
558 2'b01: size1_buf_num_dec = 8'd2;
559 2'b10: size1_buf_num_dec = 8'd1;
560 2'b11: size1_buf_num_dec = 8'd0;
561 default:size1_buf_num_dec = 8'd0;
562 endcase
563 end
5642'b01: begin
565 case(size1_buf_size_sel) //synopsys parallel_case full_case
566 2'b00: size1_buf_num_dec = 8'd8;
567 2'b01: size1_buf_num_dec = 8'd4;
568 2'b10: size1_buf_num_dec = 8'd2;
569 2'b11: size1_buf_num_dec = 8'd1;
570 default:size1_buf_num_dec = 8'd1;
571 endcase
572 end
5732'b10: begin
574 case(size1_buf_size_sel) //synopsys parallel_case full_case
575 2'b00: size1_buf_num_dec = 8'd16;
576 2'b01: size1_buf_num_dec = 8'd8;
577 2'b10: size1_buf_num_dec = 8'd4;
578 2'b11: size1_buf_num_dec = 8'd2;
579 default:size1_buf_num_dec = 8'd2;
580 endcase
581 end
5822'b11: begin
583 case(size1_buf_size_sel) //synopsys parallel_case full_case
584 2'b00: size1_buf_num_dec = 8'd32;
585 2'b01: size1_buf_num_dec = 8'd16;
586 2'b10: size1_buf_num_dec = 8'd8;
587 2'b11: size1_buf_num_dec = 8'd4;
588 default:size1_buf_num_dec = 8'd4;
589 endcase
590 end
591default: size1_buf_num_dec = 8'd0;
592endcase
593
594always @(cache_buf_size_sel or size0_buf_size_sel)
595case(cache_buf_size_sel) //synopsys parallel_case full_case
5962'b00: begin
597 case(size0_buf_size_sel) //synopsys parallel_case full_case
598 2'b00: size0_buf_num_dec = 8'd16;
599 2'b01: size0_buf_num_dec = 8'd8;
600 2'b10: size0_buf_num_dec = 8'd4;
601 2'b11: size0_buf_num_dec = 8'd2;
602 default:size0_buf_num_dec = 8'd2;
603 endcase
604 end
6052'b01: begin
606 case(size0_buf_size_sel) //synopsys parallel_case full_case
607 2'b00: size0_buf_num_dec = 8'd32;
608 2'b01: size0_buf_num_dec = 8'd16;
609 2'b10: size0_buf_num_dec = 8'd8;
610 2'b11: size0_buf_num_dec = 8'd4;
611 default:size0_buf_num_dec = 8'd4;
612 endcase
613 end
6142'b10: begin
615 case(size0_buf_size_sel) //synopsys parallel_case full_case
616 2'b00: size0_buf_num_dec = 8'd64;
617 2'b01: size0_buf_num_dec = 8'd32;
618 2'b10: size0_buf_num_dec = 8'd16;
619 2'b11: size0_buf_num_dec = 8'd8;
620 default:size0_buf_num_dec = 8'd8;
621 endcase
622 end
6232'b11: begin
624 case(size0_buf_size_sel) //synopsys parallel_case full_case
625 2'b00: size0_buf_num_dec = 8'd128;
626 2'b01: size0_buf_num_dec = 8'd64;
627 2'b10: size0_buf_num_dec = 8'd32;
628 2'b11: size0_buf_num_dec = 8'd16;
629 default:size0_buf_num_dec = 8'd16;
630 endcase
631 end
632default: size0_buf_num_dec = 8'd0;
633endcase
634
635
636always @ (posedge clk)
637if (reset)
638 cache_buf_size_pre <= 8'b0;
639else
640 cache_buf_size_pre <= cache_buf_size_dec;
641
642wire[15:0] cache_buf_size = {cache_buf_size_pre[7:0], 8'b0};
643wire[9:0] cache_buf_size1_in = {cache_buf_size_dec[7:0], 2'b0} - {8'b0, byte_offset[7:6]};
644
645always @ (posedge clk)
646if (reset)
647 cache_buf_size1_pre <= 10'b0;
648else
649 cache_buf_size1_pre <= cache_buf_size1_in;
650
651//wire[15:0] cache_buf_size1 = {cache_buf_size1_pre[9:0], 6'b0};
652wire[13:0] cache_buf_size1 = {cache_buf_size1_pre[7:0], 6'b0};
653wire[10:0] cache_buf_size2_in = {cache_buf_size_pre[7:0], 3'b0} - {9'b0, byte_offset[7:6]};
654
655always @ (posedge clk)
656if (reset)
657 cache_buf_size2_pre <= 11'b0;
658else
659 cache_buf_size2_pre <= cache_buf_size2_in;
660
661
662//wire[16:0] cache_buf_size2 = {cache_buf_size2_pre[10:0], 6'b0};
663wire[15:0] cache_buf_size2 = {cache_buf_size2_pre[9:0], 6'b0};
664wire[10:0] cache_buf_size3_in = cache_buf_size2_pre[10:0] + {1'b0, cache_buf_size1_pre[9:0]};
665
666always @ (posedge clk)
667if (reset)
668 cache_buf_size3_pre <= 11'b0;
669else
670 cache_buf_size3_pre <= cache_buf_size3_in;
671
672wire[16:0] cache_buf_size3 = {cache_buf_size3_pre[10:0], 6'b0};
673
674
675always @ (posedge clk)
676if (reset)
677 size2_buf_size_pre <= 8'b0;
678else
679 size2_buf_size_pre <= size2_buf_size_dec;
680
681wire[15:0] size2_buf_size = {size2_buf_size_pre[7:0], 8'b0};
682
683always @ (posedge clk)
684if (reset)
685 size1_buf_size_pre <= 8'b0;
686else
687 size1_buf_size_pre <= size1_buf_size_dec;
688
689wire[15:0] size1_buf_size = {size1_buf_size_pre[7:0], 8'b0};
690
691always @ (posedge clk)
692if (reset)
693 size0_buf_size_pre <= 8'b0;
694else
695 size0_buf_size_pre <= size0_buf_size_dec;
696
697wire[15:0] size0_buf_size = {size0_buf_size_pre[7:0], 8'b0};
698
699
700always @ (posedge clk)
701if (reset)
702 start_size2_buf_num <= 8'b0;
703else
704 start_size2_buf_num <= size2_buf_num_dec;
705
706
707always @ (posedge clk)
708if (reset)
709 start_size1_buf_num <= 8'b0;
710else
711 start_size1_buf_num <= size1_buf_num_dec;
712
713always @ (posedge clk)
714if (reset)
715 start_size0_buf_num <= 8'b0;
716else
717 start_size0_buf_num <= size0_buf_num_dec;
718
719
720/*********************************/
721// cache memory manager
722/*********************************/
723reg cache_buf_rd_gnt_dly1;
724reg cache_buf_rd_gnt_dly2;
725reg cache_buf_rd_gnt_dly3;
726
727reg[7:0] cache_wr_ptr;
728reg[7:0] cache_rd_ptr;
729reg[2:0] cache_rd_cnt; //at most read 4 addresses
730
731wire cache_buf_wr_gnt = fetch_desp_resp_vld & rdmc_resp_data_valid;
732wire last_rd_ptr = (cache_space_cnt == `CACHE_LEN_SUB1);
733wire last_wr_ptr = (cache_space_cnt == 8'd1);
734
735wire last_wr_addr = (cache_wr_ptr == cache_end_addr);
736wire last_rd_addr = (cache_rd_ptr == cache_end_addr);
737
738always @ (posedge clk)
739if (reset)
740 cache_wr_ptr <= cache_start_addr;
741else if (dma_reset)
742 cache_wr_ptr <= cache_start_addr;
743else if (cache_buf_wr_gnt & last_wr_addr)
744 cache_wr_ptr <= cache_start_addr;
745else if (cache_buf_wr_gnt)
746 cache_wr_ptr <= cache_wr_ptr + 8'd1;
747else
748 cache_wr_ptr <= cache_wr_ptr;
749
750always @ (posedge clk)
751if (reset)
752 cache_rd_ptr <= cache_start_addr;
753else if (dma_reset)
754 cache_rd_ptr <= cache_start_addr;
755else if (cache_buf_rd_gnt_dly3 & last_rd_addr)
756 cache_rd_ptr <= cache_start_addr;
757else if (cache_buf_rd_gnt_dly3)
758 cache_rd_ptr <= cache_rd_ptr + 8'd1;
759else
760 cache_rd_ptr <= cache_rd_ptr;
761
762always @ (posedge clk)
763if (reset)
764 cache_buf_empty <= 1'b1;
765else if (dma_reset)
766 cache_buf_empty <= 1'b1;
767else if (cache_buf_wr_gnt)
768 cache_buf_empty <= 1'b0;
769else if (cache_buf_rd_gnt_dly3 & last_rd_ptr)
770 cache_buf_empty <= 1'b1;
771else
772 cache_buf_empty <= cache_buf_empty;
773
774
775always @ (posedge clk)
776if (reset)
777 cache_buf_full <= 1'b0;
778else if (dma_reset)
779 cache_buf_full <= 1'b0;
780else if (cache_buf_rd_gnt_dly3)
781 cache_buf_full <= 1'b0;
782else if (cache_buf_wr_gnt & last_wr_ptr)
783 cache_buf_full <= 1'b1;
784else
785 cache_buf_full <= cache_buf_full;
786
787always @ (posedge clk)
788if (reset)
789 cache_space_cnt <= `CACHE_LEN;
790else if (dma_reset)
791 cache_space_cnt <= `CACHE_LEN;
792else if (cache_buf_wr_gnt & cache_buf_rd_gnt_dly3)
793 cache_space_cnt <= cache_space_cnt;
794else if (cache_buf_wr_gnt)
795 cache_space_cnt <= cache_space_cnt - 8'd1;
796else if (cache_buf_rd_gnt_dly3)
797 cache_space_cnt <= cache_space_cnt + 8'd1;
798else
799 cache_space_cnt <= cache_space_cnt;
800
801
802wire[3:0] cache_rd_valid_bits = cache_buf_rd_data[131:128];
803
804always @ (posedge clk)
805if (reset)
806 cache_buf_rd_gnt_dly1 <= 1'b0;
807else if (dma_reset)
808 cache_buf_rd_gnt_dly1 <= 1'b0;
809else
810 cache_buf_rd_gnt_dly1 <= cache_buf_rd_gnt;
811
812always @ (posedge clk)
813if (reset)
814begin
815 cache_buf_rd_gnt_dly2 <= 1'b0;
816 cache_buf_rd_gnt_dly3 <= 1'b0;
817end
818else
819begin
820 cache_buf_rd_gnt_dly2 <= cache_buf_rd_gnt_dly1;
821 cache_buf_rd_gnt_dly3 <= cache_buf_rd_gnt_dly2;
822end
823
824always @ (cache_rd_valid_bits)
825begin
826
827case (cache_rd_valid_bits) //synopsys parallel_case full_case
828
8294'b0001, 4'b0010, 4'b0100, 4'b1000:
830 cache_rd_cnt = 3'b001;
8314'b0011, 4'b0110, 4'b1100:
832 cache_rd_cnt = 3'b010;
8334'b0111, 4'b1110:
834 cache_rd_cnt = 3'b011;
8354'b1111:
836 cache_rd_cnt = 3'b100;
837default:
838 cache_rd_cnt = 3'b000;
839endcase
840end
841
842always @ (posedge clk)
843if (reset)
844 inc_cache_buf_cnt <= 1'b0;
845else if (dma_reset)
846 inc_cache_buf_cnt <= 1'b0;
847else if (fetch_desp_pre_done & cache_buf_rd_gnt_dly3)
848 inc_cache_buf_cnt <= 1'b1;
849else
850 inc_cache_buf_cnt <= 1'b0;
851
852always @ (posedge clk)
853if (reset)
854 cache_buf_cnt <= 8'b0;
855else if (dma_reset)
856 cache_buf_cnt <= 8'b0;
857else if (fetch_desp_pre_done & !cache_buf_rd_gnt_dly3 | inc_cache_buf_cnt)
858 cache_buf_cnt <= cache_buf_cnt + {3'b0, fetch_desp_num[4:0]};
859else if (cache_buf_rd_gnt_dly3)
860 cache_buf_cnt <= cache_buf_cnt - {5'b0, cache_rd_cnt};
861else
862 cache_buf_cnt <= cache_buf_cnt;
863
864
865/************************/
866//Discard pkt
867/************************/
868reg chnl_sel_buf_en;
869reg sel_buf_en_r; //same as chnl_sel_buf_en
870reg drop_pkt;
871reg wred_drop_pkt;
872
873wire buf_addr_not_valid;
874wire rbr_drop_pkt;
875wire rcr_drop_pkt;
876wire shadow_not_empty = (|shadw_curr_space_cnt);
877wire shadow_not_e_empty = (|shadw_curr_space_cnt[7:2]) | (&shadw_curr_space_cnt[1:0]);
878
879wire is_drop_pkt_tmp = wred_drop_pkt | rcr_drop_pkt | muxed_drop_pkt_r | dma_fatal_err | !dma_en;
880wire sel_buf_enabled_tmp = chnl_sel_buf_en & !is_drop_pkt_tmp;
881
882wire is_drop_pkt = is_drop_pkt_tmp | rbr_drop_pkt;
883wire sel_buf_enabled = chnl_sel_buf_en & !is_drop_pkt;
884
885always @ (posedge clk)
886if (reset)
887 chnl_sel_buf_en <= 1'b0;
888else if (dma_reset)
889 chnl_sel_buf_en <= 1'b0;
890else
891 chnl_sel_buf_en <= sel_buf_en & (muxed_rdc_num_r == dma_chnl_grp_id);
892
893always @ (posedge clk)
894if (reset)
895 sel_buf_en_r <= 1'b0;
896else if (dma_reset)
897 sel_buf_en_r <= 1'b0;
898else
899 sel_buf_en_r <= sel_buf_en & (muxed_rdc_num_r == dma_chnl_grp_id);
900
901always @ (posedge clk)
902if (reset)
903 drop_pkt <= 1'b0;
904else if (dma_reset)
905 drop_pkt <= 1'b0;
906else if (chnl_sel_buf_en)
907 drop_pkt <= (is_drop_pkt | buf_addr_not_valid);
908else
909 drop_pkt <= 1'b0;
910
911/*********************************/
912// prefetch buffer manager
913/*********************************/
914reg[3:0] use_pref_buf; //pkt use pref buf, in stage2
915reg[3:0] unload_pref_buf; //size load pref buf, not in stage2
916reg is_last_pref_buf;
917reg d_pref_buf_valid;
918reg t_pref_buf_valid;
919
920reg[127:0] pref_buf_addr_reg;
921reg pref_buf0_valid;
922reg pref_buf1_valid;
923reg pref_buf2_valid;
924reg pref_buf3_valid;
925reg cache_read_req;
926
927reg size0_buf_req;
928reg size1_buf_req;
929reg size2_buf_req;
930
931reg[31:0] pref_buf_addr0;
932reg[31:0] pref_buf_addr1;
933reg[31:0] pref_buf_addr2;
934reg[31:0] pref_buf_addr3;
935
936
937wire get_pkt_pref_buf;
938wire pkt_pref_buf_in_use;
939
940wire chnl_cache_parity_err = cache_buf_rd_gnt_dly3 & cache_parity_err;
941wire load_pref_buf = cache_buf_rd_gnt_dly3 & !cache_parity_err;
942
943wire[31:0] pref_buf_addr_tmp0 = cache_buf_rd_data[31:0];
944wire[31:0] pref_buf_addr_tmp1 = cache_buf_rd_data[63:32];
945wire[31:0] pref_buf_addr_tmp2 = cache_buf_rd_data[95:64];
946wire[31:0] pref_buf_addr_tmp3 = cache_buf_rd_data[127:96];
947
948always @(cache_buf_size_sel or
949 pref_buf_addr_tmp0 or pref_buf_addr_tmp1 or
950 pref_buf_addr_tmp2 or pref_buf_addr_tmp3)
951
952case(cache_buf_size_sel) //synopsys parallel_case full_case
9532'b00: begin
954 pref_buf_addr0 = pref_buf_addr_tmp0[31:0];
955 pref_buf_addr1 = pref_buf_addr_tmp1[31:0];
956 pref_buf_addr2 = pref_buf_addr_tmp2[31:0];
957 pref_buf_addr3 = pref_buf_addr_tmp3[31:0];
958 end
9592'b01: begin
960 pref_buf_addr0 = {pref_buf_addr_tmp0[31:1], 1'b0};
961 pref_buf_addr1 = {pref_buf_addr_tmp1[31:1], 1'b0};
962 pref_buf_addr2 = {pref_buf_addr_tmp2[31:1], 1'b0};
963 pref_buf_addr3 = {pref_buf_addr_tmp3[31:1], 1'b0};
964 end
9652'b10: begin
966 pref_buf_addr0 = {pref_buf_addr_tmp0[31:2], 2'b0};
967 pref_buf_addr1 = {pref_buf_addr_tmp1[31:2], 2'b0};
968 pref_buf_addr2 = {pref_buf_addr_tmp2[31:2], 2'b0};
969 pref_buf_addr3 = {pref_buf_addr_tmp3[31:2], 2'b0};
970 end
9712'b11: begin
972 pref_buf_addr0 = {pref_buf_addr_tmp0[31:3], 3'b0};
973 pref_buf_addr1 = {pref_buf_addr_tmp1[31:3], 3'b0};
974 pref_buf_addr2 = {pref_buf_addr_tmp2[31:3], 3'b0};
975 pref_buf_addr3 = {pref_buf_addr_tmp3[31:3], 3'b0};
976 end
977default: begin
978 pref_buf_addr0 = pref_buf_addr_tmp0[31:0];
979 pref_buf_addr1 = pref_buf_addr_tmp1[31:0];
980 pref_buf_addr2 = pref_buf_addr_tmp2[31:0];
981 pref_buf_addr3 = pref_buf_addr_tmp3[31:0];
982 end
983endcase
984
985
986always @ (posedge clk)
987if (reset)
988 pref_buf_addr_reg <= 128'b0;
989else if (load_pref_buf)
990 pref_buf_addr_reg <= {pref_buf_addr3, pref_buf_addr2, pref_buf_addr1, pref_buf_addr0};
991else
992 pref_buf_addr_reg <= pref_buf_addr_reg;
993
994always @ (posedge clk)
995if (reset)
996 pref_buf0_valid <= 1'b0;
997else if (dma_reset)
998 pref_buf0_valid <= 1'b0;
999else if (unload_pref_buf[0] | get_pkt_pref_buf & use_pref_buf[0])
1000 pref_buf0_valid <= 1'b0;
1001else if (load_pref_buf)
1002 pref_buf0_valid <= cache_rd_valid_bits[0];
1003else
1004 pref_buf0_valid <= pref_buf0_valid;
1005
1006always @ (posedge clk)
1007if (reset)
1008 pref_buf1_valid <= 1'b0;
1009else if (dma_reset)
1010 pref_buf1_valid <= 1'b0;
1011else if (unload_pref_buf[1] | get_pkt_pref_buf & use_pref_buf[1])
1012 pref_buf1_valid <= 1'b0;
1013else if (load_pref_buf)
1014 pref_buf1_valid <= cache_rd_valid_bits[1];
1015else
1016 pref_buf1_valid <= pref_buf1_valid;
1017
1018always @ (posedge clk)
1019if (reset)
1020 pref_buf2_valid <= 1'b0;
1021else if (dma_reset)
1022 pref_buf2_valid <= 1'b0;
1023else if (unload_pref_buf[2] | get_pkt_pref_buf & use_pref_buf[2])
1024 pref_buf2_valid <= 1'b0;
1025else if (load_pref_buf)
1026 pref_buf2_valid <= cache_rd_valid_bits[2];
1027else
1028 pref_buf2_valid <= pref_buf2_valid;
1029
1030always @ (posedge clk)
1031if (reset)
1032 pref_buf3_valid <= 1'b0;
1033else if (dma_reset)
1034 pref_buf3_valid <= 1'b0;
1035else if (unload_pref_buf[3] | get_pkt_pref_buf & use_pref_buf[3])
1036 pref_buf3_valid <= 1'b0;
1037else if (load_pref_buf)
1038 pref_buf3_valid <= cache_rd_valid_bits[3];
1039else
1040 pref_buf3_valid <= pref_buf3_valid;
1041
1042
1043wire[3:0] pref_buf_valid_bits = {pref_buf3_valid, pref_buf2_valid, pref_buf1_valid, pref_buf0_valid};
1044wire pref_buf_valid = |pref_buf_valid_bits;
1045
1046wire[31:0] muxed_pref_buf_addr = pref_buf0_valid ? pref_buf_addr_reg[31:0] :
1047 pref_buf1_valid ? pref_buf_addr_reg[63:32] :
1048 pref_buf2_valid ? pref_buf_addr_reg[95:64] :
1049 pref_buf_addr_reg[127:96];
1050
1051wire size_buf_req = size0_buf_req | size1_buf_req | size2_buf_req;
1052
1053always @ (pref_buf_valid_bits)
1054begin
1055
1056case (pref_buf_valid_bits) //synopsys parallel_case full_case
1057
10584'b0001, 4'b0010, 4'b0100, 4'b1000:
1059 begin
1060 is_last_pref_buf = 1'b1;
1061 d_pref_buf_valid = 1'b0;
1062 t_pref_buf_valid = 1'b0;
1063 end
10644'b0011, 4'b0110, 4'b1100:
1065 begin
1066 is_last_pref_buf = 1'b0;
1067 d_pref_buf_valid = 1'b1;
1068 t_pref_buf_valid = 1'b0;
1069 end
10704'b0111, 4'b1110:
1071 begin
1072 is_last_pref_buf = 1'b0;
1073 d_pref_buf_valid = 1'b1;
1074 t_pref_buf_valid = 1'b1;
1075 end
10764'b1111:
1077 begin
1078 is_last_pref_buf = 1'b0;
1079 d_pref_buf_valid = 1'b1;
1080 t_pref_buf_valid = 1'b1;
1081 end
1082default:
1083 begin
1084 is_last_pref_buf = 1'b0;
1085 d_pref_buf_valid = 1'b0;
1086 t_pref_buf_valid = 1'b0;
1087 end
1088endcase
1089end
1090
1091
1092always @ (pref_buf_valid_bits or size_buf_req or pkt_pref_buf_in_use)
1093begin
1094 if (size_buf_req & !pkt_pref_buf_in_use)
1095 begin
1096 if (pref_buf_valid_bits[0])
1097 unload_pref_buf = 4'b0001;
1098 else if (pref_buf_valid_bits[1])
1099 unload_pref_buf = 4'b0010;
1100 else if (pref_buf_valid_bits[2])
1101 unload_pref_buf = 4'b0100;
1102 else if (pref_buf_valid_bits[3])
1103 unload_pref_buf = 4'b1000;
1104 else
1105 unload_pref_buf = 4'b0000;
1106 end
1107 else
1108 unload_pref_buf = 4'b0000;
1109end
1110
1111wire cache_buf_rd_gnt_p = cache_buf_rd_gnt | cache_buf_rd_gnt_dly1 |
1112 cache_buf_rd_gnt_dly2 | cache_buf_rd_gnt_dly3;
1113
1114always @ (posedge clk)
1115if (reset)
1116 cache_read_req <= 1'b0;
1117else if (dma_reset)
1118 cache_read_req <= 1'b0;
1119else if (cache_buf_rd_gnt_p)
1120 cache_read_req <= 1'b0;
1121else if (!cache_buf_empty & (is_last_pref_buf & (|unload_pref_buf) | !pref_buf_valid))
1122 cache_read_req <= 1'b1;
1123else
1124 cache_read_req <= cache_read_req;
1125
1126
1127/*********************************/
1128// size buffer manager
1129/*********************************/
1130reg[2:0] load_size_buf;
1131reg size0_buf_valid;
1132reg size1_buf_valid;
1133reg size2_buf_valid;
1134reg[7:0] curr_size0_buf_num;
1135reg[7:0] curr_size1_buf_num;
1136reg[7:0] curr_size2_buf_num;
1137reg[35:0] curr_size0_buf_addr_pre;
1138reg[35:0] curr_size1_buf_addr_pre;
1139reg[35:0] curr_size2_buf_addr_pre;
1140
1141wire use_size0_buf;
1142wire use_size1_buf;
1143wire use_size2_buf;
1144
1145wire is_last_size0_buf = sel_buf_enabled & use_size0_buf & (curr_size0_buf_num == 8'h01);
1146wire is_last_size1_buf = sel_buf_enabled & use_size1_buf & (curr_size1_buf_num == 8'h01);
1147wire is_last_size2_buf = sel_buf_enabled & use_size2_buf & (curr_size2_buf_num == 8'h01);
1148
1149always @ (posedge clk)
1150if (reset)
1151 size0_buf_valid <= 1'b0;
1152else if (dma_reset)
1153 size0_buf_valid <= 1'b0;
1154else if (is_last_size0_buf)
1155 size0_buf_valid <= 1'b0;
1156else if (load_size_buf[0])
1157 size0_buf_valid <= 1'b1;
1158else
1159 size0_buf_valid <= size0_buf_valid;
1160
1161always @ (posedge clk)
1162if (reset)
1163 size1_buf_valid <= 1'b0;
1164else if (dma_reset)
1165 size1_buf_valid <= 1'b0;
1166else if (is_last_size1_buf)
1167 size1_buf_valid <= 1'b0;
1168else if (load_size_buf[1])
1169 size1_buf_valid <= 1'b1;
1170else
1171 size1_buf_valid <= size1_buf_valid;
1172
1173always @ (posedge clk)
1174if (reset)
1175 size2_buf_valid <= 1'b0;
1176else if (dma_reset)
1177 size2_buf_valid <= 1'b0;
1178else if (is_last_size2_buf)
1179 size2_buf_valid <= 1'b0;
1180else if (load_size_buf[2])
1181 size2_buf_valid <= 1'b1;
1182else
1183 size2_buf_valid <= size2_buf_valid;
1184
1185
1186always @ (posedge clk)
1187if (reset)
1188 curr_size0_buf_num <= 8'b0;
1189else if (dma_reset)
1190 curr_size0_buf_num <= 8'b0;
1191else if (sel_buf_enabled & use_size0_buf)
1192 curr_size0_buf_num <= curr_size0_buf_num - 8'h01;
1193else if (load_size_buf[0])
1194 curr_size0_buf_num <= start_size0_buf_num;
1195else
1196 curr_size0_buf_num <= curr_size0_buf_num;
1197
1198
1199always @ (posedge clk)
1200if (reset)
1201 curr_size1_buf_num <= 8'b0;
1202else if (dma_reset)
1203 curr_size1_buf_num <= 8'b0;
1204else if (sel_buf_enabled & use_size1_buf)
1205 curr_size1_buf_num <= curr_size1_buf_num - 8'h01;
1206else if (load_size_buf[1])
1207 curr_size1_buf_num <= start_size1_buf_num;
1208else
1209 curr_size1_buf_num <= curr_size1_buf_num;
1210
1211
1212always @ (posedge clk)
1213if (reset)
1214 curr_size2_buf_num <= 8'b0;
1215else if (dma_reset)
1216 curr_size2_buf_num <= 8'b0;
1217else if (sel_buf_enabled & use_size2_buf)
1218 curr_size2_buf_num <= curr_size2_buf_num - 8'h01;
1219else if (load_size_buf[2])
1220 curr_size2_buf_num <= start_size2_buf_num;
1221else
1222 curr_size2_buf_num <= curr_size2_buf_num;
1223
1224
1225wire[43:0] curr_size0_buf_addr = {curr_size0_buf_addr_pre[35:0], 8'b0};
1226wire[43:0] curr_size1_buf_addr = {curr_size1_buf_addr_pre[35:0], 8'b0};
1227wire[43:0] curr_size2_buf_addr = {curr_size2_buf_addr_pre[35:0], 8'b0};
1228
1229wire[7:0] next_size0_buf_addr_tmp = curr_size0_buf_addr_pre[7:0] + size0_buf_size[15:8];
1230wire[35:0] next_size0_buf_addr = {curr_size0_buf_addr_pre[35:8], next_size0_buf_addr_tmp[7:0]};
1231
1232wire[7:0] next_size1_buf_addr_tmp = curr_size1_buf_addr_pre[7:0] + size1_buf_size[15:8];
1233wire[35:0] next_size1_buf_addr = {curr_size1_buf_addr_pre[35:8], next_size1_buf_addr_tmp[7:0]};
1234
1235wire[7:0] next_size2_buf_addr_tmp = curr_size2_buf_addr_pre[7:0] + size2_buf_size[15:8];
1236wire[35:0] next_size2_buf_addr = {curr_size2_buf_addr_pre[35:8], next_size2_buf_addr_tmp[7:0]};
1237
1238
1239always @ (posedge clk)
1240if (reset)
1241 curr_size0_buf_addr_pre <= 36'b0;
1242else if (sel_buf_enabled & use_size0_buf)
1243 curr_size0_buf_addr_pre <= next_size0_buf_addr;
1244else if (load_size_buf[0])
1245 curr_size0_buf_addr_pre <= {muxed_pref_buf_addr, 4'b0};
1246else
1247 curr_size0_buf_addr_pre <= curr_size0_buf_addr_pre;
1248
1249always @ (posedge clk)
1250if (reset)
1251 curr_size1_buf_addr_pre <= 36'b0;
1252else if (sel_buf_enabled & use_size1_buf)
1253 curr_size1_buf_addr_pre <= next_size1_buf_addr;
1254else if (load_size_buf[1])
1255 curr_size1_buf_addr_pre <= {muxed_pref_buf_addr, 4'b0};
1256else
1257 curr_size1_buf_addr_pre <= curr_size1_buf_addr_pre;
1258
1259always @ (posedge clk)
1260if (reset)
1261 curr_size2_buf_addr_pre <= 36'b0;
1262else if (sel_buf_enabled & use_size2_buf)
1263 curr_size2_buf_addr_pre <= next_size2_buf_addr;
1264else if (load_size_buf[2])
1265 curr_size2_buf_addr_pre <= {muxed_pref_buf_addr, 4'b0};
1266else
1267 curr_size2_buf_addr_pre <= curr_size2_buf_addr_pre;
1268
1269/**************************************/
1270//req for loading new size buffer
1271/**************************************/
1272always @ (posedge clk)
1273if (reset)
1274 size0_buf_req <= 1'b0;
1275else if (dma_reset)
1276 size0_buf_req <= 1'b0;
1277else if (load_size_buf[0])
1278 size0_buf_req <= 1'b0;
1279else if ((is_last_size0_buf | !size0_buf_valid) & size0_config_valid)
1280 size0_buf_req <= 1'b1;
1281else
1282 size0_buf_req <= size0_buf_req;
1283
1284always @ (posedge clk)
1285if (reset)
1286 size1_buf_req <= 1'b0;
1287else if (dma_reset)
1288 size1_buf_req <= 1'b0;
1289else if (load_size_buf[1])
1290 size1_buf_req <= 1'b0;
1291else if ((is_last_size1_buf | !size1_buf_valid) & size1_config_valid)
1292 size1_buf_req <= 1'b1;
1293else
1294 size1_buf_req <= size1_buf_req;
1295
1296always @ (posedge clk)
1297if (reset)
1298 size2_buf_req <= 1'b0;
1299else if (dma_reset)
1300 size2_buf_req <= 1'b0;
1301else if (load_size_buf[2])
1302 size2_buf_req <= 1'b0;
1303else if ((is_last_size2_buf | !size2_buf_valid) & size2_config_valid)
1304 size2_buf_req <= 1'b1;
1305else
1306 size2_buf_req <= size2_buf_req;
1307
1308
1309always @ (size0_buf_req or size1_buf_req or
1310 size2_buf_req or pref_buf_valid or pkt_pref_buf_in_use)
1311begin
1312 if (pref_buf_valid & !pkt_pref_buf_in_use)
1313 begin
1314 if (size2_buf_req)
1315 load_size_buf = 3'b100;
1316 else if (size1_buf_req)
1317 load_size_buf = 3'b010;
1318 else if (size0_buf_req)
1319 load_size_buf = 3'b001;
1320 else
1321 load_size_buf = 3'b000;
1322 end
1323 else load_size_buf = 3'b000;
1324end
1325
1326
1327/***********************************************************/
1328//select proper buffer for incoming pkt
1329/***********************************************************/
1330reg chnl_sel_buf_en_r;
1331reg[7:0] pkt_hdr_byte_r;
1332reg[13:0] muxed_pkt_len_r;
1333reg[14:0] full_len_r;
1334reg[13:0] pkt_len_leftover;
1335reg[13:0] pkt_trans_len;
1336
1337reg sel_size0_buf_r;
1338reg sel_size1_buf_r;
1339reg sel_size2_buf_r;
1340reg sel_1pref_buf_r;
1341reg sel_2pref_buf_r;
1342reg sel_3pref_buf_r;
1343reg sel_size_buf_r;
1344reg sel_size_buf_r1;
1345reg use_1pref_buf_r;
1346reg use_2pref_buf_r;
1347reg use_3pref_buf_r;
1348
1349reg pkt_buf_gnt;
1350reg[43:0] buf_new_addr_r;
1351reg[35:0] buf_addr_r;
1352reg[1:0] pkt_buf_size;
1353reg[1:0] pref_buf_used_num_r;
1354reg jmb_pkt_in_process;
1355
1356wire[7:0] pkt_hdr_byte = full_header ? (byte_offset + 8'd18) : (byte_offset + 8'd2);
1357wire[7:0] pkt_hdr_byte1 = full_header ? 8'd18 : 8'd2;
1358
1359wire[14:0] full_len1 = {1'b0, muxed_pkt_len[13:0]};
1360wire[14:0] full_len2 = {7'b0, pkt_hdr_byte_r[7:0]};
1361wire[14:0] full_len = full_len1 + full_len2; //include offset
1362
1363wire[13:0] real_len = muxed_pkt_len_r[13:0] + {6'b0, pkt_hdr_byte1[7:0]}; //not include offset
1364wire pkt_len_overflow= full_len_r[14];
1365
1366wire sel_size0_buf = (size0_buf_size[13:0] >= full_len_r[13:0]);
1367wire sel_size1_buf = (size1_buf_size[13:0] >= full_len_r[13:0]);
1368wire sel_size2_buf = (size2_buf_size[14:0] >= {1'b0, full_len_r[13:0]});
1369wire sel_1pref_buf = (cache_buf_size[15:0] >= {2'b0, full_len_r[13:0]});
1370wire sel_2pref_buf = (cache_buf_size2[15:0]>= {2'b0, full_len_r[13:0]});
1371wire sel_3pref_buf = (cache_buf_size3[16:0]>= {3'b0, full_len_r[13:0]});
1372
1373wire[35:0] orig_buf_addr = buf_addr_r[35:0];
1374
1375wire get_next_buf;
1376wire get_last_buf;
1377
1378always @ (posedge clk)
1379if (reset)
1380 pkt_hdr_byte_r <= 8'b0;
1381else
1382 pkt_hdr_byte_r <= pkt_hdr_byte;
1383
1384always @ (posedge clk)
1385if (reset)
1386 muxed_pkt_len_r <= 14'b0;
1387else
1388 muxed_pkt_len_r <= muxed_pkt_len[13:0];
1389
1390
1391always @ (posedge clk)
1392if (reset)
1393 full_len_r <= 15'b0;
1394else
1395 full_len_r <= full_len;
1396
1397
1398always @ (posedge clk)
1399if (reset)
1400 pkt_len_leftover <= 14'b0;
1401else if (sel_buf_en_r)
1402 pkt_len_leftover <= full_len_r[13:0] - cache_buf_size[13:0];
1403else if (get_next_buf)
1404 pkt_len_leftover <= pkt_len_leftover - cache_buf_size1[13:0];
1405else
1406 pkt_len_leftover <= pkt_len_leftover;
1407
1408
1409always @ (posedge clk)
1410if (reset)
1411 sel_size0_buf_r <= 1'b0;
1412else
1413 sel_size0_buf_r <= sel_size0_buf;
1414
1415always @ (posedge clk)
1416if (reset)
1417 sel_size1_buf_r <= 1'b0;
1418else
1419 sel_size1_buf_r <= sel_size1_buf;
1420
1421always @ (posedge clk)
1422if (reset)
1423 sel_size2_buf_r <= 1'b0;
1424else
1425 sel_size2_buf_r <= sel_size2_buf;
1426
1427
1428always @ (posedge clk)
1429if (reset)
1430begin
1431 sel_size_buf_r <= 1'b0;
1432 sel_size_buf_r1 <= 1'b0;
1433end
1434else
1435begin
1436 sel_size_buf_r <= (sel_size0_buf | sel_size1_buf | sel_size2_buf);
1437 sel_size_buf_r1 <= sel_size_buf_r;
1438end
1439
1440always @ (posedge clk)
1441if (reset)
1442 sel_1pref_buf_r <= 1'b0;
1443else
1444 sel_1pref_buf_r <= sel_1pref_buf;
1445
1446always @ (posedge clk)
1447if (reset)
1448 sel_2pref_buf_r <= 1'b0;
1449else
1450 sel_2pref_buf_r <= sel_2pref_buf & !sel_1pref_buf;
1451
1452always @ (posedge clk)
1453if (reset)
1454 sel_3pref_buf_r <= 1'b0;
1455else
1456 sel_3pref_buf_r <= sel_3pref_buf & !(sel_1pref_buf | sel_2pref_buf);
1457
1458assign use_size0_buf = sel_size0_buf_r & size0_buf_valid;
1459wire use_size1_buf_tmp = sel_size1_buf_r & size1_buf_valid;
1460wire use_size2_buf_tmp = sel_size2_buf_r & size2_buf_valid;
1461assign use_size1_buf = !use_size0_buf & use_size1_buf_tmp;
1462assign use_size2_buf = !(use_size0_buf | use_size1_buf_tmp) & use_size2_buf_tmp;
1463
1464wire use_1pref_buf = !sel_size_buf_r & sel_1pref_buf_r & pref_buf_valid;
1465wire use_2pref_buf = !sel_size_buf_r & sel_2pref_buf_r & (d_pref_buf_valid | pref_buf_valid & !cache_buf_empty);
1466wire use_3pref_buf = !sel_size_buf_r & sel_3pref_buf_r & (pref_buf_valid & (|cache_buf_cnt[7:1]) |
1467 d_pref_buf_valid & !cache_buf_empty |
1468 t_pref_buf_valid);
1469
1470wire is_use_pref_buf = (use_1pref_buf | use_2pref_buf | use_3pref_buf) & !pkt_len_overflow;
1471wire is_use_size_buf = (use_size0_buf | use_size1_buf | use_size2_buf) & !pkt_len_overflow;
1472
1473wire buf_gnt = (is_use_pref_buf | is_use_size_buf);
1474
1475wire[1:0] buf_size_in = use_size0_buf ? 2'b00 :
1476 use_size1_buf ? 2'b01 :
1477 use_size2_buf ? 2'b10 :
1478 2'b11;
1479
1480always @ (posedge clk)
1481if (reset)
1482 pkt_buf_gnt <= 1'b0;
1483else if (dma_reset)
1484 pkt_buf_gnt <= 1'b0;
1485else if (sel_buf_enabled_tmp & !buf_addr_not_valid)
1486 pkt_buf_gnt <= buf_gnt;
1487else if (pkt_buf_done)
1488 pkt_buf_gnt <= 1'b0;
1489else
1490 pkt_buf_gnt <= pkt_buf_gnt;
1491
1492always @ (posedge clk)
1493if (reset)
1494 pkt_buf_size <= 2'b0;
1495else if (sel_buf_en_r)
1496 pkt_buf_size <= buf_size_in;
1497else
1498 pkt_buf_size <= pkt_buf_size;
1499
1500
1501assign rbr_drop_pkt = !buf_gnt;
1502assign rcr_drop_pkt = !((sel_size_buf_r | sel_1pref_buf_r) & shadow_not_empty | shadow_not_e_empty);
1503
1504
1505/*******************************/
1506//Calculate pkt transfer len
1507/*******************************/
1508wire chnl_pkt_cnt_done = pkt_req_cnt_e_done_mod & (muxed_rdc_num_r == dma_chnl_grp_id);
1509
1510wire jmb_pkt_mode = !(sel_size_buf_r | use_1pref_buf);
1511wire[1:0] pref_buf_used_num = (sel_size_buf_r1 | use_1pref_buf_r) ? 2'b01 :
1512 use_2pref_buf_r ? 2'b10 :
1513 use_3pref_buf_r ? 2'b11 : 2'b00;
1514
1515assign get_next_buf = chnl_pkt_cnt_done & is_hdr_wr_data & (&pref_buf_used_num_r);
1516assign get_last_buf = chnl_pkt_cnt_done & (is_hdr_wr_data & (pref_buf_used_num_r == 2'b10) |
1517 is_jmb1_wr_data & (pref_buf_used_num_r == 2'b11));
1518
1519wire[13:0] pkt_len_tmp = (jmb_pkt_mode & sel_buf_en_r) ? cache_buf_size1[13:0]:
1520 sel_buf_en_r ? real_len[13:0] :
1521 get_next_buf ? cache_buf_size1[13:0] : pkt_len_leftover;
1522
1523
1524always @ (posedge clk)
1525if (reset)
1526begin
1527 use_1pref_buf_r <= 1'b0;
1528 use_2pref_buf_r <= 1'b0;
1529 use_3pref_buf_r <= 1'b0;
1530end
1531else if (sel_buf_en_r)
1532begin
1533 use_1pref_buf_r <= use_1pref_buf;
1534 use_2pref_buf_r <= use_2pref_buf;
1535 use_3pref_buf_r <= use_3pref_buf;
1536end
1537
1538always @ (posedge clk)
1539if (reset)
1540 chnl_sel_buf_en_r <= 1'b0;
1541else if (dma_reset)
1542 chnl_sel_buf_en_r <= 1'b0;
1543else
1544 chnl_sel_buf_en_r <= sel_buf_enabled;
1545
1546always @ (posedge clk)
1547if (reset)
1548 pref_buf_used_num_r <= 2'b0;
1549else if (chnl_sel_buf_en_r)
1550 pref_buf_used_num_r <= pref_buf_used_num;
1551else
1552 pref_buf_used_num_r <= pref_buf_used_num_r;
1553
1554always @ (posedge clk)
1555if (reset)
1556 pkt_trans_len <= 14'b0;
1557else if (sel_buf_en_r | get_next_buf | get_last_buf)
1558 pkt_trans_len <= pkt_len_tmp;
1559else
1560 pkt_trans_len <= pkt_trans_len;
1561
1562/*******************************/
1563//Calculate pkt transfer addr
1564/*******************************/
1565assign get_pkt_pref_buf = sel_buf_enabled_tmp & is_use_pref_buf | get_next_buf | get_last_buf;
1566assign pkt_pref_buf_in_use = chnl_sel_buf_en | jmb_pkt_in_process;
1567
1568wire[43:0] buf_addr_tmp1= {44{use_size0_buf}} & curr_size0_buf_addr |
1569 {44{use_size1_buf}} & curr_size1_buf_addr |
1570 {44{use_size2_buf}} & curr_size2_buf_addr ;
1571
1572wire[43:0] buf_addr_tmp2= is_use_size_buf & sel_buf_en_r ? buf_addr_tmp1 : {muxed_pref_buf_addr, 12'b0};
1573
1574
1575wire[43:0] buf_addr = (dma_data_offset[1:0] == 2'b01) ? {buf_addr_tmp2[43:8], 8'b0100_0000} :
1576 (dma_data_offset[1:0] == 2'b10) ? {buf_addr_tmp2[43:8], 8'b1000_0000} :
1577 buf_addr_tmp2[43:0];
1578
1579
1580wire buf_addr_valid0 = ((buf_addr[43:12] & addr_mask0) == (comp_value0 & addr_mask0)) & page_valid0;
1581wire buf_addr_valid1 = ((buf_addr[43:12] & addr_mask1) == (comp_value1 & addr_mask1)) & page_valid1;
1582
1583assign buf_addr_not_valid = !(buf_addr_valid0 | buf_addr_valid1) & buf_gnt & chnl_sel_buf_en & dma_en;
1584
1585
1586wire[31:0] buf_relo_addr0 = (buf_addr[43:12] & ~addr_mask0) | (relo_value0 & addr_mask0);
1587wire[31:0] buf_relo_addr1 = (buf_addr[43:12] & ~addr_mask1) | (relo_value1 & addr_mask1);
1588wire[31:0] buf_relo_addr = buf_addr_valid0 ? buf_relo_addr0 : buf_relo_addr1;
1589wire[43:0] buf_new_addr = {buf_relo_addr, buf_addr[11:0]};
1590wire[63:0] pkt_buf_addr = {page_handle[19:0], buf_new_addr_r[43:0]};
1591
1592always @ (pref_buf_valid_bits)
1593begin
1594 if (pref_buf_valid_bits[0])
1595 use_pref_buf = 4'b0001;
1596 else if (pref_buf_valid_bits[1])
1597 use_pref_buf = 4'b0010;
1598 else if (pref_buf_valid_bits[2])
1599 use_pref_buf = 4'b0100;
1600 else if (pref_buf_valid_bits[3])
1601 use_pref_buf = 4'b1000;
1602 else
1603 use_pref_buf = 4'b0000;
1604end
1605
1606
1607always @ (posedge clk)
1608if (reset)
1609 jmb_pkt_in_process <= 1'b0;
1610else if (dma_reset)
1611 jmb_pkt_in_process <= 1'b0;
1612else if (sel_buf_enabled_tmp & (use_2pref_buf | use_3pref_buf))
1613 jmb_pkt_in_process <= 1'b1;
1614else if (get_last_buf)
1615 jmb_pkt_in_process <= 1'b0;
1616else
1617 jmb_pkt_in_process <= jmb_pkt_in_process;
1618
1619
1620always @ (posedge clk)
1621if (reset)
1622 buf_new_addr_r <= 44'b0;
1623else if (sel_buf_en_r | get_next_buf | get_last_buf)
1624 buf_new_addr_r <= buf_new_addr;
1625else
1626 buf_new_addr_r <= buf_new_addr_r;
1627
1628always @ (posedge clk)
1629if (reset)
1630 buf_addr_r <= 36'b0;
1631else if (sel_buf_en_r | get_next_buf | get_last_buf)
1632 buf_addr_r <= buf_addr[43:8];
1633else
1634 buf_addr_r <= buf_addr_r;
1635
1636
1637/*************************/
1638//Weighted RED
1639/*************************/
1640reg[15:0] wred_v2_tmp;
1641reg[16:0] wred_v1;
1642reg[15:0] wred_v2;
1643
1644wire[11:0] muxed_wred_thresh = muxed_s_event_r ? wred_thresh_syn : wred_thresh;
1645wire[3:0] muxed_wred_window = muxed_s_event_r ? wred_window_syn : wred_window;
1646
1647wire[16:0] wred_v1_tmp = {1'b0, rcr_curr_qlen[15:0]} - {5'b0, muxed_wred_thresh[11:0]};
1648//wire[15:0] wred_v2_msb = wred_v2_tmp[31:16];
1649//wire wred_v3_tmp = (wred_v2[15:0] < wred_v1[15:0]) & !wred_v1[16]; //drop pkt when cross (THRSH + WIN);
1650wire wred_v3_tmp = ((wred_v2[15:0] < wred_v1[15:0]) | (wred_v2[15:0] == wred_v1[15:0])) & !wred_v1[16]; //drop pkt when hit threshold
1651
1652always @ (muxed_wred_window or random_num)
1653begin
1654
1655case (muxed_wred_window) //synopsys parallel_case full_case
1656
1657/*
16584'd0: wred_v2_tmp = {16'b0, random_num};
16594'd1: wred_v2_tmp = {15'b0, random_num, 1'b0};
16604'd2: wred_v2_tmp = {14'b0, random_num, 2'b0};
16614'd3: wred_v2_tmp = {13'b0, random_num, 3'b0};
16624'd4: wred_v2_tmp = {12'b0, random_num, 4'b0};
16634'd5: wred_v2_tmp = {11'b0, random_num, 5'b0};
16644'd6: wred_v2_tmp = {10'b0, random_num, 6'b0};
16654'd7: wred_v2_tmp = {9'b0, random_num, 7'b0};
16664'd8: wred_v2_tmp = {8'b0, random_num, 8'b0};
16674'd9: wred_v2_tmp = {7'b0, random_num, 9'b0};
16684'd10: wred_v2_tmp = {6'b0, random_num, 10'b0};
16694'd11: wred_v2_tmp = {5'b0, random_num, 11'b0};
16704'd12: wred_v2_tmp = {4'b0, random_num, 12'b0};
16714'd13: wred_v2_tmp = {3'b0, random_num, 13'b0};
16724'd14: wred_v2_tmp = {2'b0, random_num, 14'b0};
16734'd15: wred_v2_tmp = {1'b0, random_num, 15'b0};
1674*/
1675
16764'd0: wred_v2_tmp = 16'b0;
16774'd1: wred_v2_tmp = {15'b0, random_num[15]};
16784'd2: wred_v2_tmp = {14'b0, random_num[15:14]};
16794'd3: wred_v2_tmp = {13'b0, random_num[15:13]};
16804'd4: wred_v2_tmp = {12'b0, random_num[15:12]};
16814'd5: wred_v2_tmp = {11'b0, random_num[15:11]};
16824'd6: wred_v2_tmp = {10'b0, random_num[15:10]};
16834'd7: wred_v2_tmp = {9'b0, random_num[15:9]};
16844'd8: wred_v2_tmp = {8'b0, random_num[15:8]};
16854'd9: wred_v2_tmp = {7'b0, random_num[15:7]};
16864'd10: wred_v2_tmp = {6'b0, random_num[15:6]};
16874'd11: wred_v2_tmp = {5'b0, random_num[15:5]};
16884'd12: wred_v2_tmp = {4'b0, random_num[15:4]};
16894'd13: wred_v2_tmp = {3'b0, random_num[15:3]};
16904'd14: wred_v2_tmp = {2'b0, random_num[15:2]};
16914'd15: wred_v2_tmp = {1'b0, random_num[15:1]};
1692
1693
1694endcase
1695end
1696
1697
1698always @ (posedge clk)
1699if (reset)
1700begin
1701 wred_v1 <= 17'b0;
1702 wred_v2 <= 16'b0;
1703end
1704else
1705begin
1706 wred_v1 <= wred_v1_tmp[16:0];
1707 wred_v2 <= wred_v2_tmp[15:0];
1708end
1709
1710
1711always @ (posedge clk)
1712if (reset)
1713 wred_drop_pkt <= 1'b0;
1714else if (dma_reset)
1715 wred_drop_pkt <= 1'b0;
1716else if (!wred_enable)
1717 wred_drop_pkt <= 1'b0;
1718else if (sel_buf_en)
1719 wred_drop_pkt <= wred_v3_tmp;
1720else
1721 wred_drop_pkt <= 1'b0;
1722
1723
1724
1725endmodule
1726
1727