Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_rdmc_wr_sched.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_rdmc_wr_sched.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 ============================================
35module niu_rdmc_wr_sched (
36 clk,
37 reset,
38 rx_addr_32b_mode,
39 pt_drr_wt0_reg,
40 pt_drr_wt1_reg,
41 pt_drr_wt2_reg,
42 pt_drr_wt3_reg,
43 muxed_l2_len_r,
44 muxed_pkt_len_r,
45 rdmc_eop_for_padding,
46 pkt_req_cnt_pre_done,
47 pkt_req_cnt_done,
48 pkt_req_cnt_done_r,
49 pkt_wrbk_data,
50 drop_pkt_done,
51 ipp_full_pkt,
52 zcp_full_pkt,
53 ipp_pkt_sop,
54 zcp_pkt_sop,
55 muxed_zcopy_mode_r,
56 muxed_data_err_r2,
57 zcopy_mode,
58 jmb_pkt_type,
59 zcp_wr_type,
60 zcp_rdc_num,
61 zcp_vaddr0,
62 zcp_vaddr1,
63 zcp_vaddr2,
64 zcp_vaddr3,
65 zcp_len0,
66 zcp_len1,
67 zcp_len2,
68 zcp_len3,
69 zcp_func_num,
70 full_hdr_bits,
71 drop_pkt,
72 pkt_buf_gnt,
73 pkt_buf_addr0,
74 pkt_buf_addr1,
75 pkt_buf_addr2,
76 pkt_buf_addr3,
77 pkt_buf_addr4,
78 pkt_buf_addr5,
79 pkt_buf_addr6,
80 pkt_buf_addr7,
81 pkt_buf_addr8,
82 pkt_buf_addr9,
83 pkt_buf_addr10,
84 pkt_buf_addr11,
85 pkt_buf_addr12,
86 pkt_buf_addr13,
87 pkt_buf_addr14,
88 pkt_buf_addr15,
89 pkt_buf_size0,
90 pkt_buf_size1,
91 pkt_buf_size2,
92 pkt_buf_size3,
93 pkt_buf_size4,
94 pkt_buf_size5,
95 pkt_buf_size6,
96 pkt_buf_size7,
97 pkt_buf_size8,
98 pkt_buf_size9,
99 pkt_buf_size10,
100 pkt_buf_size11,
101 pkt_buf_size12,
102 pkt_buf_size13,
103 pkt_buf_size14,
104 pkt_buf_size15,
105 orig_buf_addr0,
106 orig_buf_addr1,
107 orig_buf_addr2,
108 orig_buf_addr3,
109 orig_buf_addr4,
110 orig_buf_addr5,
111 orig_buf_addr6,
112 orig_buf_addr7,
113 orig_buf_addr8,
114 orig_buf_addr9,
115 orig_buf_addr10,
116 orig_buf_addr11,
117 orig_buf_addr12,
118 orig_buf_addr13,
119 orig_buf_addr14,
120 orig_buf_addr15,
121 dma_func_num0,
122 dma_func_num1,
123 dma_func_num2,
124 dma_func_num3,
125 dma_func_num4,
126 dma_func_num5,
127 dma_func_num6,
128 dma_func_num7,
129 dma_func_num8,
130 dma_func_num9,
131 dma_func_num10,
132 dma_func_num11,
133 dma_func_num12,
134 dma_func_num13,
135 dma_func_num14,
136 dma_func_num15,
137 pref_buf_used_num0,
138 pref_buf_used_num1,
139 pref_buf_used_num2,
140 pref_buf_used_num3,
141 pref_buf_used_num4,
142 pref_buf_used_num5,
143 pref_buf_used_num6,
144 pref_buf_used_num7,
145 pref_buf_used_num8,
146 pref_buf_used_num9,
147 pref_buf_used_num10,
148 pref_buf_used_num11,
149 pref_buf_used_num12,
150 pref_buf_used_num13,
151 pref_buf_used_num14,
152 pref_buf_used_num15,
153 pkt_trans_len0,
154 pkt_trans_len1,
155 pkt_trans_len2,
156 pkt_trans_len3,
157 pkt_trans_len4,
158 pkt_trans_len5,
159 pkt_trans_len6,
160 pkt_trans_len7,
161 pkt_trans_len8,
162 pkt_trans_len9,
163 pkt_trans_len10,
164 pkt_trans_len11,
165 pkt_trans_len12,
166 pkt_trans_len13,
167 pkt_trans_len14,
168 pkt_trans_len15,
169 meta0_rdmc_wr_req_accept,
170
171 rdmc_meta0_wr_req,
172 rdmc_meta0_wr_req_cmd,
173 rdmc_meta0_wr_req_address,
174 rdmc_meta0_wr_req_length,
175 rdmc_meta0_wr_req_port_num,
176 rdmc_meta0_wr_req_dma_num,
177 rdmc_meta0_wr_req_func_num,
178 rdmc_meta0_wr_req_dma_num_int,
179 full_hdr_r,
180 pkt_trans_len_r,
181 pref_buf_used_num_r,
182 drop_pkt_en_sm,
183 drop_pkt_en,
184 drop_pkt_port_gnt,
185 drop_pad_data,
186 is_zcp0_wr_req,
187 is_zcp1_wr_req,
188 is_zcp2_wr_req,
189 is_zcp3_wr_req,
190 rdmc_wr_req_accept_hdr,
191 rdmc_wr_req_accept_jmb,
192 rdmc_wr_req_accept_zcp0,
193 rdmc_wr_req_accept_zcp1,
194 rdmc_wr_req_accept_zcp2,
195 rdmc_wr_req_accept_zcp3,
196 port_gnt,
197 port_gnt_r,
198 stage0_en,
199 stage1_en_r,
200 sel_buf_en,
201 pkt_buf_done,
202 is_hdr_wr_data,
203 is_jmb1_wr_data,
204 wr_last_pkt_data,
205 update_rcr_shadw,
206 rcr_wrbk_data,
207 wr_sched_sm_state
208 );
209
210input clk;
211input reset;
212input rx_addr_32b_mode;
213input[15:0] pt_drr_wt0_reg;
214input[15:0] pt_drr_wt1_reg;
215input[15:0] pt_drr_wt2_reg;
216input[15:0] pt_drr_wt3_reg;
217input[13:0] muxed_l2_len_r;
218input[13:0] muxed_pkt_len_r;
219input rdmc_eop_for_padding;
220input pkt_req_cnt_pre_done;
221input pkt_req_cnt_done;
222input pkt_req_cnt_done_r;
223input[22:0] pkt_wrbk_data;
224input drop_pkt_done;
225input[3:0] ipp_full_pkt;
226input[3:0] zcp_full_pkt;
227input[3:0] ipp_pkt_sop;
228input[3:0] zcp_pkt_sop;
229input muxed_zcopy_mode_r;
230input muxed_data_err_r2;
231input zcopy_mode;
232input[1:0] jmb_pkt_type;
233input[1:0] zcp_wr_type;
234input[4:0] zcp_rdc_num;
235input[63:0] zcp_vaddr0;
236input[63:0] zcp_vaddr1;
237input[63:0] zcp_vaddr2;
238input[63:0] zcp_vaddr3;
239input[13:0] zcp_len0;
240input[13:0] zcp_len1;
241input[13:0] zcp_len2;
242input[13:0] zcp_len3;
243input[1:0] zcp_func_num;
244input[15:0] full_hdr_bits;
245input[15:0] drop_pkt;
246input[15:0] pkt_buf_gnt;
247input[63:0] pkt_buf_addr0;
248input[63:0] pkt_buf_addr1;
249input[63:0] pkt_buf_addr2;
250input[63:0] pkt_buf_addr3;
251input[63:0] pkt_buf_addr4;
252input[63:0] pkt_buf_addr5;
253input[63:0] pkt_buf_addr6;
254input[63:0] pkt_buf_addr7;
255input[63:0] pkt_buf_addr8;
256input[63:0] pkt_buf_addr9;
257input[63:0] pkt_buf_addr10;
258input[63:0] pkt_buf_addr11;
259input[63:0] pkt_buf_addr12;
260input[63:0] pkt_buf_addr13;
261input[63:0] pkt_buf_addr14;
262input[63:0] pkt_buf_addr15;
263input[1:0] pkt_buf_size0;
264input[1:0] pkt_buf_size1;
265input[1:0] pkt_buf_size2;
266input[1:0] pkt_buf_size3;
267input[1:0] pkt_buf_size4;
268input[1:0] pkt_buf_size5;
269input[1:0] pkt_buf_size6;
270input[1:0] pkt_buf_size7;
271input[1:0] pkt_buf_size8;
272input[1:0] pkt_buf_size9;
273input[1:0] pkt_buf_size10;
274input[1:0] pkt_buf_size11;
275input[1:0] pkt_buf_size12;
276input[1:0] pkt_buf_size13;
277input[1:0] pkt_buf_size14;
278input[1:0] pkt_buf_size15;
279input[35:0] orig_buf_addr0;
280input[35:0] orig_buf_addr1;
281input[35:0] orig_buf_addr2;
282input[35:0] orig_buf_addr3;
283input[35:0] orig_buf_addr4;
284input[35:0] orig_buf_addr5;
285input[35:0] orig_buf_addr6;
286input[35:0] orig_buf_addr7;
287input[35:0] orig_buf_addr8;
288input[35:0] orig_buf_addr9;
289input[35:0] orig_buf_addr10;
290input[35:0] orig_buf_addr11;
291input[35:0] orig_buf_addr12;
292input[35:0] orig_buf_addr13;
293input[35:0] orig_buf_addr14;
294input[35:0] orig_buf_addr15;
295input[1:0] dma_func_num0;
296input[1:0] dma_func_num1;
297input[1:0] dma_func_num2;
298input[1:0] dma_func_num3;
299input[1:0] dma_func_num4;
300input[1:0] dma_func_num5;
301input[1:0] dma_func_num6;
302input[1:0] dma_func_num7;
303input[1:0] dma_func_num8;
304input[1:0] dma_func_num9;
305input[1:0] dma_func_num10;
306input[1:0] dma_func_num11;
307input[1:0] dma_func_num12;
308input[1:0] dma_func_num13;
309input[1:0] dma_func_num14;
310input[1:0] dma_func_num15;
311input[1:0] pref_buf_used_num0;
312input[1:0] pref_buf_used_num1;
313input[1:0] pref_buf_used_num2;
314input[1:0] pref_buf_used_num3;
315input[1:0] pref_buf_used_num4;
316input[1:0] pref_buf_used_num5;
317input[1:0] pref_buf_used_num6;
318input[1:0] pref_buf_used_num7;
319input[1:0] pref_buf_used_num8;
320input[1:0] pref_buf_used_num9;
321input[1:0] pref_buf_used_num10;
322input[1:0] pref_buf_used_num11;
323input[1:0] pref_buf_used_num12;
324input[1:0] pref_buf_used_num13;
325input[1:0] pref_buf_used_num14;
326input[1:0] pref_buf_used_num15;
327input[13:0] pkt_trans_len0;
328input[13:0] pkt_trans_len1;
329input[13:0] pkt_trans_len2;
330input[13:0] pkt_trans_len3;
331input[13:0] pkt_trans_len4;
332input[13:0] pkt_trans_len5;
333input[13:0] pkt_trans_len6;
334input[13:0] pkt_trans_len7;
335input[13:0] pkt_trans_len8;
336input[13:0] pkt_trans_len9;
337input[13:0] pkt_trans_len10;
338input[13:0] pkt_trans_len11;
339input[13:0] pkt_trans_len12;
340input[13:0] pkt_trans_len13;
341input[13:0] pkt_trans_len14;
342input[13:0] pkt_trans_len15;
343input meta0_rdmc_wr_req_accept;
344
345output rdmc_meta0_wr_req;
346output[7:0] rdmc_meta0_wr_req_cmd;
347output[63:0] rdmc_meta0_wr_req_address;
348output[13:0] rdmc_meta0_wr_req_length;
349output[1:0] rdmc_meta0_wr_req_port_num;
350output[4:0] rdmc_meta0_wr_req_dma_num;
351output[4:0] rdmc_meta0_wr_req_dma_num_int;
352output[1:0] rdmc_meta0_wr_req_func_num;
353output full_hdr_r;
354output[13:0] pkt_trans_len_r;
355output[1:0] pref_buf_used_num_r;
356output drop_pkt_en_sm;
357output drop_pkt_en;
358output[3:0] drop_pkt_port_gnt;
359output drop_pad_data;
360output is_zcp0_wr_req;
361output is_zcp1_wr_req;
362output is_zcp2_wr_req;
363output is_zcp3_wr_req;
364output rdmc_wr_req_accept_hdr;
365output rdmc_wr_req_accept_jmb;
366output rdmc_wr_req_accept_zcp0;
367output rdmc_wr_req_accept_zcp1;
368output rdmc_wr_req_accept_zcp2;
369output rdmc_wr_req_accept_zcp3;
370output[3:0] port_gnt;
371output[3:0] port_gnt_r;
372output stage0_en;
373output stage1_en_r;
374output sel_buf_en;
375output pkt_buf_done;
376output is_hdr_wr_data;
377output is_jmb1_wr_data;
378output wr_last_pkt_data;
379output update_rcr_shadw;
380output[63:0] rcr_wrbk_data;
381output[4:0] wr_sched_sm_state;
382
383reg rdmc_wr_req_accept_in;
384reg rdmc_wr_req_accept_reg;
385reg rdmc_meta0_wr_req;
386reg[7:0] rdmc_meta0_wr_req_cmd;
387reg[63:0] rdmc_meta0_wr_req_address;
388reg[13:0] rdmc_meta0_wr_req_length;
389reg[1:0] rdmc_meta0_wr_req_port_num;
390reg[4:0] rdmc_meta0_wr_req_dma_num;
391reg[4:0] rdmc_meta0_wr_req_dma_num_int;
392reg[1:0] rdmc_meta0_wr_req_func_num;
393reg sel_buf_en;
394reg rdmc_wr_req_pulse;
395reg full_hdr_r;
396reg[13:0] pkt_trans_len_r;
397reg[13:0] pad_data_len;
398reg[1:0] pref_buf_used_num_r;
399reg[35:0] orig_buf_addr;
400reg[63:0] rcr_wrbk_data;
401
402reg idle_cycle;
403reg arb_cyc0_en;
404reg arb_cyc1_en;
405reg stage0_en;
406reg stage1_en;
407reg stage2_en;
408reg stage1_en_r;
409reg rdmc_wr_req_sm_hdr;
410reg rdmc_wr_req_sm_jmb1;
411reg rdmc_wr_req_sm_jmb2;
412reg rdmc_wr_req_sm_zcp0;
413reg rdmc_wr_req_sm_zcp1;
414reg rdmc_wr_req_sm_zcp2;
415reg rdmc_wr_req_sm_zcp3;
416reg pkt_buf_done;
417reg zcp_last_data_sm;
418reg drop_pkt_en_sm;
419reg bkup_wt_en;
420reg reset_port_gnt_sm;
421reg drop_pad_data;
422reg[4:0] state;
423reg[4:0] next_state;
424
425reg is_hdr_wr_req;
426reg is_jmb1_wr_req;
427reg is_jmb2_wr_req;
428reg is_zcp0_wr_req;
429reg is_zcp1_wr_req;
430reg is_zcp2_wr_req;
431reg is_zcp3_wr_req;
432reg is_hdr_wr_data;
433reg is_jmb1_wr_data;
434reg is_jmb2_wr_data;
435reg is_zcp0_wr_data;
436reg is_zcp1_wr_data;
437reg is_zcp2_wr_data;
438reg is_zcp3_wr_data;
439
440reg wr_last_pkt_data;
441reg zcp_wr_last_data;
442reg[1:0] pkt_buf_size_r;
443reg[22:0] pkt_wrbk_data_r;
444reg[40:0] bus_wrbk_data;
445
446reg drop_pkt_en;
447reg[3:0] drop_pkt_port_gnt;
448reg reset_port_gnt;
449reg[3:0] port_gnt;
450reg[3:0] port_gnt_r;
451reg[3:0] token;
452reg[3:0] final_req_r;
453reg is_org_req_r;
454reg is_bkup_req_r;
455
456reg[15:0] curr_wt0;
457reg[15:0] curr_wt1;
458reg[15:0] curr_wt2;
459reg[15:0] curr_wt3;
460
461reg[15:0] bkup_wt0;
462reg[15:0] bkup_wt1;
463reg[15:0] bkup_wt2;
464reg[15:0] bkup_wt3;
465
466wire[4:0] wr_sched_sm_state = state;
467
468wire rdmc_wr_req_sm;
469wire rdmc_wr_req_accept;
470wire rdmc_wr_req_accept_pulse;
471
472wire[3:0] pkt_buf_gnt_enc;
473wire[1:0] port_gnt_enc;
474wire full_hdr;
475
476wire rdmc_wr_req_sm_nom;
477wire[63:0] rdmc_req_addr_all;
478wire[13:0] pkt_trans_len_all;
479
480wire[3:0] mask_req;
481wire[3:0] org_req;
482wire[3:0] bkup_req;
483wire[3:0] final_req;
484wire is_org_req;
485wire is_mask_req;
486wire is_bkup_req;
487
488wire[3:0] n_flag = {curr_wt3[15], curr_wt2[15], curr_wt1[15], curr_wt0[15]};
489wire[3:0] bkup_n_flag = {bkup_wt3[15], bkup_wt2[15], bkup_wt1[15], bkup_wt0[15]};
490
491wire[3:0] sel_port_gnt;
492
493wire muxed_full_pkt = |(ipp_full_pkt & zcp_full_pkt & port_gnt);
494wire muxed_pkt_sop = |(ipp_pkt_sop & zcp_pkt_sop & port_gnt);
495
496wire jmb_pkt = pref_buf_used_num_r[1];
497
498wire drop_pkt_req = |drop_pkt;
499
500wire is_wr_data;
501wire has_ly2_padding;
502
503parameter
504
505PORT_REQ = 5'd0,
506PORT_ARB = 5'd1,
507WAIT_PORT_RDY = 5'd2,
508BUF_COMP = 5'd3,
509BUF_SEL = 5'd4,
510BUS_REQ = 5'd5,
511WAIT_S1 = 5'd6,
512WAIT_S2 = 5'd7,
513JMB_REQ1_WAIT = 5'd8,
514JMB_REQ1_PRE = 5'd9,
515JMB_REQ1 = 5'd10,
516JMB_WAIT1 = 5'd11,
517JMB_REQ2 = 5'd12,
518JMB_WAIT2 = 5'd13,
519ZCP_REQ0_WAIT = 5'd14,
520ZCP_REQ0_PRE = 5'd15,
521ZCP_REQ0 = 5'd16,
522ZCP_WAIT0 = 5'd17,
523ZCP_REQ1 = 5'd18,
524ZCP_WAIT1 = 5'd19,
525ZCP_REQ2 = 5'd20,
526ZCP_WAIT2 = 5'd21,
527ZCP_REQ3 = 5'd22,
528ZCP_WAIT3 = 5'd23,
529DIS_PKT = 5'd24,
530DIS_PKT_WAIT = 5'd25,
531DIS_PKT_DONE_W = 5'd26,
532DIS_LY2_PADDING_W = 5'd27,
533DIS_LY2_PADDING = 5'd28;
534
535
536always @ (state or final_req or
537 muxed_full_pkt or muxed_pkt_sop or
538 rdmc_wr_req_accept or rdmc_meta0_wr_req or rdmc_wr_req_accept_pulse or
539 muxed_zcopy_mode_r or jmb_pkt or pkt_req_cnt_done or pkt_req_cnt_done_r or
540 pref_buf_used_num_r or zcp_wr_type or is_wr_data or
541 drop_pkt_req or drop_pkt_done or muxed_data_err_r2 or
542 pkt_req_cnt_pre_done or has_ly2_padding or rdmc_eop_for_padding)
543begin
544 idle_cycle = 1'b0;
545 arb_cyc0_en = 1'b0;
546 arb_cyc1_en = 1'b0;
547 stage0_en = 1'b0;
548 stage1_en = 1'b0;
549 stage2_en = 1'b0;
550 rdmc_wr_req_sm_hdr = 1'b0;
551 rdmc_wr_req_sm_jmb1 = 1'b0;
552 rdmc_wr_req_sm_jmb2 = 1'b0;
553 rdmc_wr_req_sm_zcp0 = 1'b0;
554 rdmc_wr_req_sm_zcp1 = 1'b0;
555 rdmc_wr_req_sm_zcp2 = 1'b0;
556 rdmc_wr_req_sm_zcp3 = 1'b0;
557 zcp_last_data_sm = 1'b0;
558 pkt_buf_done = 1'b0;
559 drop_pkt_en_sm = 1'b0;
560 bkup_wt_en = 1'b0;
561 reset_port_gnt_sm = 1'b0;
562 drop_pad_data = 1'b0;
563
564case (state) //synopsys parallel_case full_case
565
566PORT_REQ:
567begin
568 if (final_req)
569 begin
570 arb_cyc0_en = 1'b1;
571 next_state = PORT_ARB;
572 end
573 else
574 begin
575 idle_cycle = 1'b1;
576 next_state = state;
577 end
578end
579
580PORT_ARB:
581begin
582 arb_cyc1_en = 1'b1;
583 next_state = WAIT_PORT_RDY;
584end
585
586WAIT_PORT_RDY:
587begin
588 if (!(rdmc_meta0_wr_req | rdmc_wr_req_accept_pulse) | rdmc_wr_req_accept)
589 begin
590 if (!muxed_full_pkt & muxed_data_err_r2)
591 next_state = PORT_REQ;
592 else if (muxed_full_pkt & muxed_pkt_sop)
593 begin
594 stage0_en = 1'b1;
595 next_state = BUF_COMP;
596 end
597 else
598 next_state = state;
599 end
600 else
601 next_state = state;
602end
603
604BUF_COMP:
605begin
606 stage1_en = 1'b1;
607 next_state = BUF_SEL;
608end
609
610BUF_SEL:
611begin
612 stage2_en = 1'b1;
613 next_state = BUS_REQ;
614end
615
616BUS_REQ:
617begin
618 if (drop_pkt_req)
619 next_state = DIS_PKT;
620 else
621 begin
622 rdmc_wr_req_sm_hdr = 1'b1;
623 next_state = WAIT_S1;
624 end
625end
626
627WAIT_S1:
628begin
629 reset_port_gnt_sm = 1'b1;
630 if (muxed_zcopy_mode_r)
631 begin
632 pkt_buf_done = 1'b1;
633 next_state = ZCP_REQ0_WAIT;
634 end
635 else if (jmb_pkt)
636 next_state = JMB_REQ1_WAIT;
637 else
638 begin
639 pkt_buf_done = 1'b1;
640 bkup_wt_en = 1'b1;
641 next_state = WAIT_S2;
642 end
643end
644
645WAIT_S2:
646
647 next_state = PORT_REQ;
648
649
650JMB_REQ1_WAIT:
651begin
652 if (!(rdmc_meta0_wr_req | rdmc_wr_req_accept_pulse) | rdmc_wr_req_accept)
653 next_state = JMB_REQ1_PRE;
654 else
655 next_state = state;
656end
657
658JMB_REQ1_PRE:
659 next_state = JMB_REQ1;
660
661
662JMB_REQ1:
663begin
664 if (pkt_req_cnt_done)
665 begin
666 rdmc_wr_req_sm_jmb1 = 1'b1;
667 next_state = JMB_WAIT1;
668 end
669 else
670 next_state = state;
671end
672
673JMB_WAIT1:
674begin
675 if (pref_buf_used_num_r == 2'b10)
676 begin
677 pkt_buf_done = 1'b1;
678 bkup_wt_en = 1'b1;
679 next_state = PORT_REQ;
680 end
681 else
682 next_state = JMB_REQ2;
683end
684
685JMB_REQ2:
686begin
687 if (pkt_req_cnt_done)
688 begin
689 rdmc_wr_req_sm_jmb2 = 1'b1;
690 next_state = JMB_WAIT2;
691 end
692 else
693 next_state = state;
694end
695
696JMB_WAIT2:
697begin
698 pkt_buf_done = 1'b1;
699 bkup_wt_en = 1'b1;
700 next_state = PORT_REQ;
701end
702
703
704ZCP_REQ0_WAIT:
705begin
706 if (!(rdmc_meta0_wr_req | rdmc_wr_req_accept_pulse) | rdmc_wr_req_accept)
707 next_state = ZCP_REQ0_PRE;
708 else
709 next_state = state;
710end
711
712ZCP_REQ0_PRE:
713 next_state = ZCP_REQ0;
714
715
716ZCP_REQ0:
717begin
718 if (pkt_req_cnt_done_r)
719 begin
720 rdmc_wr_req_sm_zcp0 = 1'b1;
721 next_state = ZCP_WAIT0;
722 end
723 else
724 next_state = state;
725end
726
727ZCP_WAIT0:
728begin
729 if (zcp_wr_type == 2'b00)
730 begin
731 zcp_last_data_sm = 1'b1;
732 bkup_wt_en = 1'b1;
733 if (has_ly2_padding)
734 next_state = DIS_LY2_PADDING_W;
735 else
736 next_state = PORT_REQ;
737 end
738 else
739 next_state = ZCP_REQ1;
740end
741
742ZCP_REQ1:
743begin
744 if (pkt_req_cnt_done_r)
745 begin
746 rdmc_wr_req_sm_zcp1 = 1'b1;
747 next_state = ZCP_WAIT1;
748 end
749 else
750 next_state = state;
751end
752
753ZCP_WAIT1:
754begin
755 if (zcp_wr_type == 2'b01)
756 begin
757 zcp_last_data_sm = 1'b1;
758 bkup_wt_en = 1'b1;
759 if (has_ly2_padding)
760 next_state = DIS_LY2_PADDING_W;
761 else
762 next_state = PORT_REQ;
763 end
764 else
765 next_state = ZCP_REQ2;
766end
767
768ZCP_REQ2:
769begin
770 if (pkt_req_cnt_done_r)
771 begin
772 rdmc_wr_req_sm_zcp2 = 1'b1;
773 next_state = ZCP_WAIT2;
774 end
775 else
776 next_state = state;
777end
778
779ZCP_WAIT2:
780begin
781 if (zcp_wr_type == 2'b10)
782 begin
783 zcp_last_data_sm = 1'b1;
784 bkup_wt_en = 1'b1;
785 if (has_ly2_padding)
786 next_state = DIS_LY2_PADDING_W;
787 else
788 next_state = PORT_REQ;
789 end
790 else
791 next_state = ZCP_REQ3;
792end
793
794
795ZCP_REQ3:
796begin
797 if (pkt_req_cnt_done_r)
798 begin
799 rdmc_wr_req_sm_zcp3 = 1'b1;
800 next_state = ZCP_WAIT3;
801 end
802 else
803 next_state = state;
804end
805
806ZCP_WAIT3:
807begin
808 zcp_last_data_sm = 1'b1;
809 bkup_wt_en = 1'b1;
810 if (has_ly2_padding)
811 next_state = DIS_LY2_PADDING_W;
812 else
813 next_state = PORT_REQ;
814end
815
816DIS_PKT:
817begin
818 if (is_wr_data)
819 next_state = DIS_PKT_WAIT;
820 else
821 begin
822 reset_port_gnt_sm = 1'b1;
823 drop_pkt_en_sm = 1'b1;
824 bkup_wt_en = 1'b1;
825 next_state = DIS_PKT_DONE_W;
826 end
827end
828
829DIS_PKT_WAIT:
830begin
831 if (!is_wr_data)
832 next_state = DIS_PKT;
833 else
834 next_state = state;
835end
836
837DIS_PKT_DONE_W:
838begin
839 if (drop_pkt_done)
840 next_state = PORT_REQ;
841 else
842 next_state = state;
843end
844
845DIS_LY2_PADDING_W:
846begin
847 if (pkt_req_cnt_pre_done)
848 next_state = DIS_LY2_PADDING;
849 else
850 next_state = state;
851end
852
853DIS_LY2_PADDING:
854begin
855 if (rdmc_eop_for_padding)
856 next_state = PORT_REQ;
857 else
858 begin
859 drop_pad_data = 1'b1;
860 next_state = state;
861 end
862end
863
864default:
865 next_state = PORT_REQ;
866
867endcase
868end
869
870always @ (posedge clk)
871if (reset)
872 state <= 5'b0;
873else
874 state <= next_state;
875
876always @ (posedge clk)
877if (reset)
878 sel_buf_en <= 1'b0;
879else
880 sel_buf_en <= stage0_en;
881
882always @ (posedge clk)
883if (reset)
884 stage1_en_r <= 1'b0;
885else
886 stage1_en_r <= stage1_en;
887
888
889always @ (posedge clk)
890if (reset)
891 rdmc_wr_req_pulse <= 1'b0;
892else
893 rdmc_wr_req_pulse <= rdmc_wr_req_sm;
894
895always @ (posedge clk)
896if (reset)
897begin
898 is_hdr_wr_req <= 1'b0;
899 is_jmb1_wr_req <= 1'b0;
900 is_jmb2_wr_req <= 1'b0;
901 is_zcp0_wr_req <= 1'b0;
902 is_zcp1_wr_req <= 1'b0;
903 is_zcp2_wr_req <= 1'b0;
904 is_zcp3_wr_req <= 1'b0;
905end
906else if (rdmc_wr_req_sm)
907begin
908 is_hdr_wr_req <= rdmc_wr_req_sm_hdr;
909 is_jmb1_wr_req <= rdmc_wr_req_sm_jmb1;
910 is_jmb2_wr_req <= rdmc_wr_req_sm_jmb2;
911 is_zcp0_wr_req <= rdmc_wr_req_sm_zcp0;
912 is_zcp1_wr_req <= rdmc_wr_req_sm_zcp1;
913 is_zcp2_wr_req <= rdmc_wr_req_sm_zcp2;
914 is_zcp3_wr_req <= rdmc_wr_req_sm_zcp3;
915end
916else if (rdmc_wr_req_accept)
917begin
918 is_hdr_wr_req <= 1'b0;
919 is_jmb1_wr_req <= 1'b0;
920 is_jmb2_wr_req <= 1'b0;
921 is_zcp0_wr_req <= 1'b0;
922 is_zcp1_wr_req <= 1'b0;
923 is_zcp2_wr_req <= 1'b0;
924 is_zcp3_wr_req <= 1'b0;
925end
926else
927begin
928 is_hdr_wr_req <= is_hdr_wr_req;
929 is_jmb1_wr_req <= is_jmb1_wr_req;
930 is_jmb2_wr_req <= is_jmb2_wr_req;
931 is_zcp0_wr_req <= is_zcp0_wr_req;
932 is_zcp1_wr_req <= is_zcp1_wr_req;
933 is_zcp2_wr_req <= is_zcp2_wr_req;
934 is_zcp3_wr_req <= is_zcp3_wr_req;
935end
936
937
938always @ (posedge clk)
939if (reset)
940begin
941 is_hdr_wr_data <= 1'b0;
942 is_jmb1_wr_data <= 1'b0;
943 is_jmb2_wr_data <= 1'b0;
944 is_zcp0_wr_data <= 1'b0;
945 is_zcp1_wr_data <= 1'b0;
946 is_zcp2_wr_data <= 1'b0;
947 is_zcp3_wr_data <= 1'b0;
948end
949else if (rdmc_wr_req_accept)
950begin
951 is_hdr_wr_data <= is_hdr_wr_req;
952 is_jmb1_wr_data <= is_jmb1_wr_req;
953 is_jmb2_wr_data <= is_jmb2_wr_req;
954 is_zcp0_wr_data <= is_zcp0_wr_req;
955 is_zcp1_wr_data <= is_zcp1_wr_req;
956 is_zcp2_wr_data <= is_zcp2_wr_req;
957 is_zcp3_wr_data <= is_zcp3_wr_req;
958
959end
960else if (pkt_req_cnt_pre_done)
961begin
962 is_hdr_wr_data <= 1'b0;
963 is_jmb1_wr_data <= 1'b0;
964 is_jmb2_wr_data <= 1'b0;
965 is_zcp0_wr_data <= 1'b0;
966 is_zcp1_wr_data <= 1'b0;
967 is_zcp2_wr_data <= 1'b0;
968 is_zcp3_wr_data <= 1'b0;
969end
970else
971begin
972 is_hdr_wr_data <= is_hdr_wr_data;
973 is_jmb1_wr_data <= is_jmb1_wr_data;
974 is_jmb2_wr_data <= is_jmb2_wr_data;
975 is_zcp0_wr_data <= is_zcp0_wr_data;
976 is_zcp1_wr_data <= is_zcp1_wr_data;
977 is_zcp2_wr_data <= is_zcp2_wr_data;
978 is_zcp3_wr_data <= is_zcp3_wr_data;
979end
980
981always @ (posedge clk)
982if (reset)
983 zcp_wr_last_data <= 1'b0;
984else if (zcp_last_data_sm)
985 zcp_wr_last_data <= 1'b1;
986else if (pkt_req_cnt_pre_done)
987 zcp_wr_last_data <= 1'b0;
988else
989 zcp_wr_last_data <= zcp_wr_last_data;
990
991
992assign rdmc_wr_req_sm = rdmc_wr_req_sm_hdr | rdmc_wr_req_sm_jmb1 | rdmc_wr_req_sm_jmb2 |
993 rdmc_wr_req_sm_zcp0 | rdmc_wr_req_sm_zcp1 | rdmc_wr_req_sm_zcp2 |
994 rdmc_wr_req_sm_zcp3;
995
996wire rdmc_wr_req_accept_hdr = rdmc_wr_req_accept & is_hdr_wr_req;
997wire rdmc_wr_req_accept_jmb1 = rdmc_wr_req_accept & is_jmb1_wr_req;
998wire rdmc_wr_req_accept_jmb2 = rdmc_wr_req_accept & is_jmb2_wr_req;
999wire rdmc_wr_req_accept_zcp0 = rdmc_wr_req_accept & is_zcp0_wr_req;
1000wire rdmc_wr_req_accept_zcp1 = rdmc_wr_req_accept & is_zcp1_wr_req;
1001wire rdmc_wr_req_accept_zcp2 = rdmc_wr_req_accept & is_zcp2_wr_req;
1002wire rdmc_wr_req_accept_zcp3 = rdmc_wr_req_accept & is_zcp3_wr_req;
1003wire rdmc_wr_req_accept_jmb = rdmc_wr_req_accept_jmb1 | rdmc_wr_req_accept_jmb2;
1004
1005wire update_rcr_shadw_en = is_hdr_wr_data & !zcopy_mode |
1006 is_jmb1_wr_data | is_jmb2_wr_data |
1007 zcp_wr_last_data;
1008
1009wire wr_last_pkt_data_en = is_hdr_wr_data & !(zcopy_mode | jmb_pkt_type[1]) |
1010 is_jmb1_wr_data & (jmb_pkt_type == 2'b10) |
1011 is_jmb2_wr_data | zcp_wr_last_data;
1012
1013
1014wire update_rcr_shadw = pkt_req_cnt_pre_done & update_rcr_shadw_en;
1015
1016always @ (posedge clk)
1017if (reset)
1018 wr_last_pkt_data <= 1'b0;
1019else
1020 wr_last_pkt_data <= wr_last_pkt_data_en & pkt_req_cnt_pre_done;
1021
1022
1023/*********************************/
1024//Select RDA Channel
1025/*********************************/
1026wire[63:0] rdmc_req_addr_tmp = {64{pkt_buf_gnt[0]}} & pkt_buf_addr0 |
1027 {64{pkt_buf_gnt[1]}} & pkt_buf_addr1 |
1028 {64{pkt_buf_gnt[2]}} & pkt_buf_addr2 |
1029 {64{pkt_buf_gnt[3]}} & pkt_buf_addr3 |
1030 {64{pkt_buf_gnt[4]}} & pkt_buf_addr4 |
1031 {64{pkt_buf_gnt[5]}} & pkt_buf_addr5 |
1032 {64{pkt_buf_gnt[6]}} & pkt_buf_addr6 |
1033 {64{pkt_buf_gnt[7]}} & pkt_buf_addr7 |
1034 {64{pkt_buf_gnt[8]}} & pkt_buf_addr8 |
1035 {64{pkt_buf_gnt[9]}} & pkt_buf_addr9 |
1036 {64{pkt_buf_gnt[10]}} & pkt_buf_addr10 |
1037 {64{pkt_buf_gnt[11]}} & pkt_buf_addr11 |
1038 {64{pkt_buf_gnt[12]}} & pkt_buf_addr12 |
1039 {64{pkt_buf_gnt[13]}} & pkt_buf_addr13 |
1040 {64{pkt_buf_gnt[14]}} & pkt_buf_addr14 |
1041 {64{pkt_buf_gnt[15]}} & pkt_buf_addr15;
1042
1043wire[35:0] orig_buf_addr_tmp = {36{pkt_buf_gnt[0]}} & orig_buf_addr0 |
1044 {36{pkt_buf_gnt[1]}} & orig_buf_addr1 |
1045 {36{pkt_buf_gnt[2]}} & orig_buf_addr2 |
1046 {36{pkt_buf_gnt[3]}} & orig_buf_addr3 |
1047 {36{pkt_buf_gnt[4]}} & orig_buf_addr4 |
1048 {36{pkt_buf_gnt[5]}} & orig_buf_addr5 |
1049 {36{pkt_buf_gnt[6]}} & orig_buf_addr6 |
1050 {36{pkt_buf_gnt[7]}} & orig_buf_addr7 |
1051 {36{pkt_buf_gnt[8]}} & orig_buf_addr8 |
1052 {36{pkt_buf_gnt[9]}} & orig_buf_addr9 |
1053 {36{pkt_buf_gnt[10]}} & orig_buf_addr10 |
1054 {36{pkt_buf_gnt[11]}} & orig_buf_addr11 |
1055 {36{pkt_buf_gnt[12]}} & orig_buf_addr12 |
1056 {36{pkt_buf_gnt[13]}} & orig_buf_addr13 |
1057 {36{pkt_buf_gnt[14]}} & orig_buf_addr14 |
1058 {36{pkt_buf_gnt[15]}} & orig_buf_addr15;
1059
1060wire[1:0] pkt_buf_size_tmp = {2{pkt_buf_gnt[0]}} & pkt_buf_size0 |
1061 {2{pkt_buf_gnt[1]}} & pkt_buf_size1 |
1062 {2{pkt_buf_gnt[2]}} & pkt_buf_size2 |
1063 {2{pkt_buf_gnt[3]}} & pkt_buf_size3 |
1064 {2{pkt_buf_gnt[4]}} & pkt_buf_size4 |
1065 {2{pkt_buf_gnt[5]}} & pkt_buf_size5 |
1066 {2{pkt_buf_gnt[6]}} & pkt_buf_size6 |
1067 {2{pkt_buf_gnt[7]}} & pkt_buf_size7 |
1068 {2{pkt_buf_gnt[8]}} & pkt_buf_size8 |
1069 {2{pkt_buf_gnt[9]}} & pkt_buf_size9 |
1070 {2{pkt_buf_gnt[10]}} & pkt_buf_size10 |
1071 {2{pkt_buf_gnt[11]}} & pkt_buf_size11 |
1072 {2{pkt_buf_gnt[12]}} & pkt_buf_size12 |
1073 {2{pkt_buf_gnt[13]}} & pkt_buf_size13 |
1074 {2{pkt_buf_gnt[14]}} & pkt_buf_size14 |
1075 {2{pkt_buf_gnt[15]}} & pkt_buf_size15;
1076
1077wire[1:0] pref_buf_used_num_tmp = {2{pkt_buf_gnt[0]}} & pref_buf_used_num0 |
1078 {2{pkt_buf_gnt[1]}} & pref_buf_used_num1 |
1079 {2{pkt_buf_gnt[2]}} & pref_buf_used_num2 |
1080 {2{pkt_buf_gnt[3]}} & pref_buf_used_num3 |
1081 {2{pkt_buf_gnt[4]}} & pref_buf_used_num4 |
1082 {2{pkt_buf_gnt[5]}} & pref_buf_used_num5 |
1083 {2{pkt_buf_gnt[6]}} & pref_buf_used_num6 |
1084 {2{pkt_buf_gnt[7]}} & pref_buf_used_num7 |
1085 {2{pkt_buf_gnt[8]}} & pref_buf_used_num8 |
1086 {2{pkt_buf_gnt[9]}} & pref_buf_used_num9 |
1087 {2{pkt_buf_gnt[10]}} & pref_buf_used_num10 |
1088 {2{pkt_buf_gnt[11]}} & pref_buf_used_num11 |
1089 {2{pkt_buf_gnt[12]}} & pref_buf_used_num12 |
1090 {2{pkt_buf_gnt[13]}} & pref_buf_used_num13 |
1091 {2{pkt_buf_gnt[14]}} & pref_buf_used_num14 |
1092 {2{pkt_buf_gnt[15]}} & pref_buf_used_num15;
1093
1094wire[13:0] pkt_trans_len_tmp = {14{pkt_buf_gnt[0]}} & pkt_trans_len0 |
1095 {14{pkt_buf_gnt[1]}} & pkt_trans_len1 |
1096 {14{pkt_buf_gnt[2]}} & pkt_trans_len2 |
1097 {14{pkt_buf_gnt[3]}} & pkt_trans_len3 |
1098 {14{pkt_buf_gnt[4]}} & pkt_trans_len4 |
1099 {14{pkt_buf_gnt[5]}} & pkt_trans_len5 |
1100 {14{pkt_buf_gnt[6]}} & pkt_trans_len6 |
1101 {14{pkt_buf_gnt[7]}} & pkt_trans_len7 |
1102 {14{pkt_buf_gnt[8]}} & pkt_trans_len8 |
1103 {14{pkt_buf_gnt[9]}} & pkt_trans_len9 |
1104 {14{pkt_buf_gnt[10]}} & pkt_trans_len10 |
1105 {14{pkt_buf_gnt[11]}} & pkt_trans_len11 |
1106 {14{pkt_buf_gnt[12]}} & pkt_trans_len12 |
1107 {14{pkt_buf_gnt[13]}} & pkt_trans_len13 |
1108 {14{pkt_buf_gnt[14]}} & pkt_trans_len14 |
1109 {14{pkt_buf_gnt[15]}} & pkt_trans_len15;
1110
1111wire[1:0] dma_func_num_tmp = {2{pkt_buf_gnt[0]}} & dma_func_num0 |
1112 {2{pkt_buf_gnt[1]}} & dma_func_num1 |
1113 {2{pkt_buf_gnt[2]}} & dma_func_num2 |
1114 {2{pkt_buf_gnt[3]}} & dma_func_num3 |
1115 {2{pkt_buf_gnt[4]}} & dma_func_num4 |
1116 {2{pkt_buf_gnt[5]}} & dma_func_num5 |
1117 {2{pkt_buf_gnt[6]}} & dma_func_num6 |
1118 {2{pkt_buf_gnt[7]}} & dma_func_num7 |
1119 {2{pkt_buf_gnt[8]}} & dma_func_num8 |
1120 {2{pkt_buf_gnt[9]}} & dma_func_num9 |
1121 {2{pkt_buf_gnt[10]}} & dma_func_num10 |
1122 {2{pkt_buf_gnt[11]}} & dma_func_num11 |
1123 {2{pkt_buf_gnt[12]}} & dma_func_num12 |
1124 {2{pkt_buf_gnt[13]}} & dma_func_num13 |
1125 {2{pkt_buf_gnt[14]}} & dma_func_num14 |
1126 {2{pkt_buf_gnt[15]}} & dma_func_num15;
1127
1128
1129niu_rdmc_encode_32 encode_32_inst_a (
1130 .din (pkt_buf_gnt),
1131 .dout (pkt_buf_gnt_enc)
1132 );
1133
1134assign port_gnt_enc = (port_gnt == 4'b0010) ? 2'b01 :
1135 (port_gnt == 4'b0100) ? 2'b10 :
1136 (port_gnt == 4'b1000) ? 2'b11 :
1137 2'b00;
1138
1139assign full_hdr = |(full_hdr_bits & pkt_buf_gnt);
1140
1141
1142assign rdmc_wr_req_sm_nom = rdmc_wr_req_sm_hdr | rdmc_wr_req_sm_jmb1 | rdmc_wr_req_sm_jmb2;
1143
1144assign rdmc_req_addr_all = rdmc_wr_req_sm_nom ? rdmc_req_addr_tmp :
1145 rdmc_wr_req_sm_zcp0 ? zcp_vaddr0 :
1146 rdmc_wr_req_sm_zcp1 ? zcp_vaddr1 :
1147 rdmc_wr_req_sm_zcp2 ? zcp_vaddr2 :
1148 zcp_vaddr3;
1149
1150assign pkt_trans_len_all = rdmc_wr_req_sm_nom ? pkt_trans_len_tmp :
1151 rdmc_wr_req_sm_zcp0 ? zcp_len0 :
1152 rdmc_wr_req_sm_zcp1 ? zcp_len1 :
1153 rdmc_wr_req_sm_zcp2 ? zcp_len2 :
1154 zcp_len3;
1155
1156always @ (posedge clk)
1157if (reset)
1158 pkt_trans_len_r <= 14'b0;
1159else if (rdmc_wr_req_sm)
1160 pkt_trans_len_r <= pkt_trans_len_all;
1161else
1162 pkt_trans_len_r <= pkt_trans_len_r;
1163
1164always @ (posedge clk)
1165if (reset)
1166 orig_buf_addr <= 36'b0;
1167else if (rdmc_wr_req_pulse)
1168 orig_buf_addr <= orig_buf_addr_tmp;
1169else
1170 orig_buf_addr <= orig_buf_addr;
1171
1172always @ (posedge clk)
1173if (reset)
1174 pkt_buf_size_r <= 2'b0;
1175else if (rdmc_wr_req_pulse & is_hdr_wr_req)
1176 pkt_buf_size_r <= pkt_buf_size_tmp;
1177else
1178 pkt_buf_size_r <= pkt_buf_size_r;
1179
1180always @ (posedge clk)
1181if (reset)
1182 pref_buf_used_num_r <= 2'b0;
1183else if (rdmc_wr_req_sm_hdr)
1184 pref_buf_used_num_r <= pref_buf_used_num_tmp;
1185else
1186 pref_buf_used_num_r <= pref_buf_used_num_r;
1187
1188
1189always @ (posedge clk)
1190if (reset)
1191 full_hdr_r <= 1'b0;
1192else if (rdmc_wr_req_pulse & is_hdr_wr_req)
1193 full_hdr_r <= full_hdr;
1194else
1195 full_hdr_r <= full_hdr_r;
1196
1197wire multi_bit = rdmc_wr_req_accept_hdr ? pref_buf_used_num_r[1] :
1198 rdmc_wr_req_accept_jmb1 ? (&pref_buf_used_num_r) : 1'b0;
1199
1200
1201always @ (posedge clk)
1202if (reset)
1203 pkt_wrbk_data_r <= 23'b0;
1204else if (rdmc_wr_req_accept_hdr)
1205 pkt_wrbk_data_r <= pkt_wrbk_data[22:0];
1206else
1207 pkt_wrbk_data_r <= pkt_wrbk_data_r;
1208
1209always @ (posedge clk)
1210if (reset)
1211 bus_wrbk_data <= 41'b0;
1212else if (rdmc_wr_req_accept_hdr | rdmc_wr_req_accept_jmb1 | rdmc_wr_req_accept_jmb2)
1213 bus_wrbk_data <= {multi_bit, pkt_buf_size_r, orig_buf_addr[35:0], 2'b00};
1214else
1215 bus_wrbk_data <= bus_wrbk_data;
1216
1217always @ (posedge clk)
1218if (reset)
1219 rcr_wrbk_data <= 64'b0;
1220else if (update_rcr_shadw)
1221 rcr_wrbk_data <= {bus_wrbk_data[40], pkt_wrbk_data_r[22:0], bus_wrbk_data[39:0]};
1222else
1223 rcr_wrbk_data <= rcr_wrbk_data;
1224
1225
1226/******************/
1227//Drop Packet
1228/******************/
1229always @ (posedge clk)
1230if (reset)
1231 drop_pkt_en <= 1'b0;
1232else if (drop_pkt_en_sm)
1233 drop_pkt_en <= 1'b1;
1234else if (drop_pkt_done)
1235 drop_pkt_en <= 1'b0;
1236else
1237 drop_pkt_en <= drop_pkt_en;
1238
1239always @ (posedge clk)
1240if (reset)
1241 drop_pkt_port_gnt <= 4'b0;
1242else if (drop_pkt_en_sm)
1243 drop_pkt_port_gnt <= port_gnt;
1244else if (drop_pkt_done)
1245 drop_pkt_port_gnt <= 4'b0;
1246else
1247 drop_pkt_port_gnt <= drop_pkt_port_gnt;
1248
1249/******************/
1250//Detect L2 Padding
1251/******************/
1252wire pad_data_len_reg_en = rdmc_wr_req_sm_hdr |
1253 rdmc_wr_req_sm_zcp0 | rdmc_wr_req_sm_zcp1 |
1254 rdmc_wr_req_sm_zcp2 | rdmc_wr_req_sm_zcp3 ;
1255
1256wire[13:0] pad_data_len_in = {14{rdmc_wr_req_sm_hdr}} & muxed_pkt_len_r |
1257 {14{rdmc_wr_req_sm_zcp0}} & zcp_len0 |
1258 {14{rdmc_wr_req_sm_zcp1}} & zcp_len1 |
1259 {14{rdmc_wr_req_sm_zcp2}} & zcp_len2 |
1260 {14{rdmc_wr_req_sm_zcp3}} & zcp_len3 ;
1261
1262wire[13:0] pad_data_len_tmp = pad_data_len - pad_data_len_in;
1263
1264always @ (posedge clk)
1265if (reset)
1266 pad_data_len <= 14'b0;
1267else if (pad_data_len_reg_en)
1268 pad_data_len <= pad_data_len_tmp;
1269else if (stage1_en)
1270 pad_data_len <= muxed_l2_len_r;
1271else
1272 pad_data_len <= pad_data_len;
1273
1274
1275assign has_ly2_padding = (|pad_data_len[13:4]) | (pad_data_len[3:0] >= muxed_l2_len_r[3:0]) & (|muxed_l2_len_r[3:0]);
1276
1277
1278/*********************************/
1279//CMD interface signals
1280/*********************************/
1281always @ (posedge clk)
1282if (reset)
1283 rdmc_meta0_wr_req <= 1'b0;
1284else if (meta0_rdmc_wr_req_accept)
1285 rdmc_meta0_wr_req <= 1'b0;
1286else if (rdmc_wr_req_sm)
1287 rdmc_meta0_wr_req <= 1'b1;
1288else
1289 rdmc_meta0_wr_req <= rdmc_meta0_wr_req;
1290
1291always @ (posedge clk)
1292if (reset)
1293 rdmc_meta0_wr_req_cmd <= 8'b0;
1294else if (rdmc_wr_req_sm & rx_addr_32b_mode)
1295 rdmc_meta0_wr_req_cmd <= 8'b0010_0001;
1296else if (rdmc_wr_req_sm)
1297 rdmc_meta0_wr_req_cmd <= 8'b0010_1001;
1298else
1299 rdmc_meta0_wr_req_cmd <= rdmc_meta0_wr_req_cmd;
1300
1301always @ (posedge clk)
1302if (reset)
1303 rdmc_meta0_wr_req_address <= 64'b0;
1304else if (rdmc_wr_req_sm & rx_addr_32b_mode)
1305 rdmc_meta0_wr_req_address <= {32'b0, rdmc_req_addr_all[31:0]};
1306else if (rdmc_wr_req_sm)
1307 rdmc_meta0_wr_req_address <= rdmc_req_addr_all[63:0];
1308else
1309 rdmc_meta0_wr_req_address <= rdmc_meta0_wr_req_address;
1310
1311always @ (posedge clk)
1312if (reset)
1313 rdmc_meta0_wr_req_length <= 14'b0;
1314else if (rdmc_wr_req_sm)
1315 rdmc_meta0_wr_req_length <= pkt_trans_len_all[13:0];
1316else
1317 rdmc_meta0_wr_req_length <= rdmc_meta0_wr_req_length;
1318
1319always @ (posedge clk)
1320if (reset)
1321 rdmc_meta0_wr_req_port_num <= 2'b0;
1322else if (rdmc_wr_req_sm_hdr)
1323 rdmc_meta0_wr_req_port_num <= port_gnt_enc;
1324else
1325 rdmc_meta0_wr_req_port_num <= rdmc_meta0_wr_req_port_num;
1326
1327wire rdmc_wr_req_sm_zcp = rdmc_wr_req_sm_zcp0 |
1328 rdmc_wr_req_sm_zcp1 |
1329 rdmc_wr_req_sm_zcp2 |
1330 rdmc_wr_req_sm_zcp3;
1331always @ (posedge clk)
1332if (reset)
1333 rdmc_meta0_wr_req_dma_num <= 5'b0;
1334else if (rdmc_wr_req_sm_hdr)
1335 rdmc_meta0_wr_req_dma_num <= {1'b0, pkt_buf_gnt_enc};
1336else if (rdmc_wr_req_sm_zcp)
1337 rdmc_meta0_wr_req_dma_num <= zcp_rdc_num;
1338else
1339 rdmc_meta0_wr_req_dma_num <= rdmc_meta0_wr_req_dma_num;
1340
1341always @ (posedge clk)
1342if (reset)
1343 rdmc_meta0_wr_req_dma_num_int <= 5'b0; //for output timing
1344else if (rdmc_wr_req_sm_hdr)
1345 rdmc_meta0_wr_req_dma_num_int <= {1'b0, pkt_buf_gnt_enc};
1346else if (rdmc_wr_req_sm_zcp)
1347 rdmc_meta0_wr_req_dma_num_int <= zcp_rdc_num;
1348else
1349 rdmc_meta0_wr_req_dma_num_int <= rdmc_meta0_wr_req_dma_num_int;
1350
1351always @ (posedge clk)
1352if (reset)
1353 rdmc_meta0_wr_req_func_num <= 2'b0;
1354else if (rdmc_wr_req_sm_hdr)
1355 rdmc_meta0_wr_req_func_num <= dma_func_num_tmp;
1356else if (rdmc_wr_req_sm_zcp)
1357 rdmc_meta0_wr_req_func_num <= zcp_func_num; //need change
1358else
1359 rdmc_meta0_wr_req_func_num <= rdmc_meta0_wr_req_func_num;
1360
1361
1362/**********************************************************/
1363//Generate rdmc_wr_req_accept pulse for the second pipeline
1364/**********************************************************/
1365assign is_wr_data = is_hdr_wr_data | is_jmb1_wr_data | is_jmb2_wr_data |
1366 is_zcp0_wr_data | is_zcp1_wr_data | is_zcp2_wr_data | is_zcp3_wr_data;
1367
1368assign rdmc_wr_req_accept_pulse = rdmc_wr_req_accept_in | rdmc_wr_req_accept_reg;
1369
1370always @ (posedge clk)
1371if (reset)
1372 rdmc_wr_req_accept_in <= 1'b0;
1373else
1374 rdmc_wr_req_accept_in <= meta0_rdmc_wr_req_accept;
1375
1376always @ (posedge clk)
1377if (reset)
1378 rdmc_wr_req_accept_reg <= 1'b0;
1379else if (rdmc_wr_req_accept_in & is_wr_data & !pkt_req_cnt_pre_done)
1380 rdmc_wr_req_accept_reg <= 1'b1;
1381else if (rdmc_wr_req_accept)
1382 rdmc_wr_req_accept_reg <= 1'b0;
1383else
1384 rdmc_wr_req_accept_reg <= rdmc_wr_req_accept_reg;
1385
1386assign rdmc_wr_req_accept = rdmc_wr_req_accept_pulse & !is_wr_data |
1387 rdmc_wr_req_accept_pulse & is_wr_data & pkt_req_cnt_pre_done;
1388
1389
1390/***************************/
1391//4-Portso DDR Arbiter
1392/***************************/
1393assign org_req = ipp_full_pkt & zcp_full_pkt;
1394assign mask_req = org_req & ~n_flag;
1395assign bkup_req = org_req & ~bkup_n_flag;
1396
1397assign is_mask_req = |mask_req;
1398assign is_org_req = |org_req;
1399assign is_bkup_req = |bkup_req;
1400
1401assign final_req = is_mask_req ? mask_req :
1402 is_bkup_req ? bkup_req :
1403 org_req;
1404
1405niu_rdmc_rr_arbiter rr_arbiter_inst_a (.req (final_req_r),
1406 .token (token),
1407 .gnt (sel_port_gnt)
1408 );
1409
1410
1411always @ (posedge clk)
1412if (reset)
1413 reset_port_gnt <= 1'b0;
1414else
1415 reset_port_gnt <= reset_port_gnt_sm;
1416
1417always @ (posedge clk)
1418if (reset)
1419 port_gnt <= 4'b0;
1420else if (arb_cyc1_en)
1421 port_gnt <= sel_port_gnt;
1422else if (reset_port_gnt)
1423 port_gnt <= 4'b0;
1424else
1425 port_gnt <= port_gnt;
1426
1427always @ (posedge clk)
1428if (reset)
1429 port_gnt_r <= 4'b0;
1430else if (rdmc_wr_req_sm_hdr | drop_pkt_req)
1431 port_gnt_r <= port_gnt;
1432else
1433 port_gnt_r <= port_gnt_r;
1434
1435always @ (posedge clk)
1436if (reset)
1437 token <= 4'b0001;
1438else if (arb_cyc1_en & (|sel_port_gnt))
1439 token <= {sel_port_gnt[2:0], sel_port_gnt[3]};
1440else
1441 token <= token;
1442
1443
1444always @ (posedge clk)
1445if (reset)
1446 final_req_r <= 4'b0;
1447else if (arb_cyc0_en)
1448 final_req_r <= final_req;
1449else
1450 final_req_r <= final_req_r;
1451
1452always @ (posedge clk)
1453if (reset)
1454begin
1455 is_bkup_req_r <= 1'b0;
1456 is_org_req_r <= 1'b0;
1457end
1458else if (arb_cyc0_en)
1459begin
1460 is_bkup_req_r <= !is_mask_req & is_bkup_req;
1461 is_org_req_r <= !(is_mask_req | is_bkup_req) & is_org_req;
1462end
1463else
1464begin
1465 is_bkup_req_r <= is_bkup_req_r;
1466 is_org_req_r <= is_org_req_r;
1467end
1468
1469
1470/*********************************/
1471//Weight Calculation
1472/*********************************/
1473wire[15:0] curr_wt0_tmp = (curr_wt0 - {6'b0, muxed_l2_len_r[13:4]});
1474wire[15:0] curr_wt1_tmp = (curr_wt1 - {6'b0, muxed_l2_len_r[13:4]});
1475wire[15:0] curr_wt2_tmp = (curr_wt2 - {6'b0, muxed_l2_len_r[13:4]});
1476wire[15:0] curr_wt3_tmp = (curr_wt3 - {6'b0, muxed_l2_len_r[13:4]});
1477
1478wire[15:0] bkup_wt0_tmp = n_flag[0] ? (pt_drr_wt0_reg + curr_wt0[15:0]) : pt_drr_wt0_reg;
1479wire[15:0] bkup_wt1_tmp = n_flag[1] ? (pt_drr_wt1_reg + curr_wt1[15:0]) : pt_drr_wt1_reg;
1480wire[15:0] bkup_wt2_tmp = n_flag[2] ? (pt_drr_wt2_reg + curr_wt2[15:0]) : pt_drr_wt2_reg;
1481wire[15:0] bkup_wt3_tmp = n_flag[3] ? (pt_drr_wt3_reg + curr_wt3[15:0]) : pt_drr_wt3_reg;
1482
1483wire[15:0] new_bkup_wt0 = bkup_n_flag[0] ? (pt_drr_wt0_reg + bkup_wt0[15:0]) : pt_drr_wt0_reg;
1484wire[15:0] new_bkup_wt1 = bkup_n_flag[1] ? (pt_drr_wt1_reg + bkup_wt1[15:0]) : pt_drr_wt1_reg;
1485wire[15:0] new_bkup_wt2 = bkup_n_flag[2] ? (pt_drr_wt2_reg + bkup_wt2[15:0]) : pt_drr_wt2_reg;
1486wire[15:0] new_bkup_wt3 = bkup_n_flag[3] ? (pt_drr_wt3_reg + bkup_wt3[15:0]) : pt_drr_wt3_reg;
1487
1488wire update_curr_wt = arb_cyc1_en & is_bkup_req_r;
1489wire reset_curr_wt = arb_cyc1_en & is_org_req_r | idle_cycle;
1490wire update_bkup_wt = bkup_wt_en & (&(bkup_n_flag | ~org_req));
1491wire reset_bkup_wt = update_curr_wt | reset_curr_wt;
1492
1493always @ (posedge clk)
1494if (reset)
1495 curr_wt0 <= 16'h0400;
1496else if (stage1_en & port_gnt[0])
1497 curr_wt0 <= curr_wt0_tmp;
1498else if (reset_curr_wt)
1499 curr_wt0 <= pt_drr_wt0_reg;
1500else if (update_curr_wt)
1501 curr_wt0 <= bkup_wt0;
1502else
1503 curr_wt0 <= curr_wt0;
1504
1505always @ (posedge clk)
1506if (reset)
1507 curr_wt1 <= 16'h0400;
1508else if (stage1_en & port_gnt[1])
1509 curr_wt1 <= curr_wt1_tmp;
1510else if (reset_curr_wt)
1511 curr_wt1 <= pt_drr_wt1_reg;
1512else if (update_curr_wt)
1513 curr_wt1 <= bkup_wt1;
1514else
1515 curr_wt1 <= curr_wt1;
1516
1517always @ (posedge clk)
1518if (reset)
1519 curr_wt2 <= 16'h0066;
1520else if (stage1_en & port_gnt[2])
1521 curr_wt2 <= curr_wt2_tmp;
1522else if (reset_curr_wt)
1523 curr_wt2 <= pt_drr_wt2_reg;
1524else if (update_curr_wt)
1525 curr_wt2 <= bkup_wt2;
1526else
1527 curr_wt2 <= curr_wt2;
1528
1529always @ (posedge clk)
1530if (reset)
1531 curr_wt3 <= 16'h0066;
1532else if (stage1_en & port_gnt[3])
1533 curr_wt3 <= curr_wt3_tmp;
1534else if (reset_curr_wt)
1535 curr_wt3 <= pt_drr_wt3_reg;
1536else if (update_curr_wt)
1537 curr_wt3 <= bkup_wt3;
1538else
1539 curr_wt3 <= curr_wt3;
1540
1541
1542always @ (posedge clk)
1543if (reset)
1544 bkup_wt0 <= 16'h0400;
1545else if (stage2_en & port_gnt[0])
1546 bkup_wt0 <= bkup_wt0_tmp;
1547else if (update_bkup_wt)
1548 bkup_wt0 <= new_bkup_wt0;
1549else if (reset_bkup_wt)
1550 bkup_wt0 <= pt_drr_wt0_reg;
1551else
1552 bkup_wt0 <= bkup_wt0;
1553
1554
1555always @ (posedge clk)
1556if (reset)
1557 bkup_wt1 <= 16'h0400;
1558else if (stage2_en & port_gnt[1])
1559 bkup_wt1 <= bkup_wt1_tmp;
1560else if (update_bkup_wt)
1561 bkup_wt1 <= new_bkup_wt1;
1562else if (reset_bkup_wt)
1563 bkup_wt1 <= pt_drr_wt1_reg;
1564else
1565 bkup_wt1 <= bkup_wt1;
1566
1567always @ (posedge clk)
1568if (reset)
1569 bkup_wt2 <= 16'h0066;
1570else if (stage2_en & port_gnt[2])
1571 bkup_wt2 <= bkup_wt2_tmp;
1572else if (update_bkup_wt)
1573 bkup_wt2 <= new_bkup_wt2;
1574else if (reset_bkup_wt)
1575 bkup_wt2 <= pt_drr_wt2_reg;
1576else
1577 bkup_wt2 <= bkup_wt2;
1578
1579always @ (posedge clk)
1580if (reset)
1581 bkup_wt3 <= 16'h0066;
1582else if (stage2_en & port_gnt[3])
1583 bkup_wt3 <= bkup_wt3_tmp;
1584else if (update_bkup_wt)
1585 bkup_wt3 <= new_bkup_wt3;
1586else if (reset_bkup_wt)
1587 bkup_wt3 <= pt_drr_wt3_reg;
1588else
1589 bkup_wt3 <= bkup_wt3;
1590
1591
1592endmodule
1593
1594
1595
1596
1597
1598
1599