Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_rdmc_wr_dp.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_rdmc_wr_dp.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_dp (
36 clk,
37 reset,
38 muxed_port_rdc_num,
39 port_err_status,
40 full_hdr_r,
41 pkt_trans_len_r,
42 pref_buf_used_num_r,
43 drop_pkt_en_sm,
44 drop_pkt_en,
45 drop_pkt_port_gnt,
46 drop_pad_data,
47 is_zcp0_wr_req,
48 is_zcp1_wr_req,
49 is_zcp2_wr_req,
50 is_zcp3_wr_req,
51 rdmc_wr_req_accept_hdr,
52 rdmc_wr_req_accept_jmb,
53 rdmc_wr_req_accept_zcp0,
54 rdmc_wr_req_accept_zcp1,
55 rdmc_wr_req_accept_zcp2,
56 rdmc_wr_req_accept_zcp3,
57 port_gnt,
58 port_gnt_r,
59 stage0_en,
60 rdmc_meta0_wr_req_dma_num_int,
61
62 ipp_dmc_ful_pkt0,
63 ipp_dmc_dat_ack0,
64 ipp_dmc_dat_err0,
65 ipp_dmc_data0,
66 ipp_dmc_ful_pkt1,
67 ipp_dmc_dat_ack1,
68 ipp_dmc_dat_err1,
69 ipp_dmc_data1,
70 ipp_dmc_ful_pkt2,
71 ipp_dmc_dat_ack2,
72 ipp_dmc_dat_err2,
73 ipp_dmc_data2,
74 ipp_dmc_ful_pkt3,
75 ipp_dmc_dat_ack3,
76 ipp_dmc_dat_err3,
77 ipp_dmc_data3,
78
79 zcp_dmc_ful_pkt0,
80 zcp_dmc_ack0,
81 zcp_dmc_dat0,
82 zcp_dmc_dat_err0,
83 zcp_dmc_ful_pkt1,
84 zcp_dmc_ack1,
85 zcp_dmc_dat1,
86 zcp_dmc_dat_err1,
87 zcp_dmc_ful_pkt2,
88 zcp_dmc_ack2,
89 zcp_dmc_dat2,
90 zcp_dmc_dat_err2,
91 zcp_dmc_ful_pkt3,
92 zcp_dmc_ack3,
93 zcp_dmc_dat3,
94 zcp_dmc_dat_err3,
95 meta0_rdmc_wr_data_req,
96
97 muxed_rdc_num_r,
98 muxed_drop_pkt_r,
99 muxed_s_event_r,
100 muxed_pkt_len,
101 muxed_pkt_len_r,
102 muxed_l2_len_r,
103 rdmc_eop_for_padding,
104 pkt_req_cnt_pre_done,
105 pkt_req_cnt_done,
106 pkt_req_cnt_done_r,
107 pkt_req_cnt_e_done_mod,
108 pkt_wrbk_data,
109 drop_pkt_done,
110 rdmc_wr_data_dma_num,
111 ipp_full_pkt,
112 zcp_full_pkt,
113 ipp_pkt_sop,
114 zcp_pkt_sop,
115 muxed_zcopy_mode_r,
116 muxed_data_err_r2,
117 zcopy_mode,
118 jmb_pkt_type,
119 zcp_wr_type,
120 zcp_rdc_num,
121
122 zcp_vaddr0,
123 zcp_vaddr1,
124 zcp_vaddr2,
125 zcp_vaddr3,
126 zcp_len0,
127 zcp_len1,
128 zcp_len2,
129 zcp_len3,
130 zcp_func_num,
131
132 dmc_ipp_dat_req0,
133 dmc_ipp_dat_req1,
134 dmc_ipp_dat_req2,
135 dmc_ipp_dat_req3,
136
137 dmc_zcp_req0,
138 dmc_zcp_req1,
139 dmc_zcp_req2,
140 dmc_zcp_req3,
141
142 rdmc_meta0_wr_data_valid,
143 rdmc_meta0_wr_data,
144 rdmc_meta0_wr_req_byteenable,
145 rdmc_meta0_wr_transfer_comp,
146 rdmc_meta0_wr_transfer_comp_int,
147 rdmc_meta0_wr_status,
148
149 port_err_event,
150 ipp_dat_req0_data,
151 ipp_dat_req1_data,
152 ipp_dat_req2_data,
153 ipp_dat_req3_data,
154 wr_dp_sm_state
155
156 );
157
158
159input clk;
160input reset;
161input[3:0] port_err_status;
162input[4:0] muxed_port_rdc_num;
163input full_hdr_r;
164input[13:0] pkt_trans_len_r;
165input[1:0] pref_buf_used_num_r;
166input drop_pkt_en_sm;
167input drop_pkt_en;
168input[3:0] drop_pkt_port_gnt;
169input drop_pad_data;
170input is_zcp0_wr_req;
171input is_zcp1_wr_req;
172input is_zcp2_wr_req;
173input is_zcp3_wr_req;
174input rdmc_wr_req_accept_hdr;
175input rdmc_wr_req_accept_jmb;
176input rdmc_wr_req_accept_zcp0;
177input rdmc_wr_req_accept_zcp1;
178input rdmc_wr_req_accept_zcp2;
179input rdmc_wr_req_accept_zcp3;
180input[3:0] port_gnt;
181input[3:0] port_gnt_r;
182input stage0_en;
183input[4:0] rdmc_meta0_wr_req_dma_num_int;
184input ipp_dmc_ful_pkt0;
185input ipp_dmc_dat_ack0;
186input ipp_dmc_dat_err0;
187input[129:0] ipp_dmc_data0;
188input ipp_dmc_ful_pkt1;
189input ipp_dmc_dat_ack1;
190input ipp_dmc_dat_err1;
191input[129:0] ipp_dmc_data1;
192input ipp_dmc_ful_pkt2;
193input ipp_dmc_dat_ack2;
194input ipp_dmc_dat_err2;
195input[129:0] ipp_dmc_data2;
196input ipp_dmc_ful_pkt3;
197input ipp_dmc_dat_ack3;
198input ipp_dmc_dat_err3;
199input[129:0] ipp_dmc_data3;
200
201input zcp_dmc_ful_pkt0;
202input zcp_dmc_ack0;
203input[129:0] zcp_dmc_dat0;
204input zcp_dmc_dat_err0;
205input zcp_dmc_ful_pkt1;
206input zcp_dmc_ack1;
207input[129:0] zcp_dmc_dat1;
208input zcp_dmc_dat_err1;
209input zcp_dmc_ful_pkt2;
210input zcp_dmc_ack2;
211input[129:0] zcp_dmc_dat2;
212input zcp_dmc_dat_err2;
213input zcp_dmc_ful_pkt3;
214input zcp_dmc_ack3;
215input[129:0] zcp_dmc_dat3;
216input zcp_dmc_dat_err3;
217input meta0_rdmc_wr_data_req;
218
219output[4:0] muxed_rdc_num_r;
220output muxed_drop_pkt_r;
221output muxed_s_event_r;
222output[13:0] muxed_pkt_len;
223output[13:0] muxed_pkt_len_r;
224output[13:0] muxed_l2_len_r;
225output rdmc_eop_for_padding;
226output pkt_req_cnt_pre_done;
227output pkt_req_cnt_done;
228output pkt_req_cnt_done_r;
229output pkt_req_cnt_e_done_mod;
230output[22:0] pkt_wrbk_data;
231output drop_pkt_done;
232output[4:0] rdmc_wr_data_dma_num;
233output[3:0] ipp_full_pkt;
234output[3:0] zcp_full_pkt;
235output[3:0] ipp_pkt_sop;
236output[3:0] zcp_pkt_sop;
237output muxed_zcopy_mode_r;
238output muxed_data_err_r2;
239output zcopy_mode;
240output[1:0] jmb_pkt_type;
241output[1:0] zcp_wr_type;
242output[4:0] zcp_rdc_num;
243output[63:0] zcp_vaddr0;
244output[63:0] zcp_vaddr1;
245output[63:0] zcp_vaddr2;
246output[63:0] zcp_vaddr3;
247output[13:0] zcp_len0;
248output[13:0] zcp_len1;
249output[13:0] zcp_len2;
250output[13:0] zcp_len3;
251output[1:0] zcp_func_num;
252output dmc_ipp_dat_req0;
253output dmc_ipp_dat_req1;
254output dmc_ipp_dat_req2;
255output dmc_ipp_dat_req3;
256output dmc_zcp_req0;
257output dmc_zcp_req1;
258output dmc_zcp_req2;
259output dmc_zcp_req3;
260output rdmc_meta0_wr_data_valid;
261output[127:0] rdmc_meta0_wr_data;
262output[15:0] rdmc_meta0_wr_req_byteenable;
263output rdmc_meta0_wr_transfer_comp;
264output rdmc_meta0_wr_transfer_comp_int;
265output[3:0] rdmc_meta0_wr_status;
266output[8:0] port_err_event;
267output ipp_dat_req0_data;
268output ipp_dat_req1_data;
269output ipp_dat_req2_data;
270output ipp_dat_req3_data;
271output[4:0] wr_dp_sm_state;
272
273reg ipp_full_pkt0;
274reg ipp_data_ack0;
275reg ipp_data_err0;
276reg[129:0] ipp_data0;
277reg ipp_full_pkt1;
278reg ipp_data_ack1;
279reg ipp_data_err1;
280reg[129:0] ipp_data1;
281reg ipp_full_pkt2;
282reg ipp_data_ack2;
283reg ipp_data_err2;
284reg[129:0] ipp_data2;
285reg ipp_full_pkt3;
286reg ipp_data_ack3;
287reg ipp_data_err3;
288reg[129:0] ipp_data3;
289reg zcp_full_pkt0;
290reg zcp_data_ack0;
291reg zcp_data_err0;
292reg[129:0] zcp_data0;
293reg zcp_full_pkt1;
294reg zcp_data_ack1;
295reg zcp_data_err1;
296reg[129:0] zcp_data1;
297reg zcp_full_pkt2;
298reg zcp_data_ack2;
299reg zcp_data_err2;
300reg[129:0] zcp_data2;
301reg zcp_full_pkt3;
302reg zcp_data_ack3;
303reg zcp_data_err3;
304reg[129:0] zcp_data3;
305
306reg muxed_cksum_err_r;
307reg muxed_bad_crc_r;
308reg[3:0] muxed_ipp_pkt_id_r;
309reg[13:0] muxed_l2_len_r;
310reg[13:0] muxed_pkt_len_r;
311reg[1:0] muxed_pkt_type_r;
312reg muxed_drop_pkt_r;
313reg muxed_s_event_r;
314reg muxed_zcopy_mode_r;
315reg muxed_orig_zcopy_mode_r;
316reg muxed_fflp_hw_err_r;
317reg muxed_mac_promis_r;
318reg[4:0] muxed_rdc_num_r;
319reg muxed_noport_r;
320reg muxed_zcp_err_r;
321reg muxed_orig_zcopy_mode_r1;
322
323reg rdmc_wr_data_req;
324reg rdmc_wr_data_req_dly;
325reg[4:0] rdmc_wr_data_dma_num;
326reg[3:0] port_gnt_r1;
327reg[3:0] port_gnt_r2;
328reg is_first_accept;
329reg ipp_data_req_p_r;
330reg ipp_data_req_p_r1;
331reg ipp_data_req_p_r2;
332reg zcopy_mode;
333reg[1:0] jmb_pkt_type;
334reg[1:0] zcp_wr_type;
335reg full_hdr_r1;
336
337reg[2:0] zcp_req_cnt;
338reg dmc_zcp_req0;
339reg dmc_zcp_req1;
340reg dmc_zcp_req2;
341reg dmc_zcp_req3;
342reg[1:0] zcp_ack_cnt;
343reg[127:0] zcp_data_reg0;
344reg[31:0] zcp_data_reg1;
345
346`ifdef NEPTUNE
347reg[127:0] zcp_data_reg2;
348reg[127:0] zcp_data_reg3;
349reg[21:0] zcp_data_reg1_lo; //for zcp page handle
350`else
351wire[127:0] zcp_data_reg2;
352wire[127:0] zcp_data_reg3;
353wire[21:0] zcp_data_reg1_lo;
354`endif
355
356reg[9:0] drop_pkt_word_cnt;
357reg[3:0] drop_pkt_en_dly;
358reg[10:0] ipp_pkt_len_word_cnt;
359reg dmc_ipp_dat_req0;
360reg dmc_ipp_dat_req1;
361reg dmc_ipp_dat_req2;
362reg dmc_ipp_dat_req3;
363reg ipp_data_req0_dly;
364reg ipp_data_req1_dly;
365reg ipp_data_req2_dly;
366reg ipp_data_req3_dly;
367reg ipp_data_req_dly1;
368reg ipp_data_req_dly2;
369reg stage0_en_r;
370reg drop_pad_data_r;
371reg ipp_fzcp_eop_tmp;
372reg ipp_fzcp_eop_tmp1;
373reg ipp_fzcp_eop_tmp2;
374reg ipp_fzcp_eop;
375
376reg ipp_dat_req0_data;
377reg ipp_dat_req1_data;
378reg ipp_dat_req2_data;
379reg ipp_dat_req3_data;
380
381reg[13:0] new_zcp_data_len_r;
382reg[9:0] pkt_len_word_cnt;
383reg[9:0] data_req_cnt;
384reg pkt_req_cnt_pre_done;
385reg pkt_req_cnt_done;
386reg pkt_req_cnt_done_r;
387reg pkt_req_cnt_done_r1;
388reg pkt_req_cnt_done_r2;
389reg pkt_req_cnt_e_done_r;
390reg[3:0] wr_len_last_bits;
391reg[3:0] wr_len_last_bits_r;
392reg[15:0] wr_data_byte_dec;
393
394reg[3:0] next_data_offset_reg;
395reg[3:0] data_offset_reg;
396reg[127:0] save_reg_trans;
397reg[127:0] date_save_reg_trans;
398reg[127:0] data_save_reg_tmp;
399reg[127:0] data_save_reg;
400reg[127:0] rdmc_wr_data_tmp;
401
402reg muxed_data_err;
403reg muxed_data_err_r1;
404reg muxed_data_err_r2;
405reg[9:0] rdmc_eop_cnt;
406reg rdmc_cal_eop;
407reg rdmc_cal_eop_r;
408reg rdmc_cal_eop_tmp;
409reg rdmc_cal_eop_tmp1;
410reg zcp_second_data_ack_dly;
411
412reg zcp_sop_reg0;
413reg zcp_sop_reg1;
414reg zcp_sop_reg2;
415reg zcp_sop_reg3;
416reg ipp_sop_reg0;
417reg ipp_sop_reg1;
418reg ipp_sop_reg2;
419reg ipp_sop_reg3;
420
421reg[127:0] rdmc_meta0_wr_data;
422reg rdmc_meta0_wr_data_valid;
423reg rdmc_meta0_wr_transfer_comp;
424reg rdmc_meta0_wr_transfer_comp_int;
425reg[15:0] rdmc_meta0_wr_req_byteenable;
426reg rdmc_wr_last_comp;
427reg wait_drop_pkt_eop;
428
429reg rdmc_wr_req_accept_hdr_r;
430reg rdmc_wr_req_accept_hdr_r1;
431reg[127:0] zcp_data_reg0_r;
432reg[15:0] zcp_data_reg1_r;
433
434wire offset_reg_en;
435wire[1:0] offset_sel;
436wire wr_idle_state;
437wire[1:0] rdmc_wr_data_sel;
438wire rdmc_wr_data_valid_sm;
439wire rdmc_wr_data_comp_sm;
440wire rdmc_wr_last_comp_sm;
441wire jmb_wr_cycle_sm;
442
443wire pkt_req_cnt_e_done_mod;
444
445wire muxed_ipp_data_ack;
446wire[27:0] ipp_ctrl_word0;
447wire[27:0] ipp_ctrl_word1;
448wire[27:0] ipp_ctrl_word2;
449wire[27:0] ipp_ctrl_word3;
450wire[27:0] muxed_ipp_ctrl_w;
451wire[24:0] zcp_ctrl_word0;
452wire[24:0] zcp_ctrl_word1;
453wire[24:0] zcp_ctrl_word2;
454wire[24:0] zcp_ctrl_word3;
455wire[24:0] muxed_zcp_ctrl_w;
456
457wire muxed_cksum_err;
458wire muxed_bad_crc;
459wire[13:0] muxed_l2_len;
460wire[13:0] muxed_pkt_len;
461wire[1:0] muxed_pkt_type;
462wire[3:0] muxed_ipp_pkt_id;
463wire[5:0] muxed_ipp_drop_bits;
464wire muxed_ipp_drop_pkt;
465wire[7:0] muxed_pkt_hdr_len;
466wire muxed_s_event;
467wire muxed_zcp_drop_pkt;
468wire muxed_fflp_hw_err;
469wire muxed_mac_promis;
470wire muxed_zcopy_mode;
471wire muxed_orig_zcopy_mode;
472wire[4:0] muxed_tbl_rdc_num;
473wire[4:0] muxed_fflp_rdc_num;
474wire muxed_noport;
475wire muxed_zcp_err;
476
477wire[3:0] ipp_pkt_sop;
478wire[3:0] zcp_pkt_sop;
479wire[3:0] ipp_full_pkt;
480wire[3:0] zcp_full_pkt;
481
482wire is_l2_err;
483wire[4:0] muxed_rdc_num;
484
485wire zcp_req_cnt_done;
486wire zcp_data_ack;
487wire[127:0] muxed_zcp_data;
488wire muxed_zcp_data_eop;
489wire[4:0] zcp_rdc_num;
490wire[1:0] zcp_type;
491wire[3:0] zcp_pkt_id;
492wire[43:0] zcp_vaddr0_tmp;
493wire[43:0] zcp_vaddr1_tmp;
494wire[43:0] zcp_vaddr2_tmp;
495wire[43:0] zcp_vaddr3_tmp;
496
497wire[63:0] zcp_vaddr0;
498wire[13:0] zcp_len0;
499wire[63:0] zcp_vaddr1;
500wire[13:0] zcp_len1;
501wire[63:0] zcp_vaddr2;
502wire[13:0] zcp_len2;
503wire[63:0] zcp_vaddr3;
504wire[13:0] zcp_len3;
505wire[1:0] zcp_func_num;
506
507wire is_zcp_wr_req;
508wire rdmc_wr_req_accept_zcp;
509wire rdmc_wr_req_accept_all;
510wire rdmc_wr_req_accept_data;
511
512wire drop_pkt_len_leftover;
513wire[9:0] drop_pkt_word_cnt_tmp;
514wire drop_pkt_done;
515
516wire zcp_has_ipp_data_req;
517wire[13:0] zcp_data_len;
518wire[13:0] new_zcp_data_len_tmp;
519wire[13:0] new_zcp_data_len;
520
521wire[13:0] ipp_pkt_len;
522wire ipp_pkt_len_left_over;
523wire[10:0] ipp_pkt_len_word_cnt_tmp;
524wire ipp_data_req_en;
525
526wire rdmc_wr_data_req_p;
527wire rdmc_wr_data_req_mod;
528
529wire ipp_data_req0_p;
530wire ipp_data_req1_p;
531wire ipp_data_req2_p;
532wire ipp_data_req3_p;
533wire ipp_data_req_p;
534wire ipp_data_req_dly;
535
536wire[127:0] muxed_ipp_data;
537wire muxed_ipp_data_eop;
538wire muxed_ipp_data_err;
539wire[3:0] ipp_data_req_maskout;
540wire ipp_data_req_in;
541wire ipp_fzcp_eop_in;
542wire ipp_next_eop;
543
544wire pkt_len_left_over;
545wire[9:0] pkt_len_word_cnt_tmp;
546wire pkt_req_cnt_done_tmp;
547wire[15:0] wr_data_byte_en;
548
549wire[3:0] next_data_offset_tmp1;
550wire[3:0] next_data_offset_tmp2;
551wire[3:0] next_data_offset_tmp;
552
553wire[4:0] wr_dp_sm_state;
554
555wire[3:0] port_ipp_eop_err;
556wire[3:0] port_zcp_eop_err;
557wire[8:0] port_err_event;
558
559
560//Input registers
561always @ (posedge clk)
562begin
563 ipp_full_pkt0 <= ipp_dmc_ful_pkt0 & !ipp_dmc_dat_err0;
564 ipp_data_ack0 <= ipp_dmc_dat_ack0;
565 ipp_data_err0 <= ipp_dmc_dat_err0;
566 ipp_data0 <= ipp_dmc_data0;
567
568 ipp_full_pkt1 <= ipp_dmc_ful_pkt1 & !ipp_dmc_dat_err1;
569 ipp_data_ack1 <= ipp_dmc_dat_ack1;
570 ipp_data_err1 <= ipp_dmc_dat_err1;
571 ipp_data1 <= ipp_dmc_data1;
572
573 ipp_full_pkt2 <= ipp_dmc_ful_pkt2 & !ipp_dmc_dat_err2;
574 ipp_data_ack2 <= ipp_dmc_dat_ack2;
575 ipp_data_err2 <= ipp_dmc_dat_err2;
576 ipp_data2 <= ipp_dmc_data2;
577
578 ipp_full_pkt3 <= ipp_dmc_ful_pkt3 & !ipp_dmc_dat_err3;
579 ipp_data_ack3 <= ipp_dmc_dat_ack3;
580 ipp_data_err3 <= ipp_dmc_dat_err3;
581 ipp_data3 <= ipp_dmc_data3;
582
583 zcp_full_pkt0 <= zcp_dmc_ful_pkt0 & !zcp_dmc_dat_err0;
584 zcp_data_ack0 <= zcp_dmc_ack0;
585 zcp_data0 <= zcp_dmc_dat0;
586 zcp_data_err0 <= zcp_dmc_dat_err0;
587
588 zcp_full_pkt1 <= zcp_dmc_ful_pkt1 & !zcp_dmc_dat_err1;
589 zcp_data_ack1 <= zcp_dmc_ack1;
590 zcp_data1 <= zcp_dmc_dat1;
591 zcp_data_err1 <= zcp_dmc_dat_err1;
592
593 zcp_full_pkt2 <= zcp_dmc_ful_pkt2 & !zcp_dmc_dat_err2;
594 zcp_data_ack2 <= zcp_dmc_ack2;
595 zcp_data2 <= zcp_dmc_dat2;
596 zcp_data_err2 <= zcp_dmc_dat_err2;
597
598 zcp_full_pkt3 <= zcp_dmc_ful_pkt3 & !zcp_dmc_dat_err3;
599 zcp_data_ack3 <= zcp_dmc_ack3;
600 zcp_data3 <= zcp_dmc_dat3;
601 zcp_data_err3 <= zcp_dmc_dat_err3;
602end
603
604
605/**********************/
606// Select port
607/**********************/
608/*
609assign ipp_ctrl_word0 = {ipp_data0[103], ipp_data0[60:56], ipp_data0[53:48],
610 ipp_data0[101:88], ipp_data0[102], ipp_data0[17]}; //28bits
611
612assign ipp_ctrl_word1 = {ipp_data1[103], ipp_data1[60:56], ipp_data1[53:48],
613 ipp_data1[101:88], ipp_data1[102], ipp_data1[17]}; //28bits
614
615assign ipp_ctrl_word2 = {ipp_data2[103], ipp_data2[60:56], ipp_data2[53:48],
616 ipp_data2[101:88], ipp_data2[102], ipp_data2[17]}; //28bits
617
618assign ipp_ctrl_word3 = {ipp_data3[103], ipp_data3[60:56], ipp_data3[53:48],
619 ipp_data3[101:88], ipp_data3[102], ipp_data3[17]}; //28bits
620*/
621
622assign ipp_ctrl_word0 = {ipp_data0[57:52], ipp_data0[49:44],
623 ipp_data0[101:88], ipp_data0[102], ipp_data0[17]}; //28bits
624
625assign ipp_ctrl_word1 = {ipp_data1[57:52], ipp_data1[49:44],
626 ipp_data1[101:88], ipp_data1[102], ipp_data1[17]}; //28bits
627
628assign ipp_ctrl_word2 = {ipp_data2[57:52], ipp_data2[49:44],
629 ipp_data2[101:88], ipp_data2[102], ipp_data2[17]}; //28bits
630
631assign ipp_ctrl_word3 = {ipp_data3[57:52], ipp_data3[49:44],
632 ipp_data3[101:88], ipp_data3[102], ipp_data3[17]}; //28bits
633
634
635assign muxed_ipp_ctrl_w = {28{port_gnt[0]}} & ipp_ctrl_word0 |
636 {28{port_gnt[1]}} & ipp_ctrl_word1 |
637 {28{port_gnt[2]}} & ipp_ctrl_word2 |
638 {28{port_gnt[3]}} & ipp_ctrl_word3;
639
640assign zcp_ctrl_word0 = {zcp_data0[117], zcp_data0[111:104], zcp_data0[95:94], zcp_data0[87],
641 zcp_data0[79:76], zcp_data0[63:56], zcp_data0[44]}; //25 bits
642
643assign zcp_ctrl_word1 = {zcp_data1[117], zcp_data1[111:104], zcp_data1[95:94], zcp_data1[87],
644 zcp_data1[79:76], zcp_data1[63:56], zcp_data1[44]};
645
646assign zcp_ctrl_word2 = {zcp_data2[117], zcp_data2[111:104], zcp_data2[95:94], zcp_data2[87],
647 zcp_data2[79:76], zcp_data2[63:56], zcp_data2[44]};
648
649assign zcp_ctrl_word3 = {zcp_data3[117], zcp_data3[111:104], zcp_data3[95:94], zcp_data3[87],
650 zcp_data3[79:76], zcp_data3[63:56], zcp_data3[44]};
651
652assign muxed_zcp_ctrl_w = {25{port_gnt[0]}} & zcp_ctrl_word0 |
653 {25{port_gnt[1]}} & zcp_ctrl_word1 |
654 {25{port_gnt[2]}} & zcp_ctrl_word2 |
655 {25{port_gnt[3]}} & zcp_ctrl_word3;
656
657//assign muxed_cksum_err = muxed_ipp_data_c[17];
658//assign muxed_pkt_id = muxed_ipp_data_c[53:50];
659//assign muxed_pkt_len = muxed_ipp_data_c[101:88];
660//assign muxed_bad_crc = muxed_ipp_data_c[102]
661//assign muxed_ipp_discard_bits = {muxed_ipp_data_c[103], muxed_ipp_data_c[60:56]};
662
663assign muxed_cksum_err = muxed_ipp_ctrl_w[0];
664assign muxed_bad_crc = muxed_ipp_ctrl_w[1];
665assign muxed_pkt_len = muxed_zcopy_mode ? {6'b0, muxed_pkt_hdr_len} : muxed_ipp_ctrl_w[15:2];
666assign muxed_l2_len = muxed_ipp_ctrl_w[15:2];
667assign muxed_pkt_type = muxed_ipp_ctrl_w[17:16];
668assign muxed_ipp_pkt_id = muxed_ipp_ctrl_w[21:18];
669assign muxed_ipp_drop_bits = muxed_ipp_ctrl_w[27:22];
670assign muxed_ipp_drop_pkt = |muxed_ipp_drop_bits;
671
672assign muxed_zcp_err = !muxed_orig_zcopy_mode & muxed_zcp_ctrl_w[0];
673assign muxed_pkt_hdr_len = muxed_zcp_ctrl_w[8:1];
674assign muxed_s_event = muxed_zcp_ctrl_w[9];
675assign muxed_zcp_drop_pkt = muxed_zcp_ctrl_w[10];
676assign muxed_fflp_hw_err = muxed_zcp_ctrl_w[11];
677assign muxed_mac_promis = muxed_zcp_ctrl_w[12];
678assign muxed_orig_zcopy_mode = muxed_zcp_ctrl_w[13];
679assign muxed_zcopy_mode = muxed_orig_zcopy_mode & !(muxed_bad_crc | muxed_cksum_err);
680assign muxed_tbl_rdc_num = muxed_zcp_ctrl_w[18:14];
681assign muxed_fflp_rdc_num = muxed_zcp_ctrl_w[23:19];
682assign muxed_noport = muxed_zcp_ctrl_w[24];
683
684assign ipp_full_pkt = {ipp_full_pkt3, ipp_full_pkt2, ipp_full_pkt1, ipp_full_pkt0} & (~port_err_status);
685assign zcp_full_pkt = {zcp_full_pkt3, zcp_full_pkt2, zcp_full_pkt1, zcp_full_pkt0} & (~port_err_status);
686
687assign ipp_pkt_sop = {ipp_sop_reg3, ipp_sop_reg2, ipp_sop_reg1, ipp_sop_reg0};
688assign zcp_pkt_sop = {zcp_sop_reg3, zcp_sop_reg2, zcp_sop_reg1, zcp_sop_reg0};
689
690/**********************/
691//Select RDC number
692/**********************/
693assign is_l2_err = muxed_mac_promis | muxed_bad_crc | muxed_ipp_drop_pkt | muxed_zcp_drop_pkt;
694assign muxed_rdc_num = is_l2_err ? muxed_port_rdc_num :
695 muxed_cksum_err ? muxed_tbl_rdc_num :
696 muxed_fflp_rdc_num;
697always @ (posedge clk)
698if (reset)
699begin
700 muxed_cksum_err_r <= 1'b0;
701 muxed_bad_crc_r <= 1'b0;
702 muxed_ipp_pkt_id_r <= 4'b0;
703 muxed_pkt_len_r <= 14'b0;
704 muxed_l2_len_r <= 14'b0;
705 muxed_drop_pkt_r <= 1'b0;
706 muxed_mac_promis_r <= 1'b0;
707 muxed_s_event_r <= 1'b0;
708 muxed_fflp_hw_err_r <= 1'b0;
709 muxed_zcopy_mode_r <= 1'b0;
710 muxed_orig_zcopy_mode_r <= 1'b0;
711 muxed_rdc_num_r <= 5'b0;
712 muxed_pkt_type_r <= 2'b0;
713 muxed_noport_r <= 1'b0;
714 muxed_zcp_err_r <= 1'b0;
715end
716else if (stage0_en)
717begin
718 muxed_cksum_err_r <= muxed_cksum_err;
719 muxed_bad_crc_r <= muxed_bad_crc;
720 muxed_ipp_pkt_id_r <= muxed_ipp_pkt_id;
721 muxed_pkt_len_r <= muxed_pkt_len;
722 muxed_l2_len_r <= muxed_l2_len;
723 muxed_drop_pkt_r <= muxed_ipp_drop_pkt | muxed_zcp_drop_pkt;
724 muxed_mac_promis_r <= muxed_mac_promis;
725 muxed_s_event_r <= muxed_s_event;
726 muxed_fflp_hw_err_r <= muxed_fflp_hw_err;
727 muxed_zcopy_mode_r <= muxed_zcopy_mode;
728 muxed_orig_zcopy_mode_r <= muxed_orig_zcopy_mode;
729 muxed_rdc_num_r <= muxed_rdc_num;
730 muxed_pkt_type_r <= muxed_pkt_type;
731 muxed_noport_r <= muxed_noport;
732 muxed_zcp_err_r <= muxed_zcp_err;
733end
734
735wire[2:0] err_inc = muxed_bad_crc_r ? 3'b001 :
736 muxed_cksum_err_r ? 3'b011 :
737 muxed_fflp_hw_err_r ? 3'b100 :
738 muxed_zcp_err_r ? 3'b101 : 3'b000;
739
740wire[22:0] pkt_wrbk_data = {muxed_pkt_type_r, muxed_zcopy_mode_r, muxed_noport_r,
741 muxed_mac_promis_r, err_inc, 1'b0, muxed_l2_len_r}; //23bits
742
743
744/*************************/
745//Pipeline Control
746/*************************/
747always @ (posedge clk)
748if (reset)
749 port_gnt_r1 <= 4'b0;
750else if (rdmc_wr_req_accept_hdr)
751 port_gnt_r1 <= port_gnt_r;
752else
753 port_gnt_r1 <= port_gnt_r1;
754
755always @ (posedge clk)
756if (reset)
757 is_first_accept <= 1'b0;
758else if (rdmc_wr_req_accept_hdr)
759 is_first_accept <= 1'b1;
760else if (ipp_data_req_p)
761 is_first_accept <= 1'b0;
762else
763 is_first_accept <= is_first_accept;
764
765always @ (posedge clk)
766if (reset)
767begin
768 ipp_data_req_p_r <= 1'b0;
769 ipp_data_req_p_r1 <= 1'b0;
770 ipp_data_req_p_r2 <= 1'b0;
771end
772else
773begin
774 ipp_data_req_p_r <= ipp_data_req_p & is_first_accept;
775 ipp_data_req_p_r1 <= ipp_data_req_p_r;
776 ipp_data_req_p_r2 <= ipp_data_req_p_r1;
777end
778
779always @ (posedge clk)
780if (reset)
781begin
782 full_hdr_r1 <= 1'b0;
783 zcopy_mode <= 1'b0;
784 jmb_pkt_type <= 2'b0;
785end
786else if (rdmc_wr_req_accept_hdr)
787begin
788 full_hdr_r1 <= full_hdr_r;
789 zcopy_mode <= muxed_zcopy_mode_r;
790 jmb_pkt_type <= pref_buf_used_num_r;
791end
792else
793begin
794 full_hdr_r1 <= full_hdr_r1;
795 zcopy_mode <= zcopy_mode;
796 jmb_pkt_type <= jmb_pkt_type;
797end
798
799always @ (posedge clk)
800if (reset)
801 port_gnt_r2 <= 4'b0;
802else if (ipp_data_req_p_r2)
803 port_gnt_r2 <= port_gnt_r1;
804else if (drop_pkt_done)
805 port_gnt_r2 <= drop_pkt_port_gnt;
806else if (rdmc_cal_eop_r)
807 port_gnt_r2 <= 4'b0;
808else
809 port_gnt_r2 <= port_gnt_r2;
810
811
812always @ (posedge clk)
813if (reset)
814 zcp_wr_type <= 2'b00;
815else if (ipp_data_req_p_r2)
816 zcp_wr_type <= zcp_type[1:0];
817else
818 zcp_wr_type <= zcp_wr_type;
819
820always @ (posedge clk)
821if (reset)
822 rdmc_wr_data_dma_num <= 5'b0;
823else if (rdmc_wr_req_accept_hdr)
824 rdmc_wr_data_dma_num <= rdmc_meta0_wr_req_dma_num_int;
825else
826 rdmc_wr_data_dma_num <= rdmc_wr_data_dma_num;
827
828/**********************/
829//ZCP Req and Data
830/**********************/
831assign zcp_req_cnt_done = muxed_orig_zcopy_mode ? zcp_req_cnt[2] : zcp_req_cnt[1];
832
833always @ (posedge clk)
834if (reset)
835 zcp_req_cnt <= 3'b0;
836else if (zcp_req_cnt_done)
837 zcp_req_cnt <= 3'b0;
838else if (stage0_en | (|zcp_req_cnt))
839 zcp_req_cnt <= zcp_req_cnt + 3'd1;
840else
841 zcp_req_cnt <= zcp_req_cnt;
842
843always @ (posedge clk)
844if (reset)
845 dmc_zcp_req0 <= 1'b0;
846else if (stage0_en & port_gnt[0])
847 dmc_zcp_req0 <= 1'b1;
848else if (zcp_req_cnt_done)
849 dmc_zcp_req0 <= 1'b0;
850else
851 dmc_zcp_req0 <= dmc_zcp_req0;
852
853always @ (posedge clk)
854if (reset)
855 dmc_zcp_req1 <= 1'b0;
856else if (stage0_en & port_gnt[1])
857 dmc_zcp_req1 <= 1'b1;
858else if (zcp_req_cnt_done)
859 dmc_zcp_req1 <= 1'b0;
860else
861 dmc_zcp_req1 <= dmc_zcp_req1;
862
863always @ (posedge clk)
864if (reset)
865 dmc_zcp_req2 <= 1'b0;
866else if (stage0_en & port_gnt[2])
867 dmc_zcp_req2 <= 1'b1;
868else if (zcp_req_cnt_done)
869 dmc_zcp_req2 <= 1'b0;
870else
871 dmc_zcp_req2 <= dmc_zcp_req2;
872
873always @ (posedge clk)
874if (reset)
875 dmc_zcp_req3 <= 1'b0;
876else if (stage0_en & port_gnt[3])
877 dmc_zcp_req3 <= 1'b1;
878else if (zcp_req_cnt_done)
879 dmc_zcp_req3 <= 1'b0;
880else
881 dmc_zcp_req3 <= dmc_zcp_req3;
882
883assign zcp_data_ack = zcp_data_ack0 | zcp_data_ack1 | zcp_data_ack2 | zcp_data_ack3;
884assign muxed_zcp_data = {128{port_gnt_r[0]}} & zcp_data0[127:0] |
885 {128{port_gnt_r[1]}} & zcp_data1[127:0] |
886 {128{port_gnt_r[2]}} & zcp_data2[127:0] |
887 {128{port_gnt_r[3]}} & zcp_data3[127:0] ;
888
889assign muxed_zcp_data_eop = port_gnt_r[0] & zcp_data_ack0 & zcp_data0[129] |
890 port_gnt_r[1] & zcp_data_ack1 & zcp_data1[129] |
891 port_gnt_r[2] & zcp_data_ack2 & zcp_data2[129] |
892 port_gnt_r[3] & zcp_data_ack3 & zcp_data3[129] ;
893
894
895always @ (posedge clk)
896if (reset)
897 zcp_ack_cnt <= 2'b0;
898else if (zcp_data_ack)
899 zcp_ack_cnt <= zcp_ack_cnt + 2'd1;
900else
901 zcp_ack_cnt <= 2'b0;
902
903always @ (posedge clk)
904if (reset)
905 zcp_data_reg0 <= 128'b0;
906else if (zcp_data_ack & (zcp_ack_cnt == 2'b00))
907 zcp_data_reg0 <= muxed_zcp_data;
908else
909 zcp_data_reg0 <= zcp_data_reg0;
910
911always @ (posedge clk)
912if (reset)
913 zcp_data_reg1 <= 32'b0;
914else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
915 zcp_data_reg1 <= muxed_zcp_data[127:96];
916else
917 zcp_data_reg1 <= zcp_data_reg1;
918
919
920`ifdef NEPTUNE
921always @ (posedge clk)
922if (reset)
923 zcp_data_reg1_lo <= 22'b0;
924else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
925 zcp_data_reg1_lo <= muxed_zcp_data[23:2];
926else
927 zcp_data_reg1_lo <= zcp_data_reg1_lo;
928
929
930always @ (posedge clk)
931if (reset)
932 zcp_data_reg2 <= 128'b0;
933else if (zcp_data_ack & (zcp_ack_cnt == 2'b10))
934 zcp_data_reg2 <= muxed_zcp_data[127:0];
935else
936 zcp_data_reg2 <= zcp_data_reg2;
937
938always @ (posedge clk)
939if (reset)
940 zcp_data_reg3 <= 128'b0;
941else if (zcp_data_ack & (zcp_ack_cnt == 2'b11))
942 zcp_data_reg3 <= muxed_zcp_data[127:0];
943else
944 zcp_data_reg3 <= zcp_data_reg3;
945
946`else
947
948assign zcp_data_reg2 = 128'b0;
949assign zcp_data_reg3 = 128'b0;
950assign zcp_data_reg1_lo = 22'b0;
951
952`endif
953
954/*********************************/
955//one stage pipeline zcp read data
956/*********************************/
957always @ (posedge clk)
958if (reset)
959begin
960 rdmc_wr_req_accept_hdr_r <= 1'b0;
961 rdmc_wr_req_accept_hdr_r1 <= 1'b0;
962end
963else
964begin
965 rdmc_wr_req_accept_hdr_r <= rdmc_wr_req_accept_hdr;
966 rdmc_wr_req_accept_hdr_r1 <= rdmc_wr_req_accept_hdr_r;
967end
968
969always @ (posedge clk)
970if (reset)
971 zcp_data_reg0_r <= 128'b0;
972else if (rdmc_wr_req_accept_hdr_r1)
973 zcp_data_reg0_r <= zcp_data_reg0;
974else
975 zcp_data_reg0_r <= zcp_data_reg0_r;
976
977always @ (posedge clk)
978if (reset)
979 zcp_data_reg1_r <= 16'b0;
980else if (rdmc_wr_req_accept_hdr_r1)
981 zcp_data_reg1_r <= zcp_data_reg1[31:16];
982else
983 zcp_data_reg1_r <= zcp_data_reg1_r;
984
985
986wire[7:0] zcp_data_reg0_byte0 = zcp_data_reg0_r[127:120];
987wire[7:0] zcp_data_reg0_byte1 = zcp_data_reg0_r[119:112];
988wire[7:0] zcp_data_reg0_byte2 = zcp_data_reg0_r[111:104];
989wire[7:0] zcp_data_reg0_byte3 = zcp_data_reg0_r[103:96];
990wire[7:0] zcp_data_reg0_byte4 = zcp_data_reg0_r[95:88];
991wire[7:0] zcp_data_reg0_byte5 = zcp_data_reg0_r[87:80];
992wire[7:0] zcp_data_reg0_byte6 = zcp_data_reg0_r[79:72];
993wire[7:0] zcp_data_reg0_byte7 = zcp_data_reg0_r[71:64];
994wire[7:0] zcp_data_reg0_byte8 = zcp_data_reg0_r[63:56];
995wire[7:0] zcp_data_reg0_byte9 = zcp_data_reg0_r[55:48];
996wire[7:0] zcp_data_reg0_byte10 = zcp_data_reg0_r[47:40];
997wire[7:0] zcp_data_reg0_byte11 = zcp_data_reg0_r[39:32];
998wire[7:0] zcp_data_reg0_byte12 = zcp_data_reg0_r[31:24];
999wire[7:0] zcp_data_reg0_byte13 = zcp_data_reg0_r[23:16];
1000wire[7:0] zcp_data_reg0_byte14 = zcp_data_reg0_r[15:8];
1001wire[7:0] zcp_data_reg0_byte15 = zcp_data_reg0_r[7:0];
1002
1003wire[7:0] zcp_data_reg1_byte0 = zcp_data_reg1_r[15:8];
1004wire[7:0] zcp_data_reg1_byte1 = zcp_data_reg1_r[7:0];
1005wire[7:0] zcp_data_reg1_byte2 = zcp_data_reg1[15:8];
1006wire[7:0] zcp_data_reg1_byte3 = zcp_data_reg1[7:0];
1007
1008wire[7:0] zcp_data_reg2_byte0 = zcp_data_reg2[127:120];
1009wire[7:0] zcp_data_reg2_byte1 = zcp_data_reg2[119:112];
1010wire[7:0] zcp_data_reg2_byte2 = zcp_data_reg2[111:104];
1011wire[7:0] zcp_data_reg2_byte3 = zcp_data_reg2[103:96];
1012wire[7:0] zcp_data_reg2_byte4 = zcp_data_reg2[95:88];
1013wire[7:0] zcp_data_reg2_byte5 = zcp_data_reg2[87:80];
1014wire[7:0] zcp_data_reg2_byte6 = zcp_data_reg2[79:72];
1015wire[7:0] zcp_data_reg2_byte7 = zcp_data_reg2[71:64];
1016wire[7:0] zcp_data_reg2_byte8 = zcp_data_reg2[63:56];
1017wire[7:0] zcp_data_reg2_byte9 = zcp_data_reg2[55:48];
1018wire[7:0] zcp_data_reg2_byte10 = zcp_data_reg2[47:40];
1019wire[7:0] zcp_data_reg2_byte11 = zcp_data_reg2[39:32];
1020wire[7:0] zcp_data_reg2_byte12 = zcp_data_reg2[31:24];
1021wire[7:0] zcp_data_reg2_byte13 = zcp_data_reg2[23:16];
1022wire[7:0] zcp_data_reg2_byte14 = zcp_data_reg2[15:8];
1023wire[7:0] zcp_data_reg2_byte15 = zcp_data_reg2[7:0];
1024
1025wire[7:0] zcp_data_reg3_byte0 = zcp_data_reg3[127:120];
1026wire[7:0] zcp_data_reg3_byte1 = zcp_data_reg3[119:112];
1027wire[7:0] zcp_data_reg3_byte2 = zcp_data_reg3[111:104];
1028wire[7:0] zcp_data_reg3_byte3 = zcp_data_reg3[103:96];
1029wire[7:0] zcp_data_reg3_byte4 = zcp_data_reg3[95:88];
1030wire[7:0] zcp_data_reg3_byte5 = zcp_data_reg3[87:80];
1031wire[7:0] zcp_data_reg3_byte6 = zcp_data_reg3[79:72];
1032wire[7:0] zcp_data_reg3_byte7 = zcp_data_reg3[71:64];
1033wire[7:0] zcp_data_reg3_byte8 = zcp_data_reg3[63:56];
1034wire[7:0] zcp_data_reg3_byte9 = zcp_data_reg3[55:48];
1035wire[7:0] zcp_data_reg3_byte10 = zcp_data_reg3[47:40];
1036wire[7:0] zcp_data_reg3_byte11 = zcp_data_reg3[39:32];
1037wire[7:0] zcp_data_reg3_byte12 = zcp_data_reg3[31:24];
1038wire[7:0] zcp_data_reg3_byte13 = zcp_data_reg3[23:16];
1039wire[7:0] zcp_data_reg3_byte14 = zcp_data_reg3[15:8];
1040wire[7:0] zcp_data_reg3_byte15 = zcp_data_reg3[7:0];
1041
1042assign zcp_rdc_num = zcp_data_reg1_byte3[4:0];
1043assign zcp_type = zcp_data_reg1_byte3[6:5];
1044assign zcp_pkt_id = zcp_data_reg1_byte2[5:2];
1045
1046assign zcp_vaddr0_tmp = {zcp_data_reg2_byte0[3:0], zcp_data_reg2_byte1, zcp_data_reg2_byte2,
1047 zcp_data_reg2_byte3, zcp_data_reg2_byte4, zcp_data_reg2_byte5};
1048assign zcp_len0 = {zcp_data_reg2_byte6[5:0], zcp_data_reg2_byte7};
1049
1050assign zcp_vaddr1_tmp = {zcp_data_reg2_byte8[3:0], zcp_data_reg2_byte9, zcp_data_reg2_byte10,
1051 zcp_data_reg2_byte11, zcp_data_reg2_byte12, zcp_data_reg2_byte13};
1052assign zcp_len1 = {zcp_data_reg2_byte14[5:0],zcp_data_reg2_byte15};
1053
1054assign zcp_vaddr2_tmp = {zcp_data_reg3_byte0[3:0], zcp_data_reg3_byte1, zcp_data_reg3_byte2,
1055 zcp_data_reg3_byte3, zcp_data_reg3_byte4, zcp_data_reg3_byte5};
1056assign zcp_len2 = {zcp_data_reg3_byte6[5:0], zcp_data_reg3_byte7};
1057
1058assign zcp_vaddr3_tmp = {zcp_data_reg3_byte8[3:0], zcp_data_reg3_byte9, zcp_data_reg3_byte10,
1059 zcp_data_reg3_byte11, zcp_data_reg3_byte12, zcp_data_reg3_byte13};
1060assign zcp_len3 = {zcp_data_reg3_byte14[5:0],zcp_data_reg3_byte15};
1061
1062assign zcp_vaddr0 = {zcp_data_reg1_lo[21:2], zcp_vaddr0_tmp[43:0]};
1063assign zcp_vaddr1 = {zcp_data_reg1_lo[21:2], zcp_vaddr1_tmp[43:0]};
1064assign zcp_vaddr2 = {zcp_data_reg1_lo[21:2], zcp_vaddr2_tmp[43:0]};
1065assign zcp_vaddr3 = {zcp_data_reg1_lo[21:2], zcp_vaddr3_tmp[43:0]};
1066
1067assign zcp_func_num = zcp_data_reg1_lo[1:0];
1068
1069
1070/********************/
1071//IPP Req and Data
1072/********************/
1073
1074/********************/
1075//Drop Packet Logic
1076/********************/
1077assign drop_pkt_len_leftover = |muxed_l2_len_r[3:0];
1078assign drop_pkt_word_cnt_tmp = drop_pkt_len_leftover ? muxed_l2_len_r[13:4] : (muxed_l2_len_r[13:4] - 10'd1);
1079assign drop_pkt_done = drop_pkt_en & (drop_pkt_word_cnt == 10'b0);
1080
1081always @ (posedge clk)
1082if (reset)
1083 drop_pkt_word_cnt <= 10'b0;
1084else if (drop_pkt_en_sm)
1085 drop_pkt_word_cnt <= drop_pkt_word_cnt_tmp;
1086else if (drop_pkt_en & !drop_pkt_done)
1087 drop_pkt_word_cnt <= drop_pkt_word_cnt - 10'd1;
1088else
1089 drop_pkt_word_cnt <= drop_pkt_word_cnt;
1090
1091always @ (posedge clk)
1092if (reset)
1093 drop_pkt_en_dly <= 4'b0;
1094else
1095 drop_pkt_en_dly <= {4{drop_pkt_en}} & drop_pkt_port_gnt;
1096
1097
1098/*********************/
1099/*********************/
1100assign is_zcp_wr_req = is_zcp0_wr_req | is_zcp1_wr_req | is_zcp2_wr_req | is_zcp3_wr_req;
1101
1102assign rdmc_wr_req_accept_zcp = rdmc_wr_req_accept_zcp0 | rdmc_wr_req_accept_zcp1 |
1103 rdmc_wr_req_accept_zcp2 | rdmc_wr_req_accept_zcp3;
1104
1105assign rdmc_wr_req_accept_all = rdmc_wr_req_accept_hdr | rdmc_wr_req_accept_zcp |
1106 rdmc_wr_req_accept_jmb;
1107
1108assign rdmc_wr_req_accept_data = rdmc_wr_req_accept_zcp | rdmc_wr_req_accept_jmb;
1109
1110
1111assign zcp_data_len = is_zcp0_wr_req ? zcp_len0 :
1112 is_zcp1_wr_req ? zcp_len1 :
1113 is_zcp2_wr_req ? zcp_len2 :
1114 zcp_len3 ;
1115
1116assign zcp_has_ipp_data_req = (|zcp_data_len[13:4]) | (zcp_data_len[3:0] > next_data_offset_reg[3:0]);
1117assign new_zcp_data_len_tmp = zcp_data_len - {10'b0, next_data_offset_reg};
1118assign new_zcp_data_len = zcp_has_ipp_data_req ? new_zcp_data_len_tmp : 14'b0;
1119
1120assign ipp_pkt_len = is_zcp_wr_req ? new_zcp_data_len_r : muxed_pkt_len_r;
1121
1122assign ipp_pkt_len_left_over = |ipp_pkt_len[3:0];
1123
1124assign ipp_pkt_len_word_cnt_tmp = ipp_pkt_len_left_over ? ({1'b0, ipp_pkt_len[13:4]} + 11'd1) : {1'b0, ipp_pkt_len[13:4]};
1125assign rdmc_wr_data_req_p = full_hdr_r1 & is_first_accept & rdmc_wr_data_req & !rdmc_wr_data_req_dly;
1126assign rdmc_wr_data_req_mod = rdmc_wr_data_req & !rdmc_wr_data_req_p;
1127assign ipp_data_req_en = rdmc_wr_data_req_mod & (|ipp_pkt_len_word_cnt);
1128
1129always @ (posedge clk)
1130if (reset)
1131 rdmc_wr_data_req_dly <= 1'b0;
1132else
1133 rdmc_wr_data_req_dly <= rdmc_wr_data_req;
1134
1135always @ (posedge clk)
1136if (reset)
1137 new_zcp_data_len_r <= 14'b0;
1138else
1139 new_zcp_data_len_r <= new_zcp_data_len;
1140
1141
1142always @ (posedge clk)
1143if (reset)
1144 ipp_pkt_len_word_cnt <= 11'b0;
1145else if (rdmc_wr_req_accept_zcp | rdmc_wr_req_accept_hdr)
1146 ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt_tmp;
1147else if (ipp_data_req_en)
1148 ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt - 11'd1;
1149else
1150 ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt;
1151
1152
1153wire ipp_data_req_en1 = ipp_data_req_en | drop_pad_data;
1154
1155always @ (posedge clk)
1156if (reset)
1157begin
1158 ipp_dat_req0_data <= 1'b0;
1159 ipp_dat_req1_data <= 1'b0;
1160 ipp_dat_req2_data <= 1'b0;
1161 ipp_dat_req3_data <= 1'b0;
1162end
1163else
1164begin
1165 ipp_dat_req0_data <= ipp_data_req_en1 & port_gnt_r1[0] | drop_pkt_en & drop_pkt_port_gnt[0];
1166 ipp_dat_req1_data <= ipp_data_req_en1 & port_gnt_r1[1] | drop_pkt_en & drop_pkt_port_gnt[1];
1167 ipp_dat_req2_data <= ipp_data_req_en1 & port_gnt_r1[2] | drop_pkt_en & drop_pkt_port_gnt[2];
1168 ipp_dat_req3_data <= ipp_data_req_en1 & port_gnt_r1[3] | drop_pkt_en & drop_pkt_port_gnt[3];
1169end
1170
1171always @ (posedge clk)
1172if (reset)
1173begin
1174 dmc_ipp_dat_req0 <= 1'b0;
1175 dmc_ipp_dat_req1 <= 1'b0;
1176 dmc_ipp_dat_req2 <= 1'b0;
1177 dmc_ipp_dat_req3 <= 1'b0;
1178 rdmc_wr_data_req <= 1'b0;
1179end
1180else
1181begin
1182 dmc_ipp_dat_req0 <= stage0_en & port_gnt[0] | ipp_data_req_en1 & port_gnt_r1[0] | drop_pkt_en & drop_pkt_port_gnt[0];
1183 dmc_ipp_dat_req1 <= stage0_en & port_gnt[1] | ipp_data_req_en1 & port_gnt_r1[1] | drop_pkt_en & drop_pkt_port_gnt[1];
1184 dmc_ipp_dat_req2 <= stage0_en & port_gnt[2] | ipp_data_req_en1 & port_gnt_r1[2] | drop_pkt_en & drop_pkt_port_gnt[2];
1185 dmc_ipp_dat_req3 <= stage0_en & port_gnt[3] | ipp_data_req_en1 & port_gnt_r1[3] | drop_pkt_en & drop_pkt_port_gnt[3];
1186 rdmc_wr_data_req <= meta0_rdmc_wr_data_req;
1187end
1188
1189always @ (posedge clk)
1190if (reset)
1191 stage0_en_r <= 1'b0;
1192else
1193 stage0_en_r <= stage0_en;
1194
1195always @ (posedge clk)
1196if (reset)
1197 drop_pad_data_r <= 1'b0;
1198else
1199 drop_pad_data_r <= drop_pad_data;
1200
1201assign ipp_data_req_maskout = {4{stage0_en_r}} & port_gnt | drop_pkt_en_dly | {4{drop_pad_data_r}} & port_gnt_r1;
1202
1203always @ (posedge clk)
1204if (reset)
1205begin
1206 ipp_data_req0_dly <= 1'b0;
1207 ipp_data_req1_dly <= 1'b0;
1208 ipp_data_req2_dly <= 1'b0;
1209 ipp_data_req3_dly <= 1'b0;
1210end
1211else
1212begin
1213 ipp_data_req0_dly <= dmc_ipp_dat_req0 & !ipp_data_req_maskout[0];
1214 ipp_data_req1_dly <= dmc_ipp_dat_req1 & !ipp_data_req_maskout[1];
1215 ipp_data_req2_dly <= dmc_ipp_dat_req2 & !ipp_data_req_maskout[2];
1216 ipp_data_req3_dly <= dmc_ipp_dat_req3 & !ipp_data_req_maskout[3];
1217end
1218
1219assign ipp_data_req0_p = dmc_ipp_dat_req0 & !ipp_data_req0_dly & !ipp_data_req_maskout[0];
1220assign ipp_data_req1_p = dmc_ipp_dat_req1 & !ipp_data_req1_dly & !ipp_data_req_maskout[1];
1221assign ipp_data_req2_p = dmc_ipp_dat_req2 & !ipp_data_req2_dly & !ipp_data_req_maskout[2];
1222assign ipp_data_req3_p = dmc_ipp_dat_req3 & !ipp_data_req3_dly & !ipp_data_req_maskout[3];
1223
1224assign ipp_data_req_p = ipp_data_req0_p | ipp_data_req1_p | ipp_data_req2_p | ipp_data_req3_p;
1225assign ipp_data_req_dly = ipp_data_req0_dly | ipp_data_req1_dly | ipp_data_req2_dly | ipp_data_req3_dly;
1226
1227
1228assign muxed_ipp_data = {128{port_gnt_r2[0] & ipp_data_ack0}} & ipp_data0[127:0] |
1229 {128{port_gnt_r2[1] & ipp_data_ack1}} & ipp_data1[127:0] |
1230 {128{port_gnt_r2[2] & ipp_data_ack2}} & ipp_data2[127:0] |
1231 {128{port_gnt_r2[3] & ipp_data_ack3}} & ipp_data3[127:0] ;
1232
1233assign muxed_ipp_data_eop = port_gnt_r2[0] & ipp_data_ack0 & ipp_data0[129] |
1234 port_gnt_r2[1] & ipp_data_ack1 & ipp_data1[129] |
1235 port_gnt_r2[2] & ipp_data_ack2 & ipp_data2[129] |
1236 port_gnt_r2[3] & ipp_data_ack3 & ipp_data3[129];
1237
1238assign muxed_ipp_data_ack = port_gnt_r2[0] & ipp_data_ack0 |
1239 port_gnt_r2[1] & ipp_data_ack1 |
1240 port_gnt_r2[2] & ipp_data_ack2 |
1241 port_gnt_r2[3] & ipp_data_ack3;
1242
1243assign ipp_data_req_in = dmc_ipp_dat_req0 & !ipp_data_req_maskout[0] |
1244 dmc_ipp_dat_req1 & !ipp_data_req_maskout[1] |
1245 dmc_ipp_dat_req2 & !ipp_data_req_maskout[2] |
1246 dmc_ipp_dat_req3 & !ipp_data_req_maskout[3];
1247
1248assign ipp_fzcp_eop_in = !(|ipp_pkt_len_word_cnt) & ipp_data_req_in;
1249
1250assign ipp_next_eop = !(|ipp_pkt_len[13:0]); //at accept cycle
1251
1252always @ (posedge clk)
1253if (reset)
1254begin
1255 ipp_data_req_dly1 <= 1'b0;
1256 ipp_data_req_dly2 <= 1'b0;
1257end
1258else
1259begin
1260 ipp_data_req_dly1 <= ipp_data_req_dly;
1261 ipp_data_req_dly2 <= ipp_data_req_dly1;
1262end
1263
1264always @ (posedge clk)
1265if (reset)
1266begin
1267 ipp_fzcp_eop_tmp <= 1'b0;
1268 ipp_fzcp_eop_tmp1 <= 1'b0;
1269 ipp_fzcp_eop_tmp2 <= 1'b0;
1270 ipp_fzcp_eop <= 1'b0;
1271end
1272else
1273begin
1274 ipp_fzcp_eop_tmp <= ipp_fzcp_eop_in;
1275 ipp_fzcp_eop_tmp1 <= ipp_fzcp_eop_tmp;
1276 ipp_fzcp_eop_tmp2 <= ipp_fzcp_eop_tmp1;
1277 ipp_fzcp_eop <= ipp_fzcp_eop_tmp2;
1278end
1279
1280/**************************************************************/
1281//rdmc req counter in 16byte, this is used to generate pkt done
1282/**************************************************************/
1283assign pkt_len_left_over = |pkt_trans_len_r[3:0];
1284assign pkt_len_word_cnt_tmp = pkt_len_left_over ? pkt_trans_len_r[13:4] : (pkt_trans_len_r[13:4] - 10'd1);
1285assign pkt_req_cnt_done_tmp = (data_req_cnt == pkt_len_word_cnt) & rdmc_wr_data_req;
1286
1287assign pkt_req_cnt_e_done_mod = pkt_req_cnt_e_done_r & jmb_wr_cycle_sm;
1288
1289always @ (posedge clk)
1290if (reset)
1291 pkt_len_word_cnt <= 10'd0;
1292else if (rdmc_wr_req_accept_all)
1293 pkt_len_word_cnt <= pkt_len_word_cnt_tmp;
1294else
1295 pkt_len_word_cnt <= pkt_len_word_cnt;
1296
1297always @ (posedge clk)
1298if (reset)
1299 data_req_cnt <= 10'd0;
1300else if (pkt_req_cnt_done_tmp)
1301 data_req_cnt <= 10'd0;
1302else if (rdmc_wr_data_req)
1303 data_req_cnt <= data_req_cnt + 10'd1;
1304else
1305 data_req_cnt <= data_req_cnt;
1306
1307always @ (posedge clk)
1308if (reset)
1309begin
1310 pkt_req_cnt_pre_done <= 1'b0;
1311 pkt_req_cnt_done <= 1'b0;
1312 pkt_req_cnt_done_r <= 1'b0;
1313 pkt_req_cnt_done_r1 <= 1'b0;
1314 pkt_req_cnt_done_r2 <= 1'b0;
1315 pkt_req_cnt_e_done_r <= 1'b0;
1316end
1317else
1318begin
1319 pkt_req_cnt_pre_done <= pkt_req_cnt_done_tmp;
1320 pkt_req_cnt_done <= pkt_req_cnt_pre_done;
1321 pkt_req_cnt_done_r <= pkt_req_cnt_done;
1322 pkt_req_cnt_done_r1 <= pkt_req_cnt_done_r;
1323 pkt_req_cnt_done_r2 <= pkt_req_cnt_done_r1;
1324 pkt_req_cnt_e_done_r <= pkt_req_cnt_done_tmp; //same as pkt_req_cnt_pre_done after added 2 cycles delay of ipp ack
1325end
1326
1327always @ (posedge clk)
1328if (reset)
1329 wr_len_last_bits <= 4'b0;
1330else if (rdmc_wr_req_accept_all)
1331 wr_len_last_bits <= pkt_trans_len_r[3:0];
1332else
1333 wr_len_last_bits <= wr_len_last_bits;
1334
1335always @ (posedge clk)
1336if (reset)
1337 wr_len_last_bits_r <= 4'b0;
1338else if (ipp_data_req_p_r2)
1339 wr_len_last_bits_r <= wr_len_last_bits[3:0];
1340else if (rdmc_wr_req_accept_data)
1341 wr_len_last_bits_r <= pkt_trans_len_r[3:0]; //for jumbo pkt and zcp pkt
1342else
1343 wr_len_last_bits_r <= wr_len_last_bits_r;
1344
1345
1346always @ (wr_len_last_bits_r)
1347case (wr_len_last_bits_r) //synopsys parallel_case full_case
1348
13494'd0: wr_data_byte_dec = 16'b1111_1111_1111_1111;
13504'd1: wr_data_byte_dec = 16'b0000_0000_0000_0001;
13514'd2: wr_data_byte_dec = 16'b0000_0000_0000_0011;
13524'd3: wr_data_byte_dec = 16'b0000_0000_0000_0111;
13534'd4: wr_data_byte_dec = 16'b0000_0000_0000_1111;
13544'd5: wr_data_byte_dec = 16'b0000_0000_0001_1111;
13554'd6: wr_data_byte_dec = 16'b0000_0000_0011_1111;
13564'd7: wr_data_byte_dec = 16'b0000_0000_0111_1111;
13574'd8: wr_data_byte_dec = 16'b0000_0000_1111_1111;
13584'd9: wr_data_byte_dec = 16'b0000_0001_1111_1111;
13594'd10: wr_data_byte_dec = 16'b0000_0011_1111_1111;
13604'd11: wr_data_byte_dec = 16'b0000_0111_1111_1111;
13614'd12: wr_data_byte_dec = 16'b0000_1111_1111_1111;
13624'd13: wr_data_byte_dec = 16'b0001_1111_1111_1111;
13634'd14: wr_data_byte_dec = 16'b0011_1111_1111_1111;
13644'd15: wr_data_byte_dec = 16'b0111_1111_1111_1111;
1365default:wr_data_byte_dec = 16'b0;
1366
1367endcase
1368
1369assign wr_data_byte_en = rdmc_wr_data_comp_sm ? wr_data_byte_dec : 16'hffff;
1370
1371/************************************/
1372//Packet Alignement
1373/************************************/
1374assign next_data_offset_tmp1 = (~ipp_pkt_len[3:0]) + 4'd1;
1375assign next_data_offset_tmp2 = next_data_offset_reg - ipp_pkt_len[3:0];
1376assign next_data_offset_tmp = zcp_has_ipp_data_req ? next_data_offset_tmp1 : next_data_offset_tmp2;
1377
1378always @ (posedge clk)
1379if (reset)
1380 next_data_offset_reg <= 4'b0;
1381else if (rdmc_wr_req_accept_all)
1382 next_data_offset_reg <= next_data_offset_tmp;
1383else
1384 next_data_offset_reg <= next_data_offset_reg;
1385
1386always @ (posedge clk)
1387if (reset)
1388 data_offset_reg <= 4'd0;
1389else if (offset_reg_en & (offset_sel == 2'b00))
1390 data_offset_reg <= 4'd2;
1391else if (offset_reg_en)
1392 data_offset_reg <= next_data_offset_reg;
1393else
1394 data_offset_reg <= data_offset_reg;
1395
1396
1397always @ (data_offset_reg or data_save_reg)
1398case (data_offset_reg) //synopsys parallel_case full_case
1399
14004'd0: save_reg_trans = data_save_reg[127:0];
14014'd1: save_reg_trans = {data_save_reg[7:0], 120'b0};
14024'd2: save_reg_trans = {data_save_reg[15:0], 112'b0};
14034'd3: save_reg_trans = {data_save_reg[23:0], 104'b0};
14044'd4: save_reg_trans = {data_save_reg[31:0], 96'b0};
14054'd5: save_reg_trans = {data_save_reg[39:0], 88'b0};
14064'd6: save_reg_trans = {data_save_reg[47:0], 80'b0};
14074'd7: save_reg_trans = {data_save_reg[55:0], 72'b0};
14084'd8: save_reg_trans = {data_save_reg[63:0], 64'b0};
14094'd9: save_reg_trans = {data_save_reg[71:0], 56'b0};
14104'd10: save_reg_trans = {data_save_reg[79:0], 48'b0};
14114'd11: save_reg_trans = {data_save_reg[87:0], 40'b0};
14124'd12: save_reg_trans = {data_save_reg[95:0], 32'b0};
14134'd13: save_reg_trans = {data_save_reg[103:0], 24'b0};
14144'd14: save_reg_trans = {data_save_reg[111:0], 16'b0};
14154'd15: save_reg_trans = {data_save_reg[119:0], 8'b0};
1416
1417endcase
1418
1419always @ (posedge clk)
1420if (reset)
1421 date_save_reg_trans <= 128'b0;
1422else
1423 date_save_reg_trans <= save_reg_trans;
1424
1425wire[119:0] data_last_save = muxed_ipp_data_ack ? muxed_ipp_data[127:8] : date_save_reg_trans[127:8];
1426wire[3:0] data_offset_in = offset_reg_en ? next_data_offset_reg[3:0] : data_offset_reg[3:0];
1427
1428always @ (data_offset_in[3:0] or data_last_save)
1429case (data_offset_in[3:0]) //synopsys parallel_case full_case
1430
14314'd0: data_save_reg_tmp = 128'b0;
14324'd1: data_save_reg_tmp = {120'b0, data_last_save[119:112]};
14334'd2: data_save_reg_tmp = {112'b0, data_last_save[119:104]};
14344'd3: data_save_reg_tmp = {104'b0, data_last_save[119:96]};
14354'd4: data_save_reg_tmp = {96'b0, data_last_save[119:88]};
14364'd5: data_save_reg_tmp = {88'b0, data_last_save[119:80]};
14374'd6: data_save_reg_tmp = {80'b0, data_last_save[119:72]};
14384'd7: data_save_reg_tmp = {72'b0, data_last_save[119:64]};
14394'd8: data_save_reg_tmp = {64'b0, data_last_save[119:56]};
14404'd9: data_save_reg_tmp = {56'b0, data_last_save[119:48]};
14414'd10: data_save_reg_tmp = {48'b0, data_last_save[119:40]};
14424'd11: data_save_reg_tmp = {40'b0, data_last_save[119:32]};
14434'd12: data_save_reg_tmp = {32'b0, data_last_save[119:24]};
14444'd13: data_save_reg_tmp = {24'b0, data_last_save[119:16]};
14454'd14: data_save_reg_tmp = {16'b0, data_last_save[119:8]};
14464'd15: data_save_reg_tmp = {8'b0, data_last_save[119:0]};
1447endcase
1448
1449
1450always @ (posedge clk)
1451if (reset)
1452 data_save_reg <= 128'b0;
1453else if (rdmc_wr_data_valid_sm)
1454 data_save_reg <= data_save_reg_tmp;
1455else
1456 data_save_reg <= data_save_reg;
1457
1458
1459always @ (data_offset_reg or muxed_ipp_data or data_save_reg)
1460case (data_offset_reg) //synopsys parallel_case full_case
1461
14624'd0: rdmc_wr_data_tmp = {muxed_ipp_data[127:0]};
14634'd1: rdmc_wr_data_tmp = {muxed_ipp_data[119:0], data_save_reg[7:0]};
14644'd2: rdmc_wr_data_tmp = {muxed_ipp_data[111:0], data_save_reg[15:0]};
14654'd3: rdmc_wr_data_tmp = {muxed_ipp_data[103:0], data_save_reg[23:0]};
14664'd4: rdmc_wr_data_tmp = {muxed_ipp_data[95:0], data_save_reg[31:0]};
14674'd5: rdmc_wr_data_tmp = {muxed_ipp_data[87:0], data_save_reg[39:0]};
14684'd6: rdmc_wr_data_tmp = {muxed_ipp_data[79:0], data_save_reg[47:0]};
14694'd7: rdmc_wr_data_tmp = {muxed_ipp_data[71:0], data_save_reg[55:0]};
14704'd8: rdmc_wr_data_tmp = {muxed_ipp_data[63:0], data_save_reg[63:0]};
14714'd9: rdmc_wr_data_tmp = {muxed_ipp_data[55:0], data_save_reg[71:0]};
14724'd10: rdmc_wr_data_tmp = {muxed_ipp_data[47:0], data_save_reg[79:0]};
14734'd11: rdmc_wr_data_tmp = {muxed_ipp_data[39:0], data_save_reg[87:0]};
14744'd12: rdmc_wr_data_tmp = {muxed_ipp_data[31:0], data_save_reg[95:0]};
14754'd13: rdmc_wr_data_tmp = {muxed_ipp_data[23:0], data_save_reg[103:0]};
14764'd14: rdmc_wr_data_tmp = {muxed_ipp_data[15:0], data_save_reg[111:0]};
14774'd15: rdmc_wr_data_tmp = {muxed_ipp_data[7:0], data_save_reg[119:0]};
1478
1479endcase
1480
1481
1482wire[127:0] hdr_data1 = {muxed_ipp_data[111:0], zcp_data_reg0_byte1, zcp_data_reg0_byte0};
1483wire[127:0] hdr_data2 = {zcp_data_reg1_byte1, zcp_data_reg1_byte0, zcp_data_reg0_byte15, zcp_data_reg0_byte14,
1484 zcp_data_reg0_byte13, zcp_data_reg0_byte12, zcp_data_reg0_byte11, zcp_data_reg0_byte10,
1485 zcp_data_reg0_byte9, zcp_data_reg0_byte8, zcp_data_reg0_byte7, zcp_data_reg0_byte6,
1486 zcp_data_reg0_byte5, zcp_data_reg0_byte4, zcp_data_reg0_byte3, zcp_data_reg0_byte2};
1487
1488wire[127:0] rdmc_wr_data_in = (rdmc_wr_data_sel == 2'b00) ? hdr_data2 :
1489 (rdmc_wr_data_sel == 2'b01) ? hdr_data1 : rdmc_wr_data_tmp;
1490
1491
1492/****************************/
1493//ECC ERROR
1494/****************************/
1495wire[3:0] ipp_data_err = {ipp_data_err3, ipp_data_err2, ipp_data_err1, ipp_data_err0};
1496wire[3:0] zcp_data_err = {zcp_data_err3, zcp_data_err2, zcp_data_err1, zcp_data_err0};
1497
1498wire[3:0] ipp_ack_array= {ipp_data_ack3, ipp_data_ack2, ipp_data_ack1, ipp_data_ack0};
1499wire[3:0] zcp_ack_array= {zcp_data_ack3, zcp_data_ack2, zcp_data_ack1, zcp_data_ack0};
1500
1501wire muxed_ipp_ctrl_err = |(port_gnt & ipp_ack_array & ipp_data_err); //first read
1502wire muxed_zcp_data_err = |(port_gnt_r & zcp_ack_array & zcp_data_err); //control phase
1503assign muxed_ipp_data_err = |(port_gnt_r2 & ipp_ack_array & ipp_data_err); //data phase
1504
1505always @ (posedge clk)
1506if (reset)
1507 wait_drop_pkt_eop <= 1'b0;
1508else if (drop_pkt_done)
1509 wait_drop_pkt_eop <= 1'b1;
1510else if (rdmc_cal_eop_r)
1511 wait_drop_pkt_eop <= 1'b0;
1512else
1513 wait_drop_pkt_eop <= wait_drop_pkt_eop;
1514
1515always @ (posedge clk)
1516if (reset)
1517 muxed_data_err <= 1'b0;
1518else if (muxed_ipp_ctrl_err)
1519 muxed_data_err <= 1'b1;
1520else if (rdmc_wr_req_accept_hdr | wait_drop_pkt_eop)
1521 muxed_data_err <= 1'b0;
1522else
1523 muxed_data_err <= muxed_data_err;
1524
1525always @ (posedge clk)
1526if (reset)
1527 muxed_data_err_r1 <= 1'b0;
1528else if (rdmc_wr_req_accept_hdr & muxed_data_err | muxed_zcp_data_err | (|port_zcp_eop_err))
1529 muxed_data_err_r1 <= 1'b1;
1530else if (ipp_data_req_p_r2 | wait_drop_pkt_eop)
1531 muxed_data_err_r1 <= 1'b0;
1532else
1533 muxed_data_err_r1 <= muxed_data_err_r1;
1534
1535
1536always @ (posedge clk)
1537if (reset)
1538 muxed_data_err_r2 <= 1'b0;
1539else if (ipp_data_req_p_r1)
1540 muxed_data_err_r2 <= 1'b0;
1541else if (muxed_ipp_data_err & !wr_idle_state | ipp_data_req_p_r2 & muxed_data_err_r1 | (|port_ipp_eop_err))
1542 muxed_data_err_r2 <= 1'b1;
1543else if (rdmc_wr_last_comp | wait_drop_pkt_eop)
1544 muxed_data_err_r2 <= 1'b0;
1545else
1546 muxed_data_err_r2 <= muxed_data_err_r2;
1547
1548
1549/**********************************************/
1550//calculate eop & sop
1551/**********************************************/
1552wire muxed_ipp_data_req = dmc_ipp_dat_req0 & (port_gnt_r1[0] | drop_pkt_en_dly[0]) |
1553 dmc_ipp_dat_req1 & (port_gnt_r1[1] | drop_pkt_en_dly[1]) |
1554 dmc_ipp_dat_req2 & (port_gnt_r1[2] | drop_pkt_en_dly[2]) |
1555 dmc_ipp_dat_req3 & (port_gnt_r1[3] | drop_pkt_en_dly[3]);
1556wire rdmc_eop_cnt_done = muxed_ipp_data_req & (rdmc_eop_cnt == 10'b0);
1557wire rdmc_eop_for_padding = rdmc_eop_cnt_done;
1558
1559always @ (posedge clk)
1560if (reset)
1561 rdmc_eop_cnt <= 10'b11_1111_1111;
1562else if (rdmc_wr_req_accept_hdr | drop_pkt_en_sm)
1563 rdmc_eop_cnt <= drop_pkt_word_cnt_tmp[9:0];
1564else if (muxed_ipp_data_req & (|rdmc_eop_cnt))
1565 rdmc_eop_cnt <= rdmc_eop_cnt - 10'd1;
1566else if (rdmc_eop_cnt_done)
1567 rdmc_eop_cnt <= 10'b11_1111_1111;
1568else
1569 rdmc_eop_cnt <= rdmc_eop_cnt;
1570
1571always @ (posedge clk)
1572if (reset)
1573begin
1574 rdmc_cal_eop_tmp <= 1'b0;
1575 rdmc_cal_eop_tmp1 <= 1'b0;
1576 rdmc_cal_eop <= 1'b0;
1577 rdmc_cal_eop_r <= 1'b0;
1578end
1579else
1580begin
1581 rdmc_cal_eop_tmp <= rdmc_eop_cnt_done;
1582 rdmc_cal_eop_tmp1 <= rdmc_cal_eop_tmp;
1583 rdmc_cal_eop <= rdmc_cal_eop_tmp1;
1584 rdmc_cal_eop_r <= rdmc_cal_eop;
1585end
1586
1587
1588always @ (posedge clk)
1589if (reset)
1590 muxed_orig_zcopy_mode_r1 <= 1'b0;
1591else if (zcp_req_cnt_done)
1592 muxed_orig_zcopy_mode_r1 <= muxed_orig_zcopy_mode_r;
1593else
1594 muxed_orig_zcopy_mode_r1 <= muxed_orig_zcopy_mode_r1;
1595
1596wire rdmc_cal_zcp_eop = muxed_orig_zcopy_mode_r1 ? zcp_data_ack & (zcp_ack_cnt == 2'b11) :
1597 zcp_data_ack & (zcp_ack_cnt == 2'b01);
1598
1599/*******************/
1600//Port Error
1601/*******************/
1602always @ (posedge clk)
1603if (reset)
1604 zcp_second_data_ack_dly <= 1'b0;
1605else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
1606 zcp_second_data_ack_dly <= 1'b1;
1607else
1608 zcp_second_data_ack_dly <= 1'b0;
1609
1610wire pkt_id_err = !(zcp_pkt_id == muxed_ipp_pkt_id_r) & zcp_second_data_ack_dly;
1611wire ipp_eop_err = !(rdmc_cal_eop_r == muxed_ipp_data_eop);
1612wire zcp_eop_err = !(rdmc_cal_zcp_eop == muxed_zcp_data_eop);
1613
1614assign port_ipp_eop_err = {4{ipp_eop_err}} & port_gnt_r2;
1615assign port_zcp_eop_err = {4{zcp_eop_err}} & port_gnt_r;
1616assign port_err_event = {pkt_id_err, port_zcp_eop_err, port_ipp_eop_err};
1617
1618
1619/**********************/
1620//SOP calculation
1621/**********************/
1622always @ (posedge clk)
1623if (reset)
1624 zcp_sop_reg0 <= 1'b1;
1625else if (stage0_en_r & port_gnt[0])
1626 zcp_sop_reg0 <= 1'b0;
1627else if (rdmc_cal_zcp_eop & port_gnt_r[0])
1628 zcp_sop_reg0 <= 1'b1;
1629else
1630 zcp_sop_reg0 <= zcp_sop_reg0;
1631
1632
1633always @ (posedge clk)
1634if (reset)
1635 zcp_sop_reg1 <= 1'b1;
1636else if (stage0_en_r & port_gnt[1])
1637 zcp_sop_reg1 <= 1'b0;
1638else if (rdmc_cal_zcp_eop & port_gnt_r[1])
1639 zcp_sop_reg1 <= 1'b1;
1640else
1641 zcp_sop_reg1 <= zcp_sop_reg1;
1642
1643always @ (posedge clk)
1644if (reset)
1645 zcp_sop_reg2 <= 1'b1;
1646else if (stage0_en_r & port_gnt[2])
1647 zcp_sop_reg2 <= 1'b0;
1648else if (rdmc_cal_zcp_eop & port_gnt_r[2])
1649 zcp_sop_reg2 <= 1'b1;
1650else
1651 zcp_sop_reg2 <= zcp_sop_reg2;
1652
1653always @ (posedge clk)
1654if (reset)
1655 zcp_sop_reg3 <= 1'b1;
1656else if (stage0_en_r & port_gnt[3])
1657 zcp_sop_reg3 <= 1'b0;
1658else if (rdmc_cal_zcp_eop & port_gnt_r[3])
1659 zcp_sop_reg3 <= 1'b1;
1660else
1661 zcp_sop_reg3 <= zcp_sop_reg3;
1662
1663
1664always @ (posedge clk)
1665if (reset)
1666 ipp_sop_reg0 <= 1'b1;
1667else if (stage0_en_r & port_gnt[0])
1668 ipp_sop_reg0 <= 1'b0;
1669else if (rdmc_cal_eop_r & port_gnt_r2[0])
1670 ipp_sop_reg0 <= 1'b1;
1671else
1672 ipp_sop_reg0 <= ipp_sop_reg0;
1673
1674always @ (posedge clk)
1675if (reset)
1676 ipp_sop_reg1 <= 1'b1;
1677else if (stage0_en_r & port_gnt[1])
1678 ipp_sop_reg1 <= 1'b0;
1679else if (rdmc_cal_eop_r & port_gnt_r2[1])
1680 ipp_sop_reg1 <= 1'b1;
1681else
1682 ipp_sop_reg1 <= ipp_sop_reg1;
1683
1684always @ (posedge clk)
1685if (reset)
1686 ipp_sop_reg2 <= 1'b1;
1687else if (stage0_en_r & port_gnt[2])
1688 ipp_sop_reg2 <= 1'b0;
1689else if (rdmc_cal_eop_r & port_gnt_r2[2])
1690 ipp_sop_reg2 <= 1'b1;
1691else
1692 ipp_sop_reg2 <= ipp_sop_reg2;
1693
1694always @ (posedge clk)
1695if (reset)
1696 ipp_sop_reg3 <= 1'b1;
1697else if (stage0_en_r & port_gnt[3])
1698 ipp_sop_reg3 <= 1'b0;
1699else if (rdmc_cal_eop_r & port_gnt_r2[3])
1700 ipp_sop_reg3 <= 1'b1;
1701else
1702 ipp_sop_reg3 <= ipp_sop_reg3;
1703
1704
1705/****************************/
1706//rdmc-meta0 write interface
1707/****************************/
1708wire[3:0] rdmc_meta0_wr_status = 4'b0;
1709
1710always @ (posedge clk)
1711if (reset)
1712 rdmc_meta0_wr_data <= 128'b0;
1713else
1714 rdmc_meta0_wr_data <= rdmc_wr_data_in;
1715
1716always @ (posedge clk)
1717if (reset)
1718 rdmc_meta0_wr_data_valid <= 1'b0;
1719else
1720 rdmc_meta0_wr_data_valid <= rdmc_wr_data_valid_sm;
1721
1722always @ (posedge clk)
1723if (reset)
1724 rdmc_meta0_wr_transfer_comp <= 1'b0;
1725else
1726 rdmc_meta0_wr_transfer_comp <= rdmc_wr_data_comp_sm;
1727
1728always @ (posedge clk)
1729if (reset)
1730 rdmc_meta0_wr_transfer_comp_int <= 1'b0; //for output timing
1731else
1732 rdmc_meta0_wr_transfer_comp_int <= rdmc_wr_data_comp_sm;
1733
1734
1735always @ (posedge clk)
1736if (reset)
1737 rdmc_meta0_wr_req_byteenable <= 16'b0;
1738else if (rdmc_wr_data_valid_sm)
1739 rdmc_meta0_wr_req_byteenable <= wr_data_byte_en;
1740else
1741 rdmc_meta0_wr_req_byteenable <= 16'b0;
1742
1743always @ (posedge clk)
1744if (reset)
1745 rdmc_wr_last_comp <= 1'b0;
1746else
1747 rdmc_wr_last_comp <= rdmc_wr_last_comp_sm;
1748
1749
1750niu_rdmc_wr_dp_sm niu_rdmc_wr_dp_sm_inst0 (
1751 .clk (clk),
1752 .reset (reset),
1753 .full_hdr_r1 (full_hdr_r1),
1754 .ipp_data_req_dly2 (ipp_data_req_dly2),
1755 .rdmc_wr_req_accept_hdr (rdmc_wr_req_accept_hdr),
1756 .rdmc_wr_req_accept_zcp (rdmc_wr_req_accept_zcp),
1757 .muxed_ipp_data_ack (muxed_ipp_data_ack),
1758 .rdmc_cal_eop_r (rdmc_cal_eop_r),
1759 .ipp_next_eop (ipp_next_eop),
1760 .ipp_fzcp_eop (ipp_fzcp_eop),
1761 .pkt_req_cnt_done (pkt_req_cnt_done),
1762 .pkt_req_cnt_done_r (pkt_req_cnt_done_r),
1763 .pkt_req_cnt_done_r1 (pkt_req_cnt_done_r1),
1764 .pkt_req_cnt_done_r2 (pkt_req_cnt_done_r2),
1765 .jmb_pkt_type (jmb_pkt_type),
1766 .zcopy_mode (zcopy_mode),
1767 .zcp_wr_type (zcp_wr_type),
1768
1769 .offset_reg_en (offset_reg_en),
1770 .offset_sel (offset_sel),
1771 .wr_idle_state (wr_idle_state),
1772 .rdmc_wr_data_sel (rdmc_wr_data_sel),
1773 .rdmc_wr_data_valid_sm (rdmc_wr_data_valid_sm),
1774 .rdmc_wr_data_comp_sm (rdmc_wr_data_comp_sm),
1775 .rdmc_wr_last_comp_sm (rdmc_wr_last_comp_sm),
1776 .jmb_wr_cycle_sm (jmb_wr_cycle_sm),
1777 .wr_dp_sm_state (wr_dp_sm_state)
1778
1779 );
1780
1781endmodule
1782
1783
1784
1785
1786
1787
1788
1789