// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: niu_ipp_sum_unit.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 ============================================
/**********************************************************
***********************************************************
File name : niu_ipp_sum_unit.v
Module(s) name : niu_ipp_sum_unit
Original: : sum_unit.v main.5, label:
Parent modules : niu_ipp_sum.v
Child modules : niu_ipp_sum_lib.v, niu_ipp_sum.h,
niu_ipp_sum_data.v, niu_ipp_sum_ctrl.v.
Author's name : George Chu
Description : One unit of the ipp checksum.
************************************************************
***********************************************************/
module niu_ipp_sum_unit (ipp_din_dat, port_num, ipp_full_cksum,
ipp_la4_prot, ipp_la3_vers, ipp_la2_opti, ip4_hdr_leng,
ipp_info_valid, ipp_start_tcp, ipp_pkt_end, ipp_max_bytes,
sum_prt_started, sum_prt_valid,
sum_prt_fail, sum_prt_cksum, sum_prt_length,
input [127:0] ipp_din_dat; // pkt data
input port_num; // if 1, this sum_unit is enabled
input ipp_full_cksum; // if 1, do the full check_sum
input [1:0] ipp_la4_prot; // layer_4, protocol, 0:not_interested,1:Tcp,2:Udp,3:SCTP
input [1:0] ipp_la3_vers; // layer_3, version, 0:not_interested,1:Ip4,2:Ip6,3:reser
input [1:0] ipp_la2_opti; // layer_2, options {LLC,VLAN}
input [3:0] ip4_hdr_leng; // layer_3, IPv4 header_length
input ipp_info_valid; // pkt data valid
input ipp_start_tcp; // start a tcp checksum
input ipp_pkt_end; // end of the pkt data
input [16:0] ipp_max_bytes; // pio program: maximum bytes for a pkt to pass checksum
output sum_prt_started; // the sum_unit is busy, processing a pkt
output sum_prt_valid; // the following checksum outputs are valid
output sum_prt_fail; // the checked result is a failure
output [15:0] sum_prt_cksum; // the check sum
output [15:0] sum_prt_length; // the IPv4,6's IP length field
output [31:0] sum_prt_state; // the states of the checksum_unit
wire [15:0] sum_prt_cksum;
wire [15:0] sum_prt_length;
wire [31:0] sum_prt_state;
/* ---------- sum data -------- */
wire [15:0] tcp_prt_cksum;
/* ---------- sum ctrl -------- */
wire [15:0] udp_dat_len_r;
wire [15:0] tcp_prt_length;
wire [31:0] tcp_prt_state;
wire ipp_start = ipp_start_tcp;
wire clr_prt = ipp_start && !ipp_start_d || reset;
wire [15:0] sum_prt_cksum_d;
wire [15:0] sum_prt_length_d;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
assign sum_prt_fail = sum_prt_valid ? tcp_prt_fail : sum_prt_fail_d;
assign sum_prt_cksum = sum_prt_valid ? tcp_prt_cksum[15:0] : sum_prt_cksum_d[15:0];
assign sum_prt_length = sum_prt_valid ? tcp_prt_length[15:0] : sum_prt_length_d[15:0];
niu_ipp_sum_data sum_data (
.din_wrd (din_wrd_d[127:0]),
.byt_ena (byt_ena[15:0]),
.inp_uln (udp_dat_len_r[15:0]),
.sum_prt_cksum (tcp_prt_cksum[15:0]),
.c_dsum_fail (c_dsum_fail)
niu_ipp_sum_ctrl sum_ctrl (
.din_wrd (din_wrd[127:0]),
.ipp_full_cksum (ipp_full_cksum),
.ipp_la4_prot (ipp_la4_prot[1:0]),
.ipp_la3_vers (ipp_la3_vers[1:0]),
.ipp_la2_opti (ipp_la2_opti[1:0]),
.ip4_hdr_leng (ip4_hdr_leng[3:0]),
.ipp_info_valid (ipp_info_valid),
.ipp_start_cksum (ipp_start_tcp),
.ipp_pkt_end (ipp_pkt_end),
.ipp_max_bytes (ipp_max_bytes[16:0]),
.c_dsum_fail (c_dsum_fail),
.byt_ena (byt_ena[15:0]),
.udp_dat_len_r (udp_dat_len_r[15:0]),
.sum_prt_started (sum_prt_started),
.sum_prt_valid (sum_prt_valid),
.sum_prt_fail (tcp_prt_fail),
.sum_prt_length (tcp_prt_length[15:0]),
.sum_prt_state (tcp_prt_state[31:0])
{ipp_din_dat[007:000],ipp_din_dat[015:008],ipp_din_dat[023:016],ipp_din_dat[031:024],
ipp_din_dat[039:032],ipp_din_dat[047:040],ipp_din_dat[055:048],ipp_din_dat[063:056],
ipp_din_dat[071:064],ipp_din_dat[079:072],ipp_din_dat[087:080],ipp_din_dat[095:088],
ipp_din_dat[103:096],ipp_din_dat[111:104],ipp_din_dat[119:112],ipp_din_dat[127:120]};
ipp_sum_reg_r_1 su_reg_r_1_clr (clr, reset, clk,clr_sum);
ipp_sum_reg_r_1 su_reg_r_1_sta (ipp_start, reset, clk,ipp_start_d);
ipp_sum_reg_r_128 su_reg_r_128_wrd(din_wrd[127:0], reset, clk,din_wrd_d[127:0]);
ipp_sum_reg_r_1 su_reg_r_1_fai (sum_prt_fail, clr_prt,clk,sum_prt_fail_d);
ipp_sum_reg_r_16 su_reg_r_16_sum (sum_prt_cksum[15:0], clr_prt,clk,sum_prt_cksum_d[15:0]);
ipp_sum_reg_r_16 su_reg_r_16_len (sum_prt_length[15:0], clr_prt,clk,sum_prt_length_d[15:0]);
ipp_sum_reg_r_9_s0 su_reg_w_r_9_s0 (tcp_prt_state[08:0], reset, clk,sum_prt_state[08:0]);
ipp_sum_reg_w_r_23 su_reg_w_r_23_st(tcp_prt_state[31:9], sum_prt_started,clr_prt,clk,sum_prt_state[31:9]);