// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: niu_ipp_unload_ctl_1ke.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 // have any questions. // // ========== Copyright Header End ============================================ /********************************************************** *********************************************************** Project : Niu File name : niu_ipp_unload_ctl_1ke.v Module(s) name : niu_ipp_unload_ctl_1ke Parent modules : niu_ipp.v Child modules : niu_ipp.h Author's name : George Chu Date : Jan. 2004 Description : This module contains a Finite State Machine used to control the ipp_unload interface protocol. Synthesis Notes: Modification History: Date Description ---- ----------- ************************************************************ ***********************************************************/ `timescale 1ns/10ps `include "niu_ipp.h" module niu_ipp_unload_ctl_1ke ( ipp_ffl_dvalid_n, cur_pkt_hdr_base_ptr, cur_pkt_ffl_sum_info, ipp_hfifo_dat_tag, ipp_hfifo_dat_empty, ipp_dfifo_dout_tag, ipp_dmc_dat_err1, sum_prt_valid, dmc_ipp_dat_req, pio_cksum_ena, pio_full_cksum, ipp_enable, ippfifo_rd_wr_ptr_bypass, ippfifo_rd_ptr_pio_wr_en, datfifo_pio_wr_ena, dfifo_rd_ptr_pio_wr_en, dfifo_wt_ptr_pio_wr_en, dfifo_wt_data_reg_wr_en_pls, ipp_pio_wdata, reset, clk, inc_hfifo_dat_rptr, inc_hfifo_dat_rptr_d, ipp_hfifo_dat_rptr, ipp_hfifo_dat_tag_rd, ipp_dfifo_wptr, ipp_dfifo_wten, ipp_dfifo_wten_2nd, ipp_dfifo_rden, ipp_dfifo_rptr, ipp_dfifo_full, wt_dfifo_1st_wd, addr_status, ipp_dmc_dat_ack, ipp_dmc_ful_pkt, ipp_full_cksum, ipp_start_tcp, ipp_sum_info_vld, req_rd_dfifo_eop, req_rd_dfifo_sop, ipp_la2_opti, ipp_la3_vers, ip4_hdr_leng, ipp_la4_prot, clr_ipp_unload, n_ipp_unload_idle, fet_pio_tcp_ena, dfifo_miss_eop, dfifo_miss_sop, c_unload_st ); input ipp_ffl_dvalid_n; input [6:0] cur_pkt_hdr_base_ptr; input [9:0] cur_pkt_ffl_sum_info; input [1:0] ipp_hfifo_dat_tag; input ipp_hfifo_dat_empty; input [1:0] ipp_dfifo_dout_tag; input ipp_dmc_dat_err1; input sum_prt_valid; input dmc_ipp_dat_req; input pio_cksum_ena; input pio_full_cksum; input ipp_enable; input ippfifo_rd_wr_ptr_bypass; input ippfifo_rd_ptr_pio_wr_en; input datfifo_pio_wr_ena; input dfifo_rd_ptr_pio_wr_en; input dfifo_wt_ptr_pio_wr_en; input dfifo_wt_data_reg_wr_en_pls; input [10:0] ipp_pio_wdata; input reset; input clk; output inc_hfifo_dat_rptr; output inc_hfifo_dat_rptr_d; output [6:0] ipp_hfifo_dat_rptr; output [1:0] ipp_hfifo_dat_tag_rd; output [10:0] ipp_dfifo_wptr; // addr[9:0] of 16k-byte data, 1k entries, + 1_wrap output ipp_dfifo_wten; output ipp_dfifo_wten_2nd; output ipp_dfifo_rden; output [10:0] ipp_dfifo_rptr; // addr[9:0] of 16k-byte data, 1k entries, + 1_wrap output ipp_dfifo_full; output wt_dfifo_1st_wd; output [11:0] addr_status; output ipp_dmc_dat_ack; output ipp_dmc_ful_pkt; output ipp_full_cksum; output ipp_start_tcp; output ipp_sum_info_vld; output req_rd_dfifo_eop; output req_rd_dfifo_sop; output [1:0] ipp_la2_opti; output [1:0] ipp_la3_vers; output [3:0] ip4_hdr_leng; output [1:0] ipp_la4_prot; output clr_ipp_unload; output n_ipp_unload_idle; output fet_pio_tcp_ena; output dfifo_miss_eop; output dfifo_miss_sop; output [4:0] c_unload_st; reg inc_hfifo_dat_rptr; reg inc_hfifo_dat_rptr_d; wire [6:0] ipp_hfifo_dat_rptr; wire [1:0] ipp_hfifo_dat_tag_rd; wire [10:0] ipp_dfifo_wptr; // addr[9:0] of 16k-byte data, 1k entries, + 1_wrap wire ipp_dfifo_wten; reg ipp_dfifo_wten_2nd; reg ipp_dfifo_wten_pkt; wire ipp_dfifo_full; reg wt_dfifo_1st_wd, wt_dfifo_1st_wd_d, wt_dfifo_1st_wd_d2; reg [11:0] addr_status; wire ipp_dmc_dat_ack, ipp_dmc_dat_ack_0, ipp_dmc_dat_ack_1, ipp_dmc_dat_ack_2; wire ipp_dmc_ful_pkt, ipp_dmc_ful_pkt_1, ipp_dmc_ful_pkt_2, n_ipp_dmc_ful_pkt_2; wire ipp_dmc_dat_emp_0; wire ipp_full_cksum; reg ipp_start_tcp; wire ipp_sum_info_vld; wire req_rd_dfifo_eop; wire req_rd_dfifo_sop; wire [1:0] ipp_la2_opti = cur_pkt_ffl_sum_info[1:0]; wire [1:0] ipp_la3_vers = cur_pkt_ffl_sum_info[3:2]; wire [3:0] ip4_hdr_leng = cur_pkt_ffl_sum_info[7:4]; wire [1:0] ipp_la4_prot = cur_pkt_ffl_sum_info[9:8]; reg clr_ipp_unload; wire n_ipp_unload_idle; wire fet_pio_tcp_ena; reg dfifo_miss_eop, n_dfifo_miss_eop; reg dfifo_miss_sop, n_dfifo_miss_sop; reg [4:0] c_unload_st; reg [4:0] n_unload_st; reg ipp_ffl_dvalid_n_d; wire start_unload_n = !ipp_ffl_dvalid_n && ipp_ffl_dvalid_n_d; reg start_unload; reg ipp_cksum_done_r; wire n_ipp_cksum_done; wire ipp_cksum_done; reg lod_hfifo_base_rptr; wire [6:0] n_hfifo_dat_rptr; reg [6:0] hfifo_dat_rptr; wire [11:0] n_addr_status; reg lod_dfifo_base_wptr; reg inc_ipp_dfifo_wptr; reg [10:0] ipp_dfifo_wptr_r; wire [10:0] n_addr_wt_pkt, n_addr_packet; reg [10:0] addr_wt_pkt, addr_packet; wire ipp_dfifo_rden; wire [10:0] n_ipp_dfifo_rptr; // addr[9:0] of 16k-byte data, 1k entries, + 1_wrap reg [10:0] ipp_dfifo_rptr; // addr[9:0] of 16k-byte data, 1k entries, + 1_wrap wire [10:0] dfifo_free_space; wire ipp_dfifo_amsful; wire ipp_dfifo_empty; wire n_ipp_dmc_dat_ack; wire ipp_dfifo_dout_eop = ipp_dfifo_dout_tag[1]; wire ipp_dfifo_dout_sop = ipp_dfifo_dout_tag[0]; reg ipp_dfifo_dout_eop_d; wire req_rd_dfifo_eop_d1, req_rd_dfifo_eop_d2; wire req_rd_dfifo_eops; reg [8:0] n_dfifo_pkt_count; // 1k entries, up to 16k-bytes reg [8:0] dfifo_pkt_count; // 1k entries, up to 16k-bytes wire n_ipp_dmc_ful_pkt; reg n_clr_ipp_unload; wire req_rd_dfifo_sop_d; wire req_rd_dfifo_sop_rise = req_rd_dfifo_sop && !req_rd_dfifo_sop_d; wire req_rd_dfifo_sop_rise_d; reg n_fet_pio_tcp_ena; wire no_cksum; wire ecc_err_force, ecc_err_force_d; wire [1:0] hfifo_dat_tag_rd; wire [1:0] n_hfifo_dat_tag_rd; reg [1:0] hfifo_dat_tag_rd_d; reg n_bad_tag_mac_sta, bad_tag_mac_sta; reg [1:0] c_dfifo_tag_st, n_dfifo_tag_st; // ============================================================================= /* These checkers check for the transition of the state variable. */ /* c_unload_st can transition from `IPP_UNLOAD_IDLE to `IPP_DFIFO_XFR_1ST */ /* 0in state_transition -var c_unload_st -val `IPP_UNLOAD_IDLE -next `IPP_DFIFO_XFR_1ST */ /* c_unload_st can transition from `IPP_DFIFO_XFR_1ST to `IPP_DFIFO_XFR_DAT */ /* 0in state_transition -var c_unload_st -val `IPP_DFIFO_XFR_1ST -next `IPP_DFIFO_XFR_DAT */ /* c_unload_st can transition from `IPP_DFIFO_XFR_DAT to `IPP_BKWT_1ST_WORD, \ `IPP_WAIT_HFIFO_STA, \ `IPP_GET_MAC_STAT, \ `IPP_WAIT_HFIFO_DAT */ /* 0in state_transition -var c_unload_st -val `IPP_DFIFO_XFR_DAT -next `IPP_BKWT_1ST_WORD `IPP_WAIT_HFIFO_STA `IPP_GET_MAC_STAT `IPP_WAIT_HFIFO_DAT */ /* c_unload_st can transition from `IPP_GET_MAC_STAT to `IPP_BKWT_1ST_WORD, \ `IPP_DFIFO_XFR_ERR */ /* 0in state_transition -var c_unload_st -val `IPP_GET_MAC_STAT -next `IPP_BKWT_1ST_WORD `IPP_DFIFO_XFR_ERR */ // geo: /* c_unload_st can transition from `IPP_WAIT_CKSUM_DON to `IPP_BKWT_1ST_WORD */ // geo: /* 0in state_transition -var c_unload_st -val `IPP_WAIT_CKSUM_DON -next `IPP_BKWT_1ST_WORD */ /* c_unload_st can transition from `IPP_BKWT_1ST_WORD to `IPP_UNLOAD_IDLE */ /* 0in state_transition -var c_unload_st -val `IPP_BKWT_1ST_WORD -next `IPP_UNLOAD_IDLE -match_by_cycle */ /* c_unload_st can transition from `IPP_WAIT_HFIFO_STA to `IPP_GET_MAC_STAT */ /* 0in state_transition -var c_unload_st -val `IPP_WAIT_HFIFO_STA -next `IPP_GET_MAC_STAT */ /* c_unload_st can transition from `IPP_WAIT_HFIFO_DAT to `IPP_DFIFO_XFR_DAT */ /* 0in state_transition -var c_unload_st -val `IPP_WAIT_HFIFO_DAT -next `IPP_DFIFO_XFR_DAT */ // ----------------------------------------------------------------------------- always @(start_unload or ipp_dfifo_full or ipp_hfifo_dat_empty or inc_hfifo_dat_rptr_d or ipp_hfifo_dat_tag_rd or pio_cksum_ena or fet_pio_tcp_ena or ipp_la3_vers or ipp_la4_prot or ipp_cksum_done or c_unload_st ) begin lod_hfifo_base_rptr = 1'h0; inc_hfifo_dat_rptr = 1'h0; lod_dfifo_base_wptr = 1'h0; ipp_dfifo_wten_2nd = 1'h0; ipp_dfifo_wten_pkt = 1'h0; inc_ipp_dfifo_wptr = 1'h0; ipp_start_tcp = 1'h0; wt_dfifo_1st_wd = 1'h0; n_clr_ipp_unload = 1'h0; n_bad_tag_mac_sta = 1'h0; n_unload_st = 5'h0; n_fet_pio_tcp_ena = fet_pio_tcp_ena; case (c_unload_st) //synopsys parallel_case /* 0in < case -default */ (`IPP_UNLOAD_IDLE): begin if (start_unload) begin n_fet_pio_tcp_ena = pio_cksum_ena; lod_hfifo_base_rptr = 1'h1; inc_hfifo_dat_rptr = 1'h1; lod_dfifo_base_wptr = 1'h1; n_unload_st = `IPP_DFIFO_XFR_1ST; end else begin n_fet_pio_tcp_ena = 1'h0; n_unload_st = c_unload_st[4:0]; end end (`IPP_DFIFO_XFR_1ST): if (ipp_dfifo_full) begin ipp_dfifo_wten_2nd = inc_hfifo_dat_rptr_d; ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; ipp_start_tcp = ((ipp_la4_prot==2'h2) || (ipp_la4_prot==2'h1)) && ((ipp_la3_vers==2'h1) || (ipp_la3_vers==2'h2)) && fet_pio_tcp_ena; n_unload_st = c_unload_st[4:0]; end else begin inc_hfifo_dat_rptr = 1'h1; ipp_dfifo_wten_2nd = inc_hfifo_dat_rptr_d; ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; inc_ipp_dfifo_wptr = 1'h1; ipp_start_tcp = ((ipp_la4_prot==2'h2) || (ipp_la4_prot==2'h1)) && ((ipp_la3_vers==2'h1) || (ipp_la3_vers==2'h2)) && fet_pio_tcp_ena; n_unload_st = `IPP_DFIFO_XFR_DAT; end (`IPP_DFIFO_XFR_DAT): if (ipp_dfifo_full) begin ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; n_unload_st = c_unload_st[4:0]; end else begin casez (ipp_hfifo_dat_tag_rd) //synopsys parallel_case /* 0in < case -default */ (2'b?1): begin ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; inc_ipp_dfifo_wptr = 1'h1; n_unload_st = `IPP_BKWT_1ST_WORD; end (2'b10): if (ipp_hfifo_dat_empty) begin ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; n_unload_st = `IPP_WAIT_HFIFO_STA; end else begin inc_hfifo_dat_rptr = 1'h1; ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; inc_ipp_dfifo_wptr = 1'h1; n_unload_st = `IPP_GET_MAC_STAT; end // (2'b01): begin // n_unload_st = `IPP_DFIFO_XFR_ERR; // n_bad_tag_xfr_dat = 1'h1; // end (2'b00): if (ipp_hfifo_dat_empty) begin ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; n_unload_st = `IPP_WAIT_HFIFO_DAT; end else begin inc_hfifo_dat_rptr = 1'h1; ipp_dfifo_wten_pkt = inc_hfifo_dat_rptr_d; inc_ipp_dfifo_wptr = 1'h1; n_unload_st = c_unload_st[4:0]; end default: begin n_unload_st = `IPP_UNLOAD_IDLE; end endcase end (`IPP_GET_MAC_STAT): if (ipp_hfifo_dat_tag_rd[0]) begin n_unload_st = `IPP_BKWT_1ST_WORD; end else if (ipp_hfifo_dat_empty) begin n_unload_st = c_unload_st[4:0]; // geo: careful, rd_ptr increase?, can it happen? end else begin n_unload_st = `IPP_DFIFO_XFR_ERR; n_bad_tag_mac_sta = 1'h1; end //geo (`IPP_WAIT_CKSUM_DON): //geo if (!ipp_dfifo_full && ipp_cksum_done) //geo begin //geo n_wt_dfifo_1st_wd = 1'h1; //geo n_unload_st = `IPP_BKWT_1ST_WORD; //geo end //geo else //geo begin //geo n_unload_st = c_unload_st[4:0]; //geo end (`IPP_BKWT_1ST_WORD): if (!ipp_dfifo_full && ipp_cksum_done) begin wt_dfifo_1st_wd = 1'h1; ipp_dfifo_wten_pkt = 1'h1; n_clr_ipp_unload = 1'h1; n_unload_st = `IPP_UNLOAD_IDLE; end else begin n_unload_st = c_unload_st[4:0]; end (`IPP_WAIT_HFIFO_STA): if (ipp_hfifo_dat_empty) begin n_unload_st = c_unload_st[4:0]; end else begin inc_hfifo_dat_rptr = 1'h1; inc_ipp_dfifo_wptr = 1'h1; n_unload_st = `IPP_GET_MAC_STAT; end (`IPP_WAIT_HFIFO_DAT): if (ipp_hfifo_dat_empty) begin n_unload_st = c_unload_st[4:0]; end else begin inc_hfifo_dat_rptr = 1'h1; inc_ipp_dfifo_wptr = 1'h1; n_unload_st = `IPP_DFIFO_XFR_DAT; end (`IPP_DFIFO_XFR_ERR): begin // inc_ipp_dfifo_wptr = 1'h1; // geo: how to handle it // n_unload_st = `IPP_UNLOAD_IDLE; n_unload_st = c_unload_st[4:0]; // synopsys translate_off $display ("Warning @sim_time=%d, data_fifo missed mac_status_tag bad_tag_mac_sta=%h, hang in DFIFO_XFR_ERR!\n", $stime, bad_tag_mac_sta); // synopsys translate_on end default: begin n_unload_st = `IPP_UNLOAD_IDLE; end endcase end // ============================================================================= always @(req_rd_dfifo_sop or req_rd_dfifo_eops or c_dfifo_tag_st ) begin n_dfifo_miss_eop = 1'h0; n_dfifo_miss_sop = 1'h0; n_dfifo_tag_st = 2'h0; case (c_dfifo_tag_st) //synopsys parallel_case /* 0in < case -default */ (`IPP_DFIFO_TAG_IDLE): if (req_rd_dfifo_sop) begin n_dfifo_tag_st = `IPP_DFIFO_TAG_WAIT_EOP; end else begin n_dfifo_tag_st = c_dfifo_tag_st[1:0]; end (`IPP_DFIFO_TAG_WAIT_EOP): if (req_rd_dfifo_eops) begin n_dfifo_tag_st = `IPP_DFIFO_TAG_WAIT_SOP; end else if (req_rd_dfifo_sop) begin n_dfifo_miss_eop = 1'h1; n_dfifo_tag_st = `IPP_DFIFO_TAG_IDLE; end else begin n_dfifo_tag_st = c_dfifo_tag_st[1:0]; end (`IPP_DFIFO_TAG_WAIT_SOP): if (req_rd_dfifo_sop) begin n_dfifo_tag_st = `IPP_DFIFO_TAG_WAIT_EOP; end else if (req_rd_dfifo_eops) begin n_dfifo_miss_sop = 1'h1; n_dfifo_tag_st = `IPP_DFIFO_TAG_IDLE; end else begin n_dfifo_tag_st = c_dfifo_tag_st[1:0]; end default: begin n_dfifo_tag_st = `IPP_DFIFO_TAG_IDLE; end endcase end // ============================================================================= assign n_ipp_unload_idle = (n_unload_st[4:0]==`IPP_UNLOAD_IDLE); // ============================================================================= assign n_hfifo_dat_rptr = ippfifo_rd_wr_ptr_bypass ? (ippfifo_rd_ptr_pio_wr_en ? ipp_pio_wdata[6:0] : hfifo_dat_rptr[6:0]) : (inc_hfifo_dat_rptr ? ipp_hfifo_dat_rptr[6:0] + 7'h1 : ipp_hfifo_dat_rptr[6:0]); assign ipp_hfifo_dat_rptr = lod_hfifo_base_rptr ? cur_pkt_hdr_base_ptr[6:0] : hfifo_dat_rptr[6:0]; assign hfifo_dat_tag_rd = {2{inc_hfifo_dat_rptr_d}} & ipp_hfifo_dat_tag[1:0]; assign n_hfifo_dat_tag_rd = {2{ipp_dfifo_full}} & (hfifo_dat_tag_rd[1:0] | hfifo_dat_tag_rd_d[1:0]); assign ipp_hfifo_dat_tag_rd = hfifo_dat_tag_rd[1:0] | hfifo_dat_tag_rd_d[1:0]; // ============================================================================= assign n_addr_wt_pkt = lod_dfifo_base_wptr ? addr_packet[10:0] : inc_ipp_dfifo_wptr ? (addr_wt_pkt[10:0] + 11'h1) : addr_wt_pkt[10:0]; assign n_addr_packet = wt_dfifo_1st_wd ? (addr_wt_pkt[10:0] + 11'h1) : addr_packet[10:0]; assign n_addr_status = wt_dfifo_1st_wd ? ({1'b0,addr_wt_pkt[10:0]}) : addr_status[11:0]; assign ipp_dfifo_wptr = datfifo_pio_wr_ena ? (dfifo_wt_ptr_pio_wr_en ? ipp_pio_wdata[10:0] : ipp_dfifo_wptr_r[10:0]) : wt_dfifo_1st_wd ? addr_status[10:0] : (addr_wt_pkt[10:0]); assign n_ipp_dfifo_rptr = datfifo_pio_wr_ena ? (dfifo_rd_ptr_pio_wr_en ? (ipp_pio_wdata[10:0]) : ipp_dfifo_rptr[10:0]) : n_ipp_dmc_dat_ack ? (ipp_dfifo_rptr[10:0] + 11'h1) : ipp_dfifo_rptr[10:0]; assign ipp_dfifo_rden = ipp_enable || datfifo_pio_wr_ena || reset; //assign ipp_dfifo_rden = 1'h1; assign ipp_dfifo_wten = datfifo_pio_wr_ena ? dfifo_wt_data_reg_wr_en_pls : ipp_dfifo_wten_pkt; assign dfifo_free_space = (addr_wt_pkt[10] == ipp_dfifo_rptr[10]) ? 11'd1024 - {1'h0,(addr_wt_pkt[9:0] - ipp_dfifo_rptr[9:0])} : {1'h0,(ipp_dfifo_rptr[9:0] - addr_wt_pkt[9:0])}; assign ipp_dfifo_amsful = dfifo_free_space <= 11'h1; assign ipp_dfifo_full = ipp_dfifo_amsful; //assign ipp_dfifo_full = (addr_wt_pkt[10] == !ipp_dfifo_rptr[10]) && // 1k_ent, // (addr_wt_pkt[9:0] == ipp_dfifo_rptr[9:0]);// spare? assign ipp_dfifo_empty = (addr_wt_pkt[10:0] == ipp_dfifo_rptr[10:0]); assign n_ipp_dmc_dat_ack = dmc_ipp_dat_req && !ipp_dfifo_empty && (!(req_rd_dfifo_eop || req_rd_dfifo_eop_d1 || req_rd_dfifo_eop_d2)); assign req_rd_dfifo_eop = ipp_dmc_dat_ack_0 && !ipp_dmc_dat_emp_0 && ipp_dfifo_dout_eop && !ipp_dfifo_dout_eop_d; assign req_rd_dfifo_eops = ipp_dmc_dat_ack_0 && !ipp_dmc_dat_emp_0 && ipp_dfifo_dout_eop; assign req_rd_dfifo_sop = ipp_dmc_dat_ack_0 && !ipp_dmc_dat_emp_0 && ipp_dfifo_dout_sop; assign ipp_dmc_dat_ack = ipp_dmc_dat_ack_2; assign ipp_dmc_ful_pkt = ipp_dmc_ful_pkt_2; // ============================================================================= always @(req_rd_dfifo_sop_rise_d or wt_dfifo_1st_wd_d2 or dfifo_pkt_count ) begin case ({req_rd_dfifo_sop_rise_d,wt_dfifo_1st_wd_d2}) //synopsys parallel_case /* 0in < case -default */ (2'b11): n_dfifo_pkt_count = dfifo_pkt_count[8:0]; (2'b10): n_dfifo_pkt_count = dfifo_pkt_count[8:0] - 9'h1; (2'b01): n_dfifo_pkt_count = dfifo_pkt_count[8:0] + 9'h1; (2'b00): n_dfifo_pkt_count = dfifo_pkt_count[8:0]; default: n_dfifo_pkt_count = dfifo_pkt_count[8:0]; endcase end assign ecc_err_force = ipp_dmc_dat_ack_1 && ipp_dmc_dat_err1 || ecc_err_force_d; assign n_ipp_dmc_ful_pkt = (n_dfifo_pkt_count[7:0]!=8'h0) && !n_dfifo_pkt_count[8]; assign n_ipp_dmc_ful_pkt_2 = ipp_dmc_ful_pkt_1 && !ecc_err_force; // ============================================================================= assign ipp_sum_info_vld = inc_hfifo_dat_rptr_d && ((ipp_la3_vers==2'h1) || (ipp_la3_vers==2'h2)); assign ipp_full_cksum = ((ipp_la3_vers==2'h1) || (ipp_la3_vers==2'h2)) && ((ipp_la4_prot==2'h1) || (ipp_la4_prot==2'h2)) || pio_full_cksum; assign no_cksum = (ipp_la3_vers==2'h0) || (ipp_la3_vers==2'h3) || ((ipp_la3_vers==2'h1) || (ipp_la3_vers==2'h2)) && !fet_pio_tcp_ena || (ipp_la4_prot==2'h0) || (ipp_la4_prot==2'h3); assign n_ipp_cksum_done = (c_unload_st!=`IPP_UNLOAD_IDLE) && (ipp_cksum_done || no_cksum); assign ipp_cksum_done = sum_prt_valid || ipp_cksum_done_r; // ============================================================================= always @ (posedge clk) if (reset) begin ipp_ffl_dvalid_n_d <= #1 1'h0; start_unload <= #1 1'h0; inc_hfifo_dat_rptr_d <= #1 1'h0; ipp_cksum_done_r <= #1 1'h0; hfifo_dat_rptr <= #1 7'h0; wt_dfifo_1st_wd_d <= #1 1'h0; wt_dfifo_1st_wd_d2 <= #1 1'h0; ipp_dfifo_wptr_r <= #1 11'h0; addr_wt_pkt <= #1 11'h1; addr_status <= #1 12'h0; addr_packet <= #1 11'h1; ipp_dfifo_dout_eop_d <= #1 1'h0; ipp_dfifo_rptr <= #1 11'h0; dfifo_pkt_count <= #1 9'h0; dfifo_miss_eop <= #1 1'h0; dfifo_miss_sop <= #1 1'h0; bad_tag_mac_sta <= #1 1'h0; hfifo_dat_tag_rd_d <= #1 2'h0; clr_ipp_unload <= #1 1'h0; c_unload_st <= #1 5'h0; c_dfifo_tag_st <= #1 2'h0; end else begin ipp_ffl_dvalid_n_d <= #1 ipp_ffl_dvalid_n; start_unload <= #1 start_unload_n; inc_hfifo_dat_rptr_d <= #1 inc_hfifo_dat_rptr; ipp_cksum_done_r <= #1 n_ipp_cksum_done; hfifo_dat_rptr <= #1 n_hfifo_dat_rptr[6:0]; wt_dfifo_1st_wd_d <= #1 wt_dfifo_1st_wd; wt_dfifo_1st_wd_d2 <= #1 wt_dfifo_1st_wd_d; ipp_dfifo_wptr_r <= #1 ipp_dfifo_wptr[10:0]; addr_wt_pkt <= #1 n_addr_wt_pkt[10:0]; addr_status <= #1 n_addr_status[11:0]; addr_packet <= #1 n_addr_packet[10:0]; ipp_dfifo_dout_eop_d <= #1 ipp_dfifo_dout_eop; // geo: correct?; ipp_dfifo_rptr <= #1 n_ipp_dfifo_rptr[10:0]; dfifo_pkt_count <= #1 n_dfifo_pkt_count[8:0]; dfifo_miss_eop <= #1 (n_dfifo_miss_eop || bad_tag_mac_sta); dfifo_miss_sop <= #1 (n_dfifo_miss_sop || bad_tag_mac_sta); bad_tag_mac_sta <= #1 n_bad_tag_mac_sta; hfifo_dat_tag_rd_d <= #1 n_hfifo_dat_tag_rd[1:0]; clr_ipp_unload <= #1 n_clr_ipp_unload; c_unload_st <= #1 n_unload_st[4:0]; c_dfifo_tag_st <= #1 n_dfifo_tag_st[1:0]; end ipp_reg_r_1 reg_r_1_ack0 (.di(n_ipp_dmc_dat_ack), .rs(reset), .ck(clk), .qo(ipp_dmc_dat_ack_0)); ipp_reg_r_1 reg_r_1_ack1 (.di(ipp_dmc_dat_ack_0), .rs(reset), .ck(clk), .qo(ipp_dmc_dat_ack_1)); ipp_reg_r_1 reg_r_1_ack2 (.di(ipp_dmc_dat_ack_1), .rs(reset), .ck(clk), .qo(ipp_dmc_dat_ack_2)); ipp_reg_r_1 reg_r_1_ful1 (.di(n_ipp_dmc_ful_pkt), .rs(reset), .ck(clk), .qo(ipp_dmc_ful_pkt_1)); ipp_reg_r_1 reg_r_1_ful2 (.di(n_ipp_dmc_ful_pkt_2), .rs(reset), .ck(clk), .qo(ipp_dmc_ful_pkt_2)); ipp_reg_r_1 reg_r_1_emp0 (.di(ipp_dfifo_empty), .rs(reset), .ck(clk), .qo(ipp_dmc_dat_emp_0)); ipp_reg_r_1 reg_r_1_sop (.di(req_rd_dfifo_sop), .rs(reset), .ck(clk), .qo(req_rd_dfifo_sop_d)); ipp_reg_r_1 reg_r_1_eop_d1 (.di(req_rd_dfifo_eop), .rs(reset), .ck(clk), .qo(req_rd_dfifo_eop_d1)); ipp_reg_r_1 reg_r_1_eop_d2 (.di(req_rd_dfifo_eop_d1), .rs(reset), .ck(clk), .qo(req_rd_dfifo_eop_d2)); ipp_reg_r_1 reg_r_1_sop_d (.di(req_rd_dfifo_sop_rise), .rs(reset), .ck(clk), .qo(req_rd_dfifo_sop_rise_d)); ipp_reg_r_1 reg_r_1_sum_en (.di(n_fet_pio_tcp_ena), .rs(reset), .ck(clk), .qo(fet_pio_tcp_ena)); ipp_reg_r_1 reg_r_1_ecc_fu (.di(ecc_err_force), .rs(reset), .ck(clk), .qo(ecc_err_force_d)); `ifdef NEPTUNE wire [3:0] do_nad; wire [3:0] do_nor; wire [3:0] do_inv; wire [3:0] do_mux; wire [3:0] do_q; wire so; nep_spare_ipp spare_ipp_0 ( .di_nd3 ({1'h1, 1'h1, do_q[3]}), .di_nd2 ({1'h1, 1'h1, do_q[2]}), .di_nd1 ({1'h1, 1'h1, do_q[1]}), .di_nd0 ({1'h1, 1'h1, do_q[0]}), .di_nr3 ({1'h0, 1'h0}), .di_nr2 ({1'h0, 1'h0}), .di_nr1 ({1'h0, 1'h0}), .di_nr0 ({1'h0, 1'h0}), .di_inv (do_nad[3:0]), .di_mx3 ({1'h0, 1'h0}), .di_mx2 ({1'h0, 1'h0}), .di_mx1 ({1'h0, 1'h0}), .di_mx0 ({1'h0, 1'h0}), .mx_sel (do_nor[3:0]), .di_reg (do_inv[3:0]), .wt_ena (do_mux[3:0]), .rst ({reset,reset,reset,reset}), .si (1'h0), .se (1'h0), .clk (clk), .do_nad (do_nad[3:0]), .do_nor (do_nor[3:0]), .do_inv (do_inv[3:0]), .do_mux (do_mux[3:0]), .do_q (do_q[3:0]), .so (so) ); `endif endmodule //