// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: niu_rdmc_wr_dp.v
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
rdmc_meta0_wr_req_dma_num_int,
rdmc_meta0_wr_data_valid,
rdmc_meta0_wr_req_byteenable,
rdmc_meta0_wr_transfer_comp,
rdmc_meta0_wr_transfer_comp_int,
input[3:0] port_err_status;
input[4:0] muxed_port_rdc_num;
input[13:0] pkt_trans_len_r;
input[1:0] pref_buf_used_num_r;
input[3:0] drop_pkt_port_gnt;
input rdmc_wr_req_accept_hdr;
input rdmc_wr_req_accept_jmb;
input rdmc_wr_req_accept_zcp0;
input rdmc_wr_req_accept_zcp1;
input rdmc_wr_req_accept_zcp2;
input rdmc_wr_req_accept_zcp3;
input[4:0] rdmc_meta0_wr_req_dma_num_int;
input[129:0] ipp_dmc_data0;
input[129:0] ipp_dmc_data1;
input[129:0] ipp_dmc_data2;
input[129:0] ipp_dmc_data3;
input[129:0] zcp_dmc_dat0;
input[129:0] zcp_dmc_dat1;
input[129:0] zcp_dmc_dat2;
input[129:0] zcp_dmc_dat3;
input meta0_rdmc_wr_data_req;
output[4:0] muxed_rdc_num_r;
output[13:0] muxed_pkt_len;
output[13:0] muxed_pkt_len_r;
output[13:0] muxed_l2_len_r;
output rdmc_eop_for_padding;
output pkt_req_cnt_pre_done;
output pkt_req_cnt_done_r;
output pkt_req_cnt_e_done_mod;
output[22:0] pkt_wrbk_data;
output[4:0] rdmc_wr_data_dma_num;
output[3:0] ipp_full_pkt;
output[3:0] zcp_full_pkt;
output muxed_zcopy_mode_r;
output muxed_data_err_r2;
output[1:0] jmb_pkt_type;
output[1:0] zcp_func_num;
output rdmc_meta0_wr_data_valid;
output[127:0] rdmc_meta0_wr_data;
output[15:0] rdmc_meta0_wr_req_byteenable;
output rdmc_meta0_wr_transfer_comp;
output rdmc_meta0_wr_transfer_comp_int;
output[3:0] rdmc_meta0_wr_status;
output[8:0] port_err_event;
output ipp_dat_req0_data;
output ipp_dat_req1_data;
output ipp_dat_req2_data;
output ipp_dat_req3_data;
output[4:0] wr_dp_sm_state;
reg[3:0] muxed_ipp_pkt_id_r;
reg[13:0] muxed_l2_len_r;
reg[13:0] muxed_pkt_len_r;
reg[1:0] muxed_pkt_type_r;
reg muxed_orig_zcopy_mode_r;
reg[4:0] muxed_rdc_num_r;
reg muxed_orig_zcopy_mode_r1;
reg rdmc_wr_data_req_dly;
reg[4:0] rdmc_wr_data_dma_num;
reg[127:0] zcp_data_reg0;
reg[127:0] zcp_data_reg2;
reg[127:0] zcp_data_reg3;
reg[21:0] zcp_data_reg1_lo; //for zcp page handle
wire[127:0] zcp_data_reg2;
wire[127:0] zcp_data_reg3;
wire[21:0] zcp_data_reg1_lo;
reg[9:0] drop_pkt_word_cnt;
reg[3:0] drop_pkt_en_dly;
reg[10:0] ipp_pkt_len_word_cnt;
reg[13:0] new_zcp_data_len_r;
reg[9:0] pkt_len_word_cnt;
reg pkt_req_cnt_pre_done;
reg pkt_req_cnt_e_done_r;
reg[3:0] wr_len_last_bits;
reg[3:0] wr_len_last_bits_r;
reg[15:0] wr_data_byte_dec;
reg[3:0] next_data_offset_reg;
reg[3:0] data_offset_reg;
reg[127:0] save_reg_trans;
reg[127:0] date_save_reg_trans;
reg[127:0] data_save_reg_tmp;
reg[127:0] data_save_reg;
reg[127:0] rdmc_wr_data_tmp;
reg zcp_second_data_ack_dly;
reg[127:0] rdmc_meta0_wr_data;
reg rdmc_meta0_wr_data_valid;
reg rdmc_meta0_wr_transfer_comp;
reg rdmc_meta0_wr_transfer_comp_int;
reg[15:0] rdmc_meta0_wr_req_byteenable;
reg rdmc_wr_req_accept_hdr_r;
reg rdmc_wr_req_accept_hdr_r1;
reg[127:0] zcp_data_reg0_r;
reg[15:0] zcp_data_reg1_r;
wire[1:0] rdmc_wr_data_sel;
wire rdmc_wr_data_valid_sm;
wire rdmc_wr_data_comp_sm;
wire rdmc_wr_last_comp_sm;
wire pkt_req_cnt_e_done_mod;
wire[27:0] ipp_ctrl_word0;
wire[27:0] ipp_ctrl_word1;
wire[27:0] ipp_ctrl_word2;
wire[27:0] ipp_ctrl_word3;
wire[27:0] muxed_ipp_ctrl_w;
wire[24:0] zcp_ctrl_word0;
wire[24:0] zcp_ctrl_word1;
wire[24:0] zcp_ctrl_word2;
wire[24:0] zcp_ctrl_word3;
wire[24:0] muxed_zcp_ctrl_w;
wire[13:0] muxed_pkt_len;
wire[1:0] muxed_pkt_type;
wire[3:0] muxed_ipp_pkt_id;
wire[5:0] muxed_ipp_drop_bits;
wire[7:0] muxed_pkt_hdr_len;
wire muxed_orig_zcopy_mode;
wire[4:0] muxed_tbl_rdc_num;
wire[4:0] muxed_fflp_rdc_num;
wire[127:0] muxed_zcp_data;
wire[43:0] zcp_vaddr0_tmp;
wire[43:0] zcp_vaddr1_tmp;
wire[43:0] zcp_vaddr2_tmp;
wire[43:0] zcp_vaddr3_tmp;
wire rdmc_wr_req_accept_zcp;
wire rdmc_wr_req_accept_all;
wire rdmc_wr_req_accept_data;
wire drop_pkt_len_leftover;
wire[9:0] drop_pkt_word_cnt_tmp;
wire zcp_has_ipp_data_req;
wire[13:0] new_zcp_data_len_tmp;
wire[13:0] new_zcp_data_len;
wire ipp_pkt_len_left_over;
wire[10:0] ipp_pkt_len_word_cnt_tmp;
wire rdmc_wr_data_req_mod;
wire[127:0] muxed_ipp_data;
wire[3:0] ipp_data_req_maskout;
wire[9:0] pkt_len_word_cnt_tmp;
wire pkt_req_cnt_done_tmp;
wire[15:0] wr_data_byte_en;
wire[3:0] next_data_offset_tmp1;
wire[3:0] next_data_offset_tmp2;
wire[3:0] next_data_offset_tmp;
wire[4:0] wr_dp_sm_state;
wire[3:0] port_ipp_eop_err;
wire[3:0] port_zcp_eop_err;
wire[8:0] port_err_event;
ipp_full_pkt0 <= ipp_dmc_ful_pkt0 & !ipp_dmc_dat_err0;
ipp_data_ack0 <= ipp_dmc_dat_ack0;
ipp_data_err0 <= ipp_dmc_dat_err0;
ipp_data0 <= ipp_dmc_data0;
ipp_full_pkt1 <= ipp_dmc_ful_pkt1 & !ipp_dmc_dat_err1;
ipp_data_ack1 <= ipp_dmc_dat_ack1;
ipp_data_err1 <= ipp_dmc_dat_err1;
ipp_data1 <= ipp_dmc_data1;
ipp_full_pkt2 <= ipp_dmc_ful_pkt2 & !ipp_dmc_dat_err2;
ipp_data_ack2 <= ipp_dmc_dat_ack2;
ipp_data_err2 <= ipp_dmc_dat_err2;
ipp_data2 <= ipp_dmc_data2;
ipp_full_pkt3 <= ipp_dmc_ful_pkt3 & !ipp_dmc_dat_err3;
ipp_data_ack3 <= ipp_dmc_dat_ack3;
ipp_data_err3 <= ipp_dmc_dat_err3;
ipp_data3 <= ipp_dmc_data3;
zcp_full_pkt0 <= zcp_dmc_ful_pkt0 & !zcp_dmc_dat_err0;
zcp_data_ack0 <= zcp_dmc_ack0;
zcp_data0 <= zcp_dmc_dat0;
zcp_data_err0 <= zcp_dmc_dat_err0;
zcp_full_pkt1 <= zcp_dmc_ful_pkt1 & !zcp_dmc_dat_err1;
zcp_data_ack1 <= zcp_dmc_ack1;
zcp_data1 <= zcp_dmc_dat1;
zcp_data_err1 <= zcp_dmc_dat_err1;
zcp_full_pkt2 <= zcp_dmc_ful_pkt2 & !zcp_dmc_dat_err2;
zcp_data_ack2 <= zcp_dmc_ack2;
zcp_data2 <= zcp_dmc_dat2;
zcp_data_err2 <= zcp_dmc_dat_err2;
zcp_full_pkt3 <= zcp_dmc_ful_pkt3 & !zcp_dmc_dat_err3;
zcp_data_ack3 <= zcp_dmc_ack3;
zcp_data3 <= zcp_dmc_dat3;
zcp_data_err3 <= zcp_dmc_dat_err3;
assign ipp_ctrl_word0 = {ipp_data0[103], ipp_data0[60:56], ipp_data0[53:48],
ipp_data0[101:88], ipp_data0[102], ipp_data0[17]}; //28bits
assign ipp_ctrl_word1 = {ipp_data1[103], ipp_data1[60:56], ipp_data1[53:48],
ipp_data1[101:88], ipp_data1[102], ipp_data1[17]}; //28bits
assign ipp_ctrl_word2 = {ipp_data2[103], ipp_data2[60:56], ipp_data2[53:48],
ipp_data2[101:88], ipp_data2[102], ipp_data2[17]}; //28bits
assign ipp_ctrl_word3 = {ipp_data3[103], ipp_data3[60:56], ipp_data3[53:48],
ipp_data3[101:88], ipp_data3[102], ipp_data3[17]}; //28bits
assign ipp_ctrl_word0 = {ipp_data0[57:52], ipp_data0[49:44],
ipp_data0[101:88], ipp_data0[102], ipp_data0[17]}; //28bits
assign ipp_ctrl_word1 = {ipp_data1[57:52], ipp_data1[49:44],
ipp_data1[101:88], ipp_data1[102], ipp_data1[17]}; //28bits
assign ipp_ctrl_word2 = {ipp_data2[57:52], ipp_data2[49:44],
ipp_data2[101:88], ipp_data2[102], ipp_data2[17]}; //28bits
assign ipp_ctrl_word3 = {ipp_data3[57:52], ipp_data3[49:44],
ipp_data3[101:88], ipp_data3[102], ipp_data3[17]}; //28bits
assign muxed_ipp_ctrl_w = {28{port_gnt[0]}} & ipp_ctrl_word0 |
{28{port_gnt[1]}} & ipp_ctrl_word1 |
{28{port_gnt[2]}} & ipp_ctrl_word2 |
{28{port_gnt[3]}} & ipp_ctrl_word3;
assign zcp_ctrl_word0 = {zcp_data0[117], zcp_data0[111:104], zcp_data0[95:94], zcp_data0[87],
zcp_data0[79:76], zcp_data0[63:56], zcp_data0[44]}; //25 bits
assign zcp_ctrl_word1 = {zcp_data1[117], zcp_data1[111:104], zcp_data1[95:94], zcp_data1[87],
zcp_data1[79:76], zcp_data1[63:56], zcp_data1[44]};
assign zcp_ctrl_word2 = {zcp_data2[117], zcp_data2[111:104], zcp_data2[95:94], zcp_data2[87],
zcp_data2[79:76], zcp_data2[63:56], zcp_data2[44]};
assign zcp_ctrl_word3 = {zcp_data3[117], zcp_data3[111:104], zcp_data3[95:94], zcp_data3[87],
zcp_data3[79:76], zcp_data3[63:56], zcp_data3[44]};
assign muxed_zcp_ctrl_w = {25{port_gnt[0]}} & zcp_ctrl_word0 |
{25{port_gnt[1]}} & zcp_ctrl_word1 |
{25{port_gnt[2]}} & zcp_ctrl_word2 |
{25{port_gnt[3]}} & zcp_ctrl_word3;
//assign muxed_cksum_err = muxed_ipp_data_c[17];
//assign muxed_pkt_id = muxed_ipp_data_c[53:50];
//assign muxed_pkt_len = muxed_ipp_data_c[101:88];
//assign muxed_bad_crc = muxed_ipp_data_c[102]
//assign muxed_ipp_discard_bits = {muxed_ipp_data_c[103], muxed_ipp_data_c[60:56]};
assign muxed_cksum_err = muxed_ipp_ctrl_w[0];
assign muxed_bad_crc = muxed_ipp_ctrl_w[1];
assign muxed_pkt_len = muxed_zcopy_mode ? {6'b0, muxed_pkt_hdr_len} : muxed_ipp_ctrl_w[15:2];
assign muxed_l2_len = muxed_ipp_ctrl_w[15:2];
assign muxed_pkt_type = muxed_ipp_ctrl_w[17:16];
assign muxed_ipp_pkt_id = muxed_ipp_ctrl_w[21:18];
assign muxed_ipp_drop_bits = muxed_ipp_ctrl_w[27:22];
assign muxed_ipp_drop_pkt = |muxed_ipp_drop_bits;
assign muxed_zcp_err = !muxed_orig_zcopy_mode & muxed_zcp_ctrl_w[0];
assign muxed_pkt_hdr_len = muxed_zcp_ctrl_w[8:1];
assign muxed_s_event = muxed_zcp_ctrl_w[9];
assign muxed_zcp_drop_pkt = muxed_zcp_ctrl_w[10];
assign muxed_fflp_hw_err = muxed_zcp_ctrl_w[11];
assign muxed_mac_promis = muxed_zcp_ctrl_w[12];
assign muxed_orig_zcopy_mode = muxed_zcp_ctrl_w[13];
assign muxed_zcopy_mode = muxed_orig_zcopy_mode & !(muxed_bad_crc | muxed_cksum_err);
assign muxed_tbl_rdc_num = muxed_zcp_ctrl_w[18:14];
assign muxed_fflp_rdc_num = muxed_zcp_ctrl_w[23:19];
assign muxed_noport = muxed_zcp_ctrl_w[24];
assign ipp_full_pkt = {ipp_full_pkt3, ipp_full_pkt2, ipp_full_pkt1, ipp_full_pkt0} & (~port_err_status);
assign zcp_full_pkt = {zcp_full_pkt3, zcp_full_pkt2, zcp_full_pkt1, zcp_full_pkt0} & (~port_err_status);
assign ipp_pkt_sop = {ipp_sop_reg3, ipp_sop_reg2, ipp_sop_reg1, ipp_sop_reg0};
assign zcp_pkt_sop = {zcp_sop_reg3, zcp_sop_reg2, zcp_sop_reg1, zcp_sop_reg0};
assign is_l2_err = muxed_mac_promis | muxed_bad_crc | muxed_ipp_drop_pkt | muxed_zcp_drop_pkt;
assign muxed_rdc_num = is_l2_err ? muxed_port_rdc_num :
muxed_cksum_err ? muxed_tbl_rdc_num :
muxed_cksum_err_r <= 1'b0;
muxed_ipp_pkt_id_r <= 4'b0;
muxed_pkt_len_r <= 14'b0;
muxed_drop_pkt_r <= 1'b0;
muxed_mac_promis_r <= 1'b0;
muxed_fflp_hw_err_r <= 1'b0;
muxed_zcopy_mode_r <= 1'b0;
muxed_orig_zcopy_mode_r <= 1'b0;
muxed_pkt_type_r <= 2'b0;
muxed_cksum_err_r <= muxed_cksum_err;
muxed_bad_crc_r <= muxed_bad_crc;
muxed_ipp_pkt_id_r <= muxed_ipp_pkt_id;
muxed_pkt_len_r <= muxed_pkt_len;
muxed_l2_len_r <= muxed_l2_len;
muxed_drop_pkt_r <= muxed_ipp_drop_pkt | muxed_zcp_drop_pkt;
muxed_mac_promis_r <= muxed_mac_promis;
muxed_s_event_r <= muxed_s_event;
muxed_fflp_hw_err_r <= muxed_fflp_hw_err;
muxed_zcopy_mode_r <= muxed_zcopy_mode;
muxed_orig_zcopy_mode_r <= muxed_orig_zcopy_mode;
muxed_rdc_num_r <= muxed_rdc_num;
muxed_pkt_type_r <= muxed_pkt_type;
muxed_noport_r <= muxed_noport;
muxed_zcp_err_r <= muxed_zcp_err;
wire[2:0] err_inc = muxed_bad_crc_r ? 3'b001 :
muxed_cksum_err_r ? 3'b011 :
muxed_fflp_hw_err_r ? 3'b100 :
muxed_zcp_err_r ? 3'b101 : 3'b000;
wire[22:0] pkt_wrbk_data = {muxed_pkt_type_r, muxed_zcopy_mode_r, muxed_noport_r,
muxed_mac_promis_r, err_inc, 1'b0, muxed_l2_len_r}; //23bits
/*************************/
/*************************/
else if (rdmc_wr_req_accept_hdr)
port_gnt_r1 <= port_gnt_r;
port_gnt_r1 <= port_gnt_r1;
else if (rdmc_wr_req_accept_hdr)
is_first_accept <= is_first_accept;
ipp_data_req_p_r <= 1'b0;
ipp_data_req_p_r1 <= 1'b0;
ipp_data_req_p_r2 <= 1'b0;
ipp_data_req_p_r <= ipp_data_req_p & is_first_accept;
ipp_data_req_p_r1 <= ipp_data_req_p_r;
ipp_data_req_p_r2 <= ipp_data_req_p_r1;
else if (rdmc_wr_req_accept_hdr)
full_hdr_r1 <= full_hdr_r;
zcopy_mode <= muxed_zcopy_mode_r;
jmb_pkt_type <= pref_buf_used_num_r;
full_hdr_r1 <= full_hdr_r1;
zcopy_mode <= zcopy_mode;
jmb_pkt_type <= jmb_pkt_type;
else if (ipp_data_req_p_r2)
port_gnt_r2 <= port_gnt_r1;
port_gnt_r2 <= drop_pkt_port_gnt;
port_gnt_r2 <= port_gnt_r2;
else if (ipp_data_req_p_r2)
zcp_wr_type <= zcp_type[1:0];
zcp_wr_type <= zcp_wr_type;
rdmc_wr_data_dma_num <= 5'b0;
else if (rdmc_wr_req_accept_hdr)
rdmc_wr_data_dma_num <= rdmc_meta0_wr_req_dma_num_int;
rdmc_wr_data_dma_num <= rdmc_wr_data_dma_num;
assign zcp_req_cnt_done = muxed_orig_zcopy_mode ? zcp_req_cnt[2] : zcp_req_cnt[1];
else if (zcp_req_cnt_done)
else if (stage0_en | (|zcp_req_cnt))
zcp_req_cnt <= zcp_req_cnt + 3'd1;
zcp_req_cnt <= zcp_req_cnt;
else if (stage0_en & port_gnt[0])
else if (zcp_req_cnt_done)
dmc_zcp_req0 <= dmc_zcp_req0;
else if (stage0_en & port_gnt[1])
else if (zcp_req_cnt_done)
dmc_zcp_req1 <= dmc_zcp_req1;
else if (stage0_en & port_gnt[2])
else if (zcp_req_cnt_done)
dmc_zcp_req2 <= dmc_zcp_req2;
else if (stage0_en & port_gnt[3])
else if (zcp_req_cnt_done)
dmc_zcp_req3 <= dmc_zcp_req3;
assign zcp_data_ack = zcp_data_ack0 | zcp_data_ack1 | zcp_data_ack2 | zcp_data_ack3;
assign muxed_zcp_data = {128{port_gnt_r[0]}} & zcp_data0[127:0] |
{128{port_gnt_r[1]}} & zcp_data1[127:0] |
{128{port_gnt_r[2]}} & zcp_data2[127:0] |
{128{port_gnt_r[3]}} & zcp_data3[127:0] ;
assign muxed_zcp_data_eop = port_gnt_r[0] & zcp_data_ack0 & zcp_data0[129] |
port_gnt_r[1] & zcp_data_ack1 & zcp_data1[129] |
port_gnt_r[2] & zcp_data_ack2 & zcp_data2[129] |
port_gnt_r[3] & zcp_data_ack3 & zcp_data3[129] ;
zcp_ack_cnt <= zcp_ack_cnt + 2'd1;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b00))
zcp_data_reg0 <= muxed_zcp_data;
zcp_data_reg0 <= zcp_data_reg0;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
zcp_data_reg1 <= muxed_zcp_data[127:96];
zcp_data_reg1 <= zcp_data_reg1;
zcp_data_reg1_lo <= 22'b0;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
zcp_data_reg1_lo <= muxed_zcp_data[23:2];
zcp_data_reg1_lo <= zcp_data_reg1_lo;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b10))
zcp_data_reg2 <= muxed_zcp_data[127:0];
zcp_data_reg2 <= zcp_data_reg2;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b11))
zcp_data_reg3 <= muxed_zcp_data[127:0];
zcp_data_reg3 <= zcp_data_reg3;
assign zcp_data_reg2 = 128'b0;
assign zcp_data_reg3 = 128'b0;
assign zcp_data_reg1_lo = 22'b0;
/*********************************/
//one stage pipeline zcp read data
/*********************************/
rdmc_wr_req_accept_hdr_r <= 1'b0;
rdmc_wr_req_accept_hdr_r1 <= 1'b0;
rdmc_wr_req_accept_hdr_r <= rdmc_wr_req_accept_hdr;
rdmc_wr_req_accept_hdr_r1 <= rdmc_wr_req_accept_hdr_r;
zcp_data_reg0_r <= 128'b0;
else if (rdmc_wr_req_accept_hdr_r1)
zcp_data_reg0_r <= zcp_data_reg0;
zcp_data_reg0_r <= zcp_data_reg0_r;
zcp_data_reg1_r <= 16'b0;
else if (rdmc_wr_req_accept_hdr_r1)
zcp_data_reg1_r <= zcp_data_reg1[31:16];
zcp_data_reg1_r <= zcp_data_reg1_r;
wire[7:0] zcp_data_reg0_byte0 = zcp_data_reg0_r[127:120];
wire[7:0] zcp_data_reg0_byte1 = zcp_data_reg0_r[119:112];
wire[7:0] zcp_data_reg0_byte2 = zcp_data_reg0_r[111:104];
wire[7:0] zcp_data_reg0_byte3 = zcp_data_reg0_r[103:96];
wire[7:0] zcp_data_reg0_byte4 = zcp_data_reg0_r[95:88];
wire[7:0] zcp_data_reg0_byte5 = zcp_data_reg0_r[87:80];
wire[7:0] zcp_data_reg0_byte6 = zcp_data_reg0_r[79:72];
wire[7:0] zcp_data_reg0_byte7 = zcp_data_reg0_r[71:64];
wire[7:0] zcp_data_reg0_byte8 = zcp_data_reg0_r[63:56];
wire[7:0] zcp_data_reg0_byte9 = zcp_data_reg0_r[55:48];
wire[7:0] zcp_data_reg0_byte10 = zcp_data_reg0_r[47:40];
wire[7:0] zcp_data_reg0_byte11 = zcp_data_reg0_r[39:32];
wire[7:0] zcp_data_reg0_byte12 = zcp_data_reg0_r[31:24];
wire[7:0] zcp_data_reg0_byte13 = zcp_data_reg0_r[23:16];
wire[7:0] zcp_data_reg0_byte14 = zcp_data_reg0_r[15:8];
wire[7:0] zcp_data_reg0_byte15 = zcp_data_reg0_r[7:0];
wire[7:0] zcp_data_reg1_byte0 = zcp_data_reg1_r[15:8];
wire[7:0] zcp_data_reg1_byte1 = zcp_data_reg1_r[7:0];
wire[7:0] zcp_data_reg1_byte2 = zcp_data_reg1[15:8];
wire[7:0] zcp_data_reg1_byte3 = zcp_data_reg1[7:0];
wire[7:0] zcp_data_reg2_byte0 = zcp_data_reg2[127:120];
wire[7:0] zcp_data_reg2_byte1 = zcp_data_reg2[119:112];
wire[7:0] zcp_data_reg2_byte2 = zcp_data_reg2[111:104];
wire[7:0] zcp_data_reg2_byte3 = zcp_data_reg2[103:96];
wire[7:0] zcp_data_reg2_byte4 = zcp_data_reg2[95:88];
wire[7:0] zcp_data_reg2_byte5 = zcp_data_reg2[87:80];
wire[7:0] zcp_data_reg2_byte6 = zcp_data_reg2[79:72];
wire[7:0] zcp_data_reg2_byte7 = zcp_data_reg2[71:64];
wire[7:0] zcp_data_reg2_byte8 = zcp_data_reg2[63:56];
wire[7:0] zcp_data_reg2_byte9 = zcp_data_reg2[55:48];
wire[7:0] zcp_data_reg2_byte10 = zcp_data_reg2[47:40];
wire[7:0] zcp_data_reg2_byte11 = zcp_data_reg2[39:32];
wire[7:0] zcp_data_reg2_byte12 = zcp_data_reg2[31:24];
wire[7:0] zcp_data_reg2_byte13 = zcp_data_reg2[23:16];
wire[7:0] zcp_data_reg2_byte14 = zcp_data_reg2[15:8];
wire[7:0] zcp_data_reg2_byte15 = zcp_data_reg2[7:0];
wire[7:0] zcp_data_reg3_byte0 = zcp_data_reg3[127:120];
wire[7:0] zcp_data_reg3_byte1 = zcp_data_reg3[119:112];
wire[7:0] zcp_data_reg3_byte2 = zcp_data_reg3[111:104];
wire[7:0] zcp_data_reg3_byte3 = zcp_data_reg3[103:96];
wire[7:0] zcp_data_reg3_byte4 = zcp_data_reg3[95:88];
wire[7:0] zcp_data_reg3_byte5 = zcp_data_reg3[87:80];
wire[7:0] zcp_data_reg3_byte6 = zcp_data_reg3[79:72];
wire[7:0] zcp_data_reg3_byte7 = zcp_data_reg3[71:64];
wire[7:0] zcp_data_reg3_byte8 = zcp_data_reg3[63:56];
wire[7:0] zcp_data_reg3_byte9 = zcp_data_reg3[55:48];
wire[7:0] zcp_data_reg3_byte10 = zcp_data_reg3[47:40];
wire[7:0] zcp_data_reg3_byte11 = zcp_data_reg3[39:32];
wire[7:0] zcp_data_reg3_byte12 = zcp_data_reg3[31:24];
wire[7:0] zcp_data_reg3_byte13 = zcp_data_reg3[23:16];
wire[7:0] zcp_data_reg3_byte14 = zcp_data_reg3[15:8];
wire[7:0] zcp_data_reg3_byte15 = zcp_data_reg3[7:0];
assign zcp_rdc_num = zcp_data_reg1_byte3[4:0];
assign zcp_type = zcp_data_reg1_byte3[6:5];
assign zcp_pkt_id = zcp_data_reg1_byte2[5:2];
assign zcp_vaddr0_tmp = {zcp_data_reg2_byte0[3:0], zcp_data_reg2_byte1, zcp_data_reg2_byte2,
zcp_data_reg2_byte3, zcp_data_reg2_byte4, zcp_data_reg2_byte5};
assign zcp_len0 = {zcp_data_reg2_byte6[5:0], zcp_data_reg2_byte7};
assign zcp_vaddr1_tmp = {zcp_data_reg2_byte8[3:0], zcp_data_reg2_byte9, zcp_data_reg2_byte10,
zcp_data_reg2_byte11, zcp_data_reg2_byte12, zcp_data_reg2_byte13};
assign zcp_len1 = {zcp_data_reg2_byte14[5:0],zcp_data_reg2_byte15};
assign zcp_vaddr2_tmp = {zcp_data_reg3_byte0[3:0], zcp_data_reg3_byte1, zcp_data_reg3_byte2,
zcp_data_reg3_byte3, zcp_data_reg3_byte4, zcp_data_reg3_byte5};
assign zcp_len2 = {zcp_data_reg3_byte6[5:0], zcp_data_reg3_byte7};
assign zcp_vaddr3_tmp = {zcp_data_reg3_byte8[3:0], zcp_data_reg3_byte9, zcp_data_reg3_byte10,
zcp_data_reg3_byte11, zcp_data_reg3_byte12, zcp_data_reg3_byte13};
assign zcp_len3 = {zcp_data_reg3_byte14[5:0],zcp_data_reg3_byte15};
assign zcp_vaddr0 = {zcp_data_reg1_lo[21:2], zcp_vaddr0_tmp[43:0]};
assign zcp_vaddr1 = {zcp_data_reg1_lo[21:2], zcp_vaddr1_tmp[43:0]};
assign zcp_vaddr2 = {zcp_data_reg1_lo[21:2], zcp_vaddr2_tmp[43:0]};
assign zcp_vaddr3 = {zcp_data_reg1_lo[21:2], zcp_vaddr3_tmp[43:0]};
assign zcp_func_num = zcp_data_reg1_lo[1:0];
assign drop_pkt_len_leftover = |muxed_l2_len_r[3:0];
assign drop_pkt_word_cnt_tmp = drop_pkt_len_leftover ? muxed_l2_len_r[13:4] : (muxed_l2_len_r[13:4] - 10'd1);
assign drop_pkt_done = drop_pkt_en & (drop_pkt_word_cnt == 10'b0);
drop_pkt_word_cnt <= 10'b0;
drop_pkt_word_cnt <= drop_pkt_word_cnt_tmp;
else if (drop_pkt_en & !drop_pkt_done)
drop_pkt_word_cnt <= drop_pkt_word_cnt - 10'd1;
drop_pkt_word_cnt <= drop_pkt_word_cnt;
drop_pkt_en_dly <= {4{drop_pkt_en}} & drop_pkt_port_gnt;
assign is_zcp_wr_req = is_zcp0_wr_req | is_zcp1_wr_req | is_zcp2_wr_req | is_zcp3_wr_req;
assign rdmc_wr_req_accept_zcp = rdmc_wr_req_accept_zcp0 | rdmc_wr_req_accept_zcp1 |
rdmc_wr_req_accept_zcp2 | rdmc_wr_req_accept_zcp3;
assign rdmc_wr_req_accept_all = rdmc_wr_req_accept_hdr | rdmc_wr_req_accept_zcp |
assign rdmc_wr_req_accept_data = rdmc_wr_req_accept_zcp | rdmc_wr_req_accept_jmb;
assign zcp_data_len = is_zcp0_wr_req ? zcp_len0 :
is_zcp1_wr_req ? zcp_len1 :
is_zcp2_wr_req ? zcp_len2 :
assign zcp_has_ipp_data_req = (|zcp_data_len[13:4]) | (zcp_data_len[3:0] > next_data_offset_reg[3:0]);
assign new_zcp_data_len_tmp = zcp_data_len - {10'b0, next_data_offset_reg};
assign new_zcp_data_len = zcp_has_ipp_data_req ? new_zcp_data_len_tmp : 14'b0;
assign ipp_pkt_len = is_zcp_wr_req ? new_zcp_data_len_r : muxed_pkt_len_r;
assign ipp_pkt_len_left_over = |ipp_pkt_len[3:0];
assign 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]};
assign rdmc_wr_data_req_p = full_hdr_r1 & is_first_accept & rdmc_wr_data_req & !rdmc_wr_data_req_dly;
assign rdmc_wr_data_req_mod = rdmc_wr_data_req & !rdmc_wr_data_req_p;
assign ipp_data_req_en = rdmc_wr_data_req_mod & (|ipp_pkt_len_word_cnt);
rdmc_wr_data_req_dly <= 1'b0;
rdmc_wr_data_req_dly <= rdmc_wr_data_req;
new_zcp_data_len_r <= 14'b0;
new_zcp_data_len_r <= new_zcp_data_len;
ipp_pkt_len_word_cnt <= 11'b0;
else if (rdmc_wr_req_accept_zcp | rdmc_wr_req_accept_hdr)
ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt_tmp;
else if (ipp_data_req_en)
ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt - 11'd1;
ipp_pkt_len_word_cnt <= ipp_pkt_len_word_cnt;
wire ipp_data_req_en1 = ipp_data_req_en | drop_pad_data;
ipp_dat_req0_data <= 1'b0;
ipp_dat_req1_data <= 1'b0;
ipp_dat_req2_data <= 1'b0;
ipp_dat_req3_data <= 1'b0;
ipp_dat_req0_data <= ipp_data_req_en1 & port_gnt_r1[0] | drop_pkt_en & drop_pkt_port_gnt[0];
ipp_dat_req1_data <= ipp_data_req_en1 & port_gnt_r1[1] | drop_pkt_en & drop_pkt_port_gnt[1];
ipp_dat_req2_data <= ipp_data_req_en1 & port_gnt_r1[2] | drop_pkt_en & drop_pkt_port_gnt[2];
ipp_dat_req3_data <= ipp_data_req_en1 & port_gnt_r1[3] | drop_pkt_en & drop_pkt_port_gnt[3];
dmc_ipp_dat_req0 <= 1'b0;
dmc_ipp_dat_req1 <= 1'b0;
dmc_ipp_dat_req2 <= 1'b0;
dmc_ipp_dat_req3 <= 1'b0;
rdmc_wr_data_req <= 1'b0;
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];
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];
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];
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];
rdmc_wr_data_req <= meta0_rdmc_wr_data_req;
stage0_en_r <= stage0_en;
drop_pad_data_r <= drop_pad_data;
assign ipp_data_req_maskout = {4{stage0_en_r}} & port_gnt | drop_pkt_en_dly | {4{drop_pad_data_r}} & port_gnt_r1;
ipp_data_req0_dly <= 1'b0;
ipp_data_req1_dly <= 1'b0;
ipp_data_req2_dly <= 1'b0;
ipp_data_req3_dly <= 1'b0;
ipp_data_req0_dly <= dmc_ipp_dat_req0 & !ipp_data_req_maskout[0];
ipp_data_req1_dly <= dmc_ipp_dat_req1 & !ipp_data_req_maskout[1];
ipp_data_req2_dly <= dmc_ipp_dat_req2 & !ipp_data_req_maskout[2];
ipp_data_req3_dly <= dmc_ipp_dat_req3 & !ipp_data_req_maskout[3];
assign ipp_data_req0_p = dmc_ipp_dat_req0 & !ipp_data_req0_dly & !ipp_data_req_maskout[0];
assign ipp_data_req1_p = dmc_ipp_dat_req1 & !ipp_data_req1_dly & !ipp_data_req_maskout[1];
assign ipp_data_req2_p = dmc_ipp_dat_req2 & !ipp_data_req2_dly & !ipp_data_req_maskout[2];
assign ipp_data_req3_p = dmc_ipp_dat_req3 & !ipp_data_req3_dly & !ipp_data_req_maskout[3];
assign ipp_data_req_p = ipp_data_req0_p | ipp_data_req1_p | ipp_data_req2_p | ipp_data_req3_p;
assign ipp_data_req_dly = ipp_data_req0_dly | ipp_data_req1_dly | ipp_data_req2_dly | ipp_data_req3_dly;
assign muxed_ipp_data = {128{port_gnt_r2[0] & ipp_data_ack0}} & ipp_data0[127:0] |
{128{port_gnt_r2[1] & ipp_data_ack1}} & ipp_data1[127:0] |
{128{port_gnt_r2[2] & ipp_data_ack2}} & ipp_data2[127:0] |
{128{port_gnt_r2[3] & ipp_data_ack3}} & ipp_data3[127:0] ;
assign muxed_ipp_data_eop = port_gnt_r2[0] & ipp_data_ack0 & ipp_data0[129] |
port_gnt_r2[1] & ipp_data_ack1 & ipp_data1[129] |
port_gnt_r2[2] & ipp_data_ack2 & ipp_data2[129] |
port_gnt_r2[3] & ipp_data_ack3 & ipp_data3[129];
assign muxed_ipp_data_ack = port_gnt_r2[0] & ipp_data_ack0 |
port_gnt_r2[1] & ipp_data_ack1 |
port_gnt_r2[2] & ipp_data_ack2 |
port_gnt_r2[3] & ipp_data_ack3;
assign ipp_data_req_in = dmc_ipp_dat_req0 & !ipp_data_req_maskout[0] |
dmc_ipp_dat_req1 & !ipp_data_req_maskout[1] |
dmc_ipp_dat_req2 & !ipp_data_req_maskout[2] |
dmc_ipp_dat_req3 & !ipp_data_req_maskout[3];
assign ipp_fzcp_eop_in = !(|ipp_pkt_len_word_cnt) & ipp_data_req_in;
assign ipp_next_eop = !(|ipp_pkt_len[13:0]); //at accept cycle
ipp_data_req_dly1 <= 1'b0;
ipp_data_req_dly2 <= 1'b0;
ipp_data_req_dly1 <= ipp_data_req_dly;
ipp_data_req_dly2 <= ipp_data_req_dly1;
ipp_fzcp_eop_tmp <= 1'b0;
ipp_fzcp_eop_tmp1 <= 1'b0;
ipp_fzcp_eop_tmp2 <= 1'b0;
ipp_fzcp_eop_tmp <= ipp_fzcp_eop_in;
ipp_fzcp_eop_tmp1 <= ipp_fzcp_eop_tmp;
ipp_fzcp_eop_tmp2 <= ipp_fzcp_eop_tmp1;
ipp_fzcp_eop <= ipp_fzcp_eop_tmp2;
/**************************************************************/
//rdmc req counter in 16byte, this is used to generate pkt done
/**************************************************************/
assign pkt_len_left_over = |pkt_trans_len_r[3:0];
assign pkt_len_word_cnt_tmp = pkt_len_left_over ? pkt_trans_len_r[13:4] : (pkt_trans_len_r[13:4] - 10'd1);
assign pkt_req_cnt_done_tmp = (data_req_cnt == pkt_len_word_cnt) & rdmc_wr_data_req;
assign pkt_req_cnt_e_done_mod = pkt_req_cnt_e_done_r & jmb_wr_cycle_sm;
pkt_len_word_cnt <= 10'd0;
else if (rdmc_wr_req_accept_all)
pkt_len_word_cnt <= pkt_len_word_cnt_tmp;
pkt_len_word_cnt <= pkt_len_word_cnt;
else if (pkt_req_cnt_done_tmp)
else if (rdmc_wr_data_req)
data_req_cnt <= data_req_cnt + 10'd1;
data_req_cnt <= data_req_cnt;
pkt_req_cnt_pre_done <= 1'b0;
pkt_req_cnt_done <= 1'b0;
pkt_req_cnt_done_r <= 1'b0;
pkt_req_cnt_done_r1 <= 1'b0;
pkt_req_cnt_done_r2 <= 1'b0;
pkt_req_cnt_e_done_r <= 1'b0;
pkt_req_cnt_pre_done <= pkt_req_cnt_done_tmp;
pkt_req_cnt_done <= pkt_req_cnt_pre_done;
pkt_req_cnt_done_r <= pkt_req_cnt_done;
pkt_req_cnt_done_r1 <= pkt_req_cnt_done_r;
pkt_req_cnt_done_r2 <= pkt_req_cnt_done_r1;
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
wr_len_last_bits <= 4'b0;
else if (rdmc_wr_req_accept_all)
wr_len_last_bits <= pkt_trans_len_r[3:0];
wr_len_last_bits <= wr_len_last_bits;
wr_len_last_bits_r <= 4'b0;
else if (ipp_data_req_p_r2)
wr_len_last_bits_r <= wr_len_last_bits[3:0];
else if (rdmc_wr_req_accept_data)
wr_len_last_bits_r <= pkt_trans_len_r[3:0]; //for jumbo pkt and zcp pkt
wr_len_last_bits_r <= wr_len_last_bits_r;
always @ (wr_len_last_bits_r)
case (wr_len_last_bits_r) //synopsys parallel_case full_case
4'd0: wr_data_byte_dec = 16'b1111_1111_1111_1111;
4'd1: wr_data_byte_dec = 16'b0000_0000_0000_0001;
4'd2: wr_data_byte_dec = 16'b0000_0000_0000_0011;
4'd3: wr_data_byte_dec = 16'b0000_0000_0000_0111;
4'd4: wr_data_byte_dec = 16'b0000_0000_0000_1111;
4'd5: wr_data_byte_dec = 16'b0000_0000_0001_1111;
4'd6: wr_data_byte_dec = 16'b0000_0000_0011_1111;
4'd7: wr_data_byte_dec = 16'b0000_0000_0111_1111;
4'd8: wr_data_byte_dec = 16'b0000_0000_1111_1111;
4'd9: wr_data_byte_dec = 16'b0000_0001_1111_1111;
4'd10: wr_data_byte_dec = 16'b0000_0011_1111_1111;
4'd11: wr_data_byte_dec = 16'b0000_0111_1111_1111;
4'd12: wr_data_byte_dec = 16'b0000_1111_1111_1111;
4'd13: wr_data_byte_dec = 16'b0001_1111_1111_1111;
4'd14: wr_data_byte_dec = 16'b0011_1111_1111_1111;
4'd15: wr_data_byte_dec = 16'b0111_1111_1111_1111;
default:wr_data_byte_dec = 16'b0;
assign wr_data_byte_en = rdmc_wr_data_comp_sm ? wr_data_byte_dec : 16'hffff;
/************************************/
/************************************/
assign next_data_offset_tmp1 = (~ipp_pkt_len[3:0]) + 4'd1;
assign next_data_offset_tmp2 = next_data_offset_reg - ipp_pkt_len[3:0];
assign next_data_offset_tmp = zcp_has_ipp_data_req ? next_data_offset_tmp1 : next_data_offset_tmp2;
next_data_offset_reg <= 4'b0;
else if (rdmc_wr_req_accept_all)
next_data_offset_reg <= next_data_offset_tmp;
next_data_offset_reg <= next_data_offset_reg;
else if (offset_reg_en & (offset_sel == 2'b00))
data_offset_reg <= next_data_offset_reg;
data_offset_reg <= data_offset_reg;
always @ (data_offset_reg or data_save_reg)
case (data_offset_reg) //synopsys parallel_case full_case
4'd0: save_reg_trans = data_save_reg[127:0];
4'd1: save_reg_trans = {data_save_reg[7:0], 120'b0};
4'd2: save_reg_trans = {data_save_reg[15:0], 112'b0};
4'd3: save_reg_trans = {data_save_reg[23:0], 104'b0};
4'd4: save_reg_trans = {data_save_reg[31:0], 96'b0};
4'd5: save_reg_trans = {data_save_reg[39:0], 88'b0};
4'd6: save_reg_trans = {data_save_reg[47:0], 80'b0};
4'd7: save_reg_trans = {data_save_reg[55:0], 72'b0};
4'd8: save_reg_trans = {data_save_reg[63:0], 64'b0};
4'd9: save_reg_trans = {data_save_reg[71:0], 56'b0};
4'd10: save_reg_trans = {data_save_reg[79:0], 48'b0};
4'd11: save_reg_trans = {data_save_reg[87:0], 40'b0};
4'd12: save_reg_trans = {data_save_reg[95:0], 32'b0};
4'd13: save_reg_trans = {data_save_reg[103:0], 24'b0};
4'd14: save_reg_trans = {data_save_reg[111:0], 16'b0};
4'd15: save_reg_trans = {data_save_reg[119:0], 8'b0};
date_save_reg_trans <= 128'b0;
date_save_reg_trans <= save_reg_trans;
wire[119:0] data_last_save = muxed_ipp_data_ack ? muxed_ipp_data[127:8] : date_save_reg_trans[127:8];
wire[3:0] data_offset_in = offset_reg_en ? next_data_offset_reg[3:0] : data_offset_reg[3:0];
always @ (data_offset_in[3:0] or data_last_save)
case (data_offset_in[3:0]) //synopsys parallel_case full_case
4'd0: data_save_reg_tmp = 128'b0;
4'd1: data_save_reg_tmp = {120'b0, data_last_save[119:112]};
4'd2: data_save_reg_tmp = {112'b0, data_last_save[119:104]};
4'd3: data_save_reg_tmp = {104'b0, data_last_save[119:96]};
4'd4: data_save_reg_tmp = {96'b0, data_last_save[119:88]};
4'd5: data_save_reg_tmp = {88'b0, data_last_save[119:80]};
4'd6: data_save_reg_tmp = {80'b0, data_last_save[119:72]};
4'd7: data_save_reg_tmp = {72'b0, data_last_save[119:64]};
4'd8: data_save_reg_tmp = {64'b0, data_last_save[119:56]};
4'd9: data_save_reg_tmp = {56'b0, data_last_save[119:48]};
4'd10: data_save_reg_tmp = {48'b0, data_last_save[119:40]};
4'd11: data_save_reg_tmp = {40'b0, data_last_save[119:32]};
4'd12: data_save_reg_tmp = {32'b0, data_last_save[119:24]};
4'd13: data_save_reg_tmp = {24'b0, data_last_save[119:16]};
4'd14: data_save_reg_tmp = {16'b0, data_last_save[119:8]};
4'd15: data_save_reg_tmp = {8'b0, data_last_save[119:0]};
else if (rdmc_wr_data_valid_sm)
data_save_reg <= data_save_reg_tmp;
data_save_reg <= data_save_reg;
always @ (data_offset_reg or muxed_ipp_data or data_save_reg)
case (data_offset_reg) //synopsys parallel_case full_case
4'd0: rdmc_wr_data_tmp = {muxed_ipp_data[127:0]};
4'd1: rdmc_wr_data_tmp = {muxed_ipp_data[119:0], data_save_reg[7:0]};
4'd2: rdmc_wr_data_tmp = {muxed_ipp_data[111:0], data_save_reg[15:0]};
4'd3: rdmc_wr_data_tmp = {muxed_ipp_data[103:0], data_save_reg[23:0]};
4'd4: rdmc_wr_data_tmp = {muxed_ipp_data[95:0], data_save_reg[31:0]};
4'd5: rdmc_wr_data_tmp = {muxed_ipp_data[87:0], data_save_reg[39:0]};
4'd6: rdmc_wr_data_tmp = {muxed_ipp_data[79:0], data_save_reg[47:0]};
4'd7: rdmc_wr_data_tmp = {muxed_ipp_data[71:0], data_save_reg[55:0]};
4'd8: rdmc_wr_data_tmp = {muxed_ipp_data[63:0], data_save_reg[63:0]};
4'd9: rdmc_wr_data_tmp = {muxed_ipp_data[55:0], data_save_reg[71:0]};
4'd10: rdmc_wr_data_tmp = {muxed_ipp_data[47:0], data_save_reg[79:0]};
4'd11: rdmc_wr_data_tmp = {muxed_ipp_data[39:0], data_save_reg[87:0]};
4'd12: rdmc_wr_data_tmp = {muxed_ipp_data[31:0], data_save_reg[95:0]};
4'd13: rdmc_wr_data_tmp = {muxed_ipp_data[23:0], data_save_reg[103:0]};
4'd14: rdmc_wr_data_tmp = {muxed_ipp_data[15:0], data_save_reg[111:0]};
4'd15: rdmc_wr_data_tmp = {muxed_ipp_data[7:0], data_save_reg[119:0]};
wire[127:0] hdr_data1 = {muxed_ipp_data[111:0], zcp_data_reg0_byte1, zcp_data_reg0_byte0};
wire[127:0] hdr_data2 = {zcp_data_reg1_byte1, zcp_data_reg1_byte0, zcp_data_reg0_byte15, zcp_data_reg0_byte14,
zcp_data_reg0_byte13, zcp_data_reg0_byte12, zcp_data_reg0_byte11, zcp_data_reg0_byte10,
zcp_data_reg0_byte9, zcp_data_reg0_byte8, zcp_data_reg0_byte7, zcp_data_reg0_byte6,
zcp_data_reg0_byte5, zcp_data_reg0_byte4, zcp_data_reg0_byte3, zcp_data_reg0_byte2};
wire[127:0] rdmc_wr_data_in = (rdmc_wr_data_sel == 2'b00) ? hdr_data2 :
(rdmc_wr_data_sel == 2'b01) ? hdr_data1 : rdmc_wr_data_tmp;
/****************************/
/****************************/
wire[3:0] ipp_data_err = {ipp_data_err3, ipp_data_err2, ipp_data_err1, ipp_data_err0};
wire[3:0] zcp_data_err = {zcp_data_err3, zcp_data_err2, zcp_data_err1, zcp_data_err0};
wire[3:0] ipp_ack_array= {ipp_data_ack3, ipp_data_ack2, ipp_data_ack1, ipp_data_ack0};
wire[3:0] zcp_ack_array= {zcp_data_ack3, zcp_data_ack2, zcp_data_ack1, zcp_data_ack0};
wire muxed_ipp_ctrl_err = |(port_gnt & ipp_ack_array & ipp_data_err); //first read
wire muxed_zcp_data_err = |(port_gnt_r & zcp_ack_array & zcp_data_err); //control phase
assign muxed_ipp_data_err = |(port_gnt_r2 & ipp_ack_array & ipp_data_err); //data phase
wait_drop_pkt_eop <= 1'b0;
wait_drop_pkt_eop <= 1'b1;
wait_drop_pkt_eop <= 1'b0;
wait_drop_pkt_eop <= wait_drop_pkt_eop;
else if (muxed_ipp_ctrl_err)
else if (rdmc_wr_req_accept_hdr | wait_drop_pkt_eop)
muxed_data_err <= muxed_data_err;
muxed_data_err_r1 <= 1'b0;
else if (rdmc_wr_req_accept_hdr & muxed_data_err | muxed_zcp_data_err | (|port_zcp_eop_err))
muxed_data_err_r1 <= 1'b1;
else if (ipp_data_req_p_r2 | wait_drop_pkt_eop)
muxed_data_err_r1 <= 1'b0;
muxed_data_err_r1 <= muxed_data_err_r1;
muxed_data_err_r2 <= 1'b0;
else if (ipp_data_req_p_r1)
muxed_data_err_r2 <= 1'b0;
else if (muxed_ipp_data_err & !wr_idle_state | ipp_data_req_p_r2 & muxed_data_err_r1 | (|port_ipp_eop_err))
muxed_data_err_r2 <= 1'b1;
else if (rdmc_wr_last_comp | wait_drop_pkt_eop)
muxed_data_err_r2 <= 1'b0;
muxed_data_err_r2 <= muxed_data_err_r2;
/**********************************************/
/**********************************************/
wire muxed_ipp_data_req = dmc_ipp_dat_req0 & (port_gnt_r1[0] | drop_pkt_en_dly[0]) |
dmc_ipp_dat_req1 & (port_gnt_r1[1] | drop_pkt_en_dly[1]) |
dmc_ipp_dat_req2 & (port_gnt_r1[2] | drop_pkt_en_dly[2]) |
dmc_ipp_dat_req3 & (port_gnt_r1[3] | drop_pkt_en_dly[3]);
wire rdmc_eop_cnt_done = muxed_ipp_data_req & (rdmc_eop_cnt == 10'b0);
wire rdmc_eop_for_padding = rdmc_eop_cnt_done;
rdmc_eop_cnt <= 10'b11_1111_1111;
else if (rdmc_wr_req_accept_hdr | drop_pkt_en_sm)
rdmc_eop_cnt <= drop_pkt_word_cnt_tmp[9:0];
else if (muxed_ipp_data_req & (|rdmc_eop_cnt))
rdmc_eop_cnt <= rdmc_eop_cnt - 10'd1;
else if (rdmc_eop_cnt_done)
rdmc_eop_cnt <= 10'b11_1111_1111;
rdmc_eop_cnt <= rdmc_eop_cnt;
rdmc_cal_eop_tmp <= 1'b0;
rdmc_cal_eop_tmp1 <= 1'b0;
rdmc_cal_eop_tmp <= rdmc_eop_cnt_done;
rdmc_cal_eop_tmp1 <= rdmc_cal_eop_tmp;
rdmc_cal_eop <= rdmc_cal_eop_tmp1;
rdmc_cal_eop_r <= rdmc_cal_eop;
muxed_orig_zcopy_mode_r1 <= 1'b0;
else if (zcp_req_cnt_done)
muxed_orig_zcopy_mode_r1 <= muxed_orig_zcopy_mode_r;
muxed_orig_zcopy_mode_r1 <= muxed_orig_zcopy_mode_r1;
wire rdmc_cal_zcp_eop = muxed_orig_zcopy_mode_r1 ? zcp_data_ack & (zcp_ack_cnt == 2'b11) :
zcp_data_ack & (zcp_ack_cnt == 2'b01);
zcp_second_data_ack_dly <= 1'b0;
else if (zcp_data_ack & (zcp_ack_cnt == 2'b01))
zcp_second_data_ack_dly <= 1'b1;
zcp_second_data_ack_dly <= 1'b0;
wire pkt_id_err = !(zcp_pkt_id == muxed_ipp_pkt_id_r) & zcp_second_data_ack_dly;
wire ipp_eop_err = !(rdmc_cal_eop_r == muxed_ipp_data_eop);
wire zcp_eop_err = !(rdmc_cal_zcp_eop == muxed_zcp_data_eop);
assign port_ipp_eop_err = {4{ipp_eop_err}} & port_gnt_r2;
assign port_zcp_eop_err = {4{zcp_eop_err}} & port_gnt_r;
assign port_err_event = {pkt_id_err, port_zcp_eop_err, port_ipp_eop_err};
else if (stage0_en_r & port_gnt[0])
else if (rdmc_cal_zcp_eop & port_gnt_r[0])
zcp_sop_reg0 <= zcp_sop_reg0;
else if (stage0_en_r & port_gnt[1])
else if (rdmc_cal_zcp_eop & port_gnt_r[1])
zcp_sop_reg1 <= zcp_sop_reg1;
else if (stage0_en_r & port_gnt[2])
else if (rdmc_cal_zcp_eop & port_gnt_r[2])
zcp_sop_reg2 <= zcp_sop_reg2;
else if (stage0_en_r & port_gnt[3])
else if (rdmc_cal_zcp_eop & port_gnt_r[3])
zcp_sop_reg3 <= zcp_sop_reg3;
else if (stage0_en_r & port_gnt[0])
else if (rdmc_cal_eop_r & port_gnt_r2[0])
ipp_sop_reg0 <= ipp_sop_reg0;
else if (stage0_en_r & port_gnt[1])
else if (rdmc_cal_eop_r & port_gnt_r2[1])
ipp_sop_reg1 <= ipp_sop_reg1;
else if (stage0_en_r & port_gnt[2])
else if (rdmc_cal_eop_r & port_gnt_r2[2])
ipp_sop_reg2 <= ipp_sop_reg2;
else if (stage0_en_r & port_gnt[3])
else if (rdmc_cal_eop_r & port_gnt_r2[3])
ipp_sop_reg3 <= ipp_sop_reg3;
/****************************/
//rdmc-meta0 write interface
/****************************/
wire[3:0] rdmc_meta0_wr_status = 4'b0;
rdmc_meta0_wr_data <= 128'b0;
rdmc_meta0_wr_data <= rdmc_wr_data_in;
rdmc_meta0_wr_data_valid <= 1'b0;
rdmc_meta0_wr_data_valid <= rdmc_wr_data_valid_sm;
rdmc_meta0_wr_transfer_comp <= 1'b0;
rdmc_meta0_wr_transfer_comp <= rdmc_wr_data_comp_sm;
rdmc_meta0_wr_transfer_comp_int <= 1'b0; //for output timing
rdmc_meta0_wr_transfer_comp_int <= rdmc_wr_data_comp_sm;
rdmc_meta0_wr_req_byteenable <= 16'b0;
else if (rdmc_wr_data_valid_sm)
rdmc_meta0_wr_req_byteenable <= wr_data_byte_en;
rdmc_meta0_wr_req_byteenable <= 16'b0;
rdmc_wr_last_comp <= 1'b0;
rdmc_wr_last_comp <= rdmc_wr_last_comp_sm;
niu_rdmc_wr_dp_sm niu_rdmc_wr_dp_sm_inst0 (
.full_hdr_r1 (full_hdr_r1),
.ipp_data_req_dly2 (ipp_data_req_dly2),
.rdmc_wr_req_accept_hdr (rdmc_wr_req_accept_hdr),
.rdmc_wr_req_accept_zcp (rdmc_wr_req_accept_zcp),
.muxed_ipp_data_ack (muxed_ipp_data_ack),
.rdmc_cal_eop_r (rdmc_cal_eop_r),
.ipp_next_eop (ipp_next_eop),
.ipp_fzcp_eop (ipp_fzcp_eop),
.pkt_req_cnt_done (pkt_req_cnt_done),
.pkt_req_cnt_done_r (pkt_req_cnt_done_r),
.pkt_req_cnt_done_r1 (pkt_req_cnt_done_r1),
.pkt_req_cnt_done_r2 (pkt_req_cnt_done_r2),
.jmb_pkt_type (jmb_pkt_type),
.zcopy_mode (zcopy_mode),
.zcp_wr_type (zcp_wr_type),
.offset_reg_en (offset_reg_en),
.offset_sel (offset_sel),
.wr_idle_state (wr_idle_state),
.rdmc_wr_data_sel (rdmc_wr_data_sel),
.rdmc_wr_data_valid_sm (rdmc_wr_data_valid_sm),
.rdmc_wr_data_comp_sm (rdmc_wr_data_comp_sm),
.rdmc_wr_last_comp_sm (rdmc_wr_last_comp_sm),
.jmb_wr_cycle_sm (jmb_wr_cycle_sm),
.wr_dp_sm_state (wr_dp_sm_state)