summaryrefslogtreecommitdiffhomepage
path: root/manufacturer/lattice/ecp5um/source/top.v
diff options
context:
space:
mode:
Diffstat (limited to 'manufacturer/lattice/ecp5um/source/top.v')
-rw-r--r--manufacturer/lattice/ecp5um/source/top.v2432
1 files changed, 2432 insertions, 0 deletions
diff --git a/manufacturer/lattice/ecp5um/source/top.v b/manufacturer/lattice/ecp5um/source/top.v
new file mode 100644
index 0000000..4944bae
--- /dev/null
+++ b/manufacturer/lattice/ecp5um/source/top.v
@@ -0,0 +1,2432 @@
+/*
+ * top.v
+ *
+ * Copyright (C) 2018, 2019, 2020 Mind Chasers Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Private Island Top for Darsena / ECP5UM
+ *
+ */
+
+module top(
+ input rstn,
+
+ // REFCLK
+ input refclkp_d0, refclkn_d0,
+ input refclkp_d1, refclkn_d1,
+
+ // SGMII0
+ input sgmii0_hdinp,
+ input sgmii0_hdinn,
+ output sgmii0_hdoutp,
+ output sgmii0_hdoutn,
+
+ // SGMII1
+ input sgmii1_hdinp,
+ input sgmii1_hdinn,
+ output sgmii1_hdoutp,
+ output sgmii1_hdoutn,
+
+ // SGMII2
+ input sgmii2_hdinp,
+ input sgmii2_hdinn,
+ output sgmii2_hdoutp,
+ output sgmii2_hdoutn,
+
+ // SGMII3
+ input sgmii3_hdinp,
+ input sgmii3_hdinn,
+ output sgmii3_hdoutp,
+ output sgmii3_hdoutn,
+
+ // PHYs
+ output phy_mdc,
+
+ output phy0_resetn,
+ inout phy0_mdio,
+ input [1:0] phy0_gpio,
+ input phy0_intn,
+
+ output phy1_resetn,
+ inout phy1_mdio,
+ input [1:0] phy1_gpio,
+ input phy1_intn,
+
+`ifdef SHIELD_GIGE_SMA
+ output phy2_resetn,
+ output phy2_mdc,
+ inout phy2_mdio,
+`elsif SHIELD_SFP_SMA
+ input sfp_tx_fault, // high indicates a laser fault of some kind.
+ output sfp_tx_disable, // high disables the transmitter
+ input sfp_pres_n, // (mod-def 0): grounded by the module to indicate that the module is present)
+ inout sfp_i2c_sda, // (mod-def 2)
+ output sfp_i2c_scl, // (mod-def 1)
+ input sfp_los, // Low indicates normal operation
+ output sfp_rate_select, // high for full bandwidth
+`endif
+
+ // Microcontroller SPI and bit banging
+ input spi_cs,
+ input spi_clk,
+ output spi_miso,
+ input spi_mosi,
+ output fpga_int,
+ input fpga_gpio,
+
+ // I2C
+ inout i2c_scl,
+ inout i2c_sda,
+
+ // K02 UART
+ input uart_txd,
+ output uart_rxd,
+
+`ifdef DARSENA_V02
+ output fpga_jtag_e,
+ // FTDI UART signals muxed with JTAG
+ input ftdi_tck_txd,
+ output ftdi_tdi_rxd,
+`endif
+
+ output [2:0] led,
+
+ output ard_sda,
+ output ard_scl,
+
+`ifdef SHIELD_SFP_SMA
+ output sfp_led1, // TXD3
+ output sfp_led2, // RXD3
+ output sfp_led3, // TXD2
+ output sfp_led4, // RXD2
+ output sfp_led5, // TXD1
+ output sfp_led6, // RXD1
+`endif
+
+ input pe0, //
+ output pe1, //
+ output pe3,
+ output pe4,
+ output pe5,
+ output pg5,
+ input ph3, // UART RX for SFP Testing
+ output ph4, // UART TX for SFP Testing
+ inout [9:0] pa
+);
+
+`include "directives.v"
+`include "sgmii_params.v"
+`include "ethernet_params.v"
+
+`ifdef DARSENA_V01
+ wire fb_clk;
+ wire fb_ale;
+ wire fb_oen;
+ wire fb_rwn;
+ wire fb_csn;
+ wire fb_cregs_sel;
+ wire [9:0] fb_ad;
+`endif
+
+/* PARAMS */
+localparam MDIO_ROM_ADDR_SZ = 7;
+
+/* nets and variables */
+
+// clocks
+wire clk_slow, clk_1_25, clk_10, clk_20;
+wire clk_100;
+wire refclko;
+
+// pulses
+wire pulse_10ms, pulse_1_6ms;
+
+// misc resets
+wire [3:0] phy_resetn; // bit[0] will get pruned out for now
+wire [3:0] mac_reset;
+
+// dcu resets
+wire [1:0] pcs_rst_dual;
+wire [1:0] serdes_rst_dual;
+wire [1:0] tx_serdes_rst;
+
+// channel resets
+wire [3:0] rx_pcs_rst;
+wire [3:0] rx_serdes_rst;
+wire [3:0] tx_pcs_rst;
+
+// MDIO controller and driver
+wire mdio_cont_work_start, mdio_cont_work_run;
+wire mdio_cont_work_done;
+wire [MDIO_ROM_ADDR_SZ-1:0] mdio_routine_addr;
+wire [1:0] mdio_mux_sel;
+wire mdio_done, mdo_oe;
+wire mdo;
+reg mdi;
+wire [15:0] mdio_wd;
+wire [15:0] mdio_rd;
+wire [4:0] mdio_reg_addr;
+wire mdio_ld, mdio_run;
+wire mdio_rwn;
+wire bin_to_ascii_run;
+
+// MDIO Data block
+wire [MDIO_ROM_ADDR_SZ-1:0] rom_a;
+wire [7:0] rom_d;
+wire [4:0] mdio_reg_addr_set;
+wire [7:0] mdio_w_data_h_set, mdio_w_data_l_set;
+wire [4:0] mdio_page_set;
+
+// I2C
+wire sda_oe, scl_oe, sda_o, scl_o;
+wire i2c_fifo_priority;
+
+// UART
+wire uart_rx_done;
+wire read_fifo_we;
+wire [8:0] fifo_r_d;
+wire [6:0] d_uart_rx;
+
+// bin to ASCII
+wire [15:0] bin_to_ascii_d_in;
+wire [6:0] cont_rd;
+
+// PCS, mac
+wire pcs_pclk;
+wire [1:0] pll_lol;
+wire sgmii_rx_k[0:3], sgmii_tx_k[0:3];
+wire sgmii_tx_disp_correct[0:3];
+wire sgmii_rx_cv_err[0:3], sgmii_rx_disp_err[0:3], sgmii_rx_cdr_lol[0:3];
+wire sgmii_lsm_status[0:3], sgmii_rx_los_low[0:3];
+wire [7:0] rx_data0, rx_data1, rx_data2, rx_data3;
+wire [7:0] tx_data0, tx_data1, tx_data2, tx_data3;
+wire [6:0] read_fifo_d_i;
+wire [3:0] rx_sample;
+wire [3:0] pcs_error;
+
+// ipv4
+wire [3:0] ipv4_pkt_start;
+wire [3:0] ipv4_pkt_complete;
+
+reg cont_fifo_re_m1, cont_fifo_re_m2;
+wire cont_fifo_empty;
+wire i2c_fifo_re, uart_fifo_re;
+wire i2c_cont_we, i2c_cont_done;
+wire i_cont_fifo_re;
+wire bin_to_ascii_we, mdio_rd_we, cont_rd_we;
+wire [3:0] phy_up;
+
+// Interrupts
+wire [6:0] int_do;
+wire [3:0] mac_int;
+wire int_sel;
+
+// Common Internal Memory Bus
+wire[10:0] mem_addr;
+wire [8:0] mem_d_i;
+reg [8:0] mem_d_o;
+wire mem_we, mem_oe;
+wire [4:0] mem_do_mux_sel;
+
+// DPRAM
+wire [10:0] param_phy0_addr, param_phy1_addr, param_phy2_addr, param_phy3_addr;
+wire [8:0] param_phy0_din, param_phy1_din, param_phy2_din, param_phy3_din;
+wire [8:0] param_phy0_dout, param_phy1_dout, param_phy2_dout, param_phy3_dout;
+wire param_phy0_ce, param_phy1_ce, param_phy2_ce, param_phy3_ce;
+wire param_phy0_we, param_phy1_we, param_phy2_we, param_phy3_we;
+wire [8:0] param_ram_0_do, param_ram_1_do, param_ram_2_do, param_ram_3_do;
+
+wire [7:0] i2c_d_o;
+wire [8:0] micro_fifo_do;
+wire sys_mem_rx_ce, sys_mem_tx_ce, sys_mem_ptrs_sel;
+wire [3:0] param_sel;
+
+// drop_fifos and filter
+wire rx0_k_m1, rx0_k_m2, rx0_k_m3, rx0_k_m4;
+wire [7:0] rx0_data_m1, rx0_data_m2, rx0_data_m3, rx0_data_m4;
+
+wire rx1_k_m1, rx1_k_m2, rx1_k_m3, rx1_k_m4;
+wire [7:0] rx1_data_m1, rx1_data_m2, rx1_data_m3, rx1_data_m4;
+
+wire rx2_k_m1, rx2_k_m2, rx2_k_m3, rx2_k_m4;
+wire [7:0] rx2_data_m1, rx2_data_m2, rx2_data_m3, rx2_data_m4;
+
+wire rx3_k_m1, rx3_k_m2, rx3_k_m3, rx3_k_m4;
+wire [7:0] rx3_data_m1, rx3_data_m2, rx3_data_m3, rx3_data_m4;
+
+wire [3:0] rx_mac_keep;
+wire [3:0] rx_sc_wr_done;
+
+// drop filter outputs
+wire rx_df_fifo_we_01, rx_df_fifo_we_02, rx_df_fifo_we_03;
+wire rx_df_fifo_we_10, rx_df_fifo_we_12, rx_df_fifo_we_13;
+wire rx_df_fifo_we_20, rx_df_fifo_we_21, rx_df_fifo_we_23, rx_df_fifo_we_2u;
+wire rx_df_fifo_we_30, rx_df_fifo_we_31, rx_df_fifo_we_32;
+wire rx_df_fifo_we_u2;
+
+wire [8:0] rx_df_fifo_d_01, rx_df_fifo_d_02, rx_df_fifo_d_03;
+wire [8:0] rx_df_fifo_d_10, rx_df_fifo_d_12, rx_df_fifo_d_13;
+wire [8:0] rx_df_fifo_d_20, rx_df_fifo_d_21, rx_df_fifo_d_23, rx_df_fifo_d_2u;
+wire [8:0] rx_df_fifo_d_30, rx_df_fifo_d_31, rx_df_fifo_d_32;
+wire [8:0] rx_df_fifo_d_u2;
+
+// pkt filter
+wire [3:0] trigger;
+wire [3:0] rx_enet_bcast;
+wire [3:0] rx_ipv4_arp;
+wire rx_pf_keep_01;
+wire rx_pf_keep_02;
+wire rx_pf_keep_03;
+wire rx_pf_keep_10;
+wire rx_pf_keep_12;
+wire rx_pf_keep_13;
+wire rx_pf_keep_20;
+wire rx_pf_keep_21;
+wire rx_pf_keep_23;
+wire rx_pf_keep_2u;
+wire rx_pf_keep_30;
+wire rx_pf_keep_31;
+wire rx_pf_keep_32;
+wire rx_pf_keep_u2;
+
+// rx_fifos
+wire [3:0] rx_sc_fifo_we;
+wire rx_sw_fifo_re_01, rx_sw_fifo_re_02, rx_sw_fifo_re_03;
+wire rx_sf_fifo_empty_01, rx_sf_fifo_empty_02, rx_sf_fifo_empty_03;
+wire rx_sw_fifo_re_10, rx_sw_fifo_re_12, rx_sw_fifo_re_13;
+wire rx_sf_fifo_empty_10, rx_sf_fifo_empty_12, rx_sf_fifo_empty_13;
+wire rx_sw_fifo_re_20, rx_sw_fifo_re_21, rx_sw_fifo_re_23, rx_sw_fifo_re_2u;
+wire rx_sf_fifo_empty_20, rx_sf_fifo_empty_21, rx_sf_fifo_empty_23, rx_sf_fifo_empty_2u;
+wire rx_sw_fifo_re_30, rx_sw_fifo_re_31, rx_sw_fifo_re_32;
+wire rx_sf_fifo_empty_30, rx_sf_fifo_empty_31, rx_sf_fifo_empty_32;
+wire rx_sw_fifo_re_u2, rx_uc_fifo_empty_u2;
+wire [8:0] rx_sc_fifo_d0, rx_sc_fifo_d1, rx_sc_fifo_d2, rx_sc_fifo_d3;
+wire [8:0] rx_sf_fifo_d_01, rx_sf_fifo_d_02, rx_sf_fifo_d_03;
+wire [8:0] rx_sf_fifo_d_10, rx_sf_fifo_d_12, rx_sf_fifo_d_13;
+wire [8:0] rx_sf_fifo_d_20, rx_sf_fifo_d_21, rx_sf_fifo_d_23, rx_sf_fifo_d_2u;
+wire [8:0] rx_sf_fifo_d_30, rx_sf_fifo_d_31, rx_sf_fifo_d_32;
+wire [8:0] rx_uc_fifo_d_u2;
+wire rx_sf_almost_full_01, rx_sf_almost_full_02, rx_sf_almost_full_03;
+wire rx_sf_almost_full_10, rx_sf_almost_full_12, rx_sf_almost_full_13;
+wire rx_sf_almost_full_20, rx_sf_almost_full_21, rx_sf_almost_full_23;
+
+
+// between switch and mac
+wire [8:0] tx_sw_fifo_d0, tx_sw_fifo_d1, tx_sw_fifo_d2, tx_sw_fifo_d3, tx_sw_fifo_du;
+wire [3:0] tx_sc_fifo_re;
+wire tx_uc_fifo_re;
+wire [3:0] tx_sw_fifo_empty;
+wire tx_sw_fifo_we;
+
+wire [2:0] tx_sw_mode0, tx_sw_mode1, tx_sw_mode2, tx_sw_mode3;
+wire tx_sw_modeu;
+wire [3:0] tx_sc_done;
+
+// 100 Mbit
+wire[3:0] mode_100Mbit;
+
+// Flexbus
+wire fb_ad_oe;
+wire[9:0] fb_ad_o;
+reg[9:0] fb_d;
+
+wire pkt_filter_sel_01, pkt_filter_sel_02, pkt_filter_sel_03;
+wire pkt_filter_sel_10, pkt_filter_sel_12, pkt_filter_sel_13;
+wire pkt_filter_sel_20, pkt_filter_sel_21, pkt_filter_sel_23, pkt_filter_sel_2u;
+wire pkt_filter_sel_u2;
+
+// FCS
+wire [1:0] fcs_addr0, fcs_addr1, fcs_addr2, fcs_addr3;
+wire [7:0] fcs_din0, fcs_din1, fcs_din2, fcs_din3;
+wire [7:0] fcs_dout0, fcs_dout1, fcs_dout2, fcs_dout3;
+wire[3:0] fcs_init, fcs_enable;
+
+// half FIFO / DPRAM interface for uP
+wire hfifo_we, hfifo_re;
+wire [8:0] hfifo_tx_d, hfifo_rx_d;
+wire hfifo_empty;
+wire micro_fifo_int;
+wire tx_uc_block;
+
+// SCI
+wire[1:0] sci_sel_dual;
+wire[3:0] sci_sel_ch;
+wire[7:0] sci_rddata0, sci_rddata1 ;
+wire[1:0] sci_int;
+
+// Metrics
+wire tx_custom, metrics_start;
+wire [8:0] metrics_d;
+
+// Network Debug & Metrics
+reg [3:0] rx_active, tx_active;
+wire [3:0] mac_rx_active;
+wire [3:0] drop_rx0_active, drop_rx1_active, drop_rx2_active, drop_rx3_active;
+wire [3:0] sync_rx0_active, sync_rx1_active, sync_rx2_active, sync_rx3_active;
+wire [3:0] mac_tx_active;
+wire [3:0] rx_sc_error;
+wire [3:0] rx_eop, rx_sop;
+wire [3:0] tx_eop, tx_sop;
+wire [10:0] rx0_byte_cnt, rx1_byte_cnt, rx2_byte_cnt, rx3_byte_cnt;
+wire [10:0] tx0_byte_cnt, tx1_byte_cnt, tx2_byte_cnt, tx3_byte_cnt;
+
+// Debug LEDs
+reg lsm_status, rx_cdr_lol, rx_los_low;
+
+// Misc Debug
+wire ext_sci_int;
+
+/****************************
+ *
+ * Logic Begins Below
+ *
+ ***************************/
+
+/* Lattice requires GSR to be in top-level module and be named GSR_INST */
+GSR GSR_INST(.GSR(rstn));
+PUR PUR_INST(.PUR(1'b1));
+
+assign phy_mdc = clk_10;
+
+assign phy0_resetn = phy_resetn[0];
+assign phy1_resetn = phy_resetn[1];
+
+`ifdef SHIELD_GIGE_SMA
+ assign phy2_resetn = phy_resetn[2];
+ assign phy2_mdc = clk_10;
+`elsif SHIELD_SFP_SMA
+ assign sfp_tx_disable = 1'b0;
+ assign sfp_i2c_scl = 1'b1;
+ assign sfp_rate_select = 1'b1;
+`endif
+
+
+/*
+ * Clocks derived from the internal OSCG
+ */
+clk_gen clk_gen_0(
+ .rstn( rstn ),
+ .clk_10( clk_10 ),
+ .clk_5( ),
+ .clk_2_5( ),
+ .clk_1_25( clk_1_25 ),
+ .clk_slow( clk_slow )
+);
+
+
+/*
+* main controller
+*
+* controls worker blocks
+* interfaces with uC via I2C / UART
+*
+*/
+controller #(.ADDR_SZ( MDIO_ROM_ADDR_SZ ))controller_0
+(
+ .rstn( rstn ),
+ .clk( clk_10 ),
+ .init(1'b1),
+ .pulse_100ms( 1'b0 ),
+ // PCS status lines
+ .pcs_rx_error( pcs_error ),
+ .pll_lol( pll_lol ),
+ // link status
+ .port_up( phy_up ),
+// .sfp_los(sfp_los),
+ // mdio_controller interface
+ .mdio_cont_start(mdio_cont_work_start),
+ .mdio_cont_done(mdio_cont_work_done),
+ .mdio_routine_addr( mdio_routine_addr ),
+ .mdio_run( mdio_run ),
+ // mdio_data params
+ .mdio_page( mdio_page_set ),
+ .mdio_reg_addr( mdio_reg_addr_set ),
+ .mdio_w_data_h( mdio_w_data_h_set ),
+ .mdio_w_data_l( mdio_w_data_l_set ),
+ // bin_to_ascii interface
+ .bin_to_ascii_run( bin_to_ascii_run ),
+ // ext_sys_fifo interface: controller to external I/F FIFO
+ .fifo_mux_sel( read_fifo_mux_sel ),
+ .fifo_we( cont_rd_we ),
+ .read_fifo_d_o( cont_rd ),
+ // i2c interface
+ .i2c_rx_we ( i2c_cont_we ),
+ .i2c_rx_done ( i2c_cont_done ),
+ .i2c_d_in( i2c_d_o ),
+ // reset and config
+ .pcs_rst_dual( pcs_rst_dual ),
+ .serdes_rst_dual( serdes_rst_dual ),
+ .tx_serdes_rst( tx_serdes_rst ),
+ .phy_resetn( phy_resetn ),
+ .mac_reset( mac_reset ),
+ .tx_pcs_rst( tx_pcs_rst ),
+ .rx_serdes_rst( rx_serdes_rst ),
+ .rx_pcs_rst( rx_pcs_rst ),
+ .mdio_mux_sel( mdio_mux_sel ),
+ .i2c_fifo_priority( i2c_fifo_priority ),
+ // TX custom packet
+ .tx_metrics( tx_custom )
+
+);
+
+/*
+ * Controls the routing of data and transmit modes
+ */
+switch switch_0(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // PHY status
+ .phy_up( phy_up ),
+ .mode_100Mbit ( mode_100Mbit ),
+ // FIFO input data from RX FIFOs
+ .rx_d_01( rx_sf_fifo_d_01 ),
+ .rx_d_02( rx_sf_fifo_d_02 ),
+ .rx_d_03( rx_sf_fifo_d_03 ),
+ .rx_d_10( rx_sf_fifo_d_10 ),
+ .rx_d_12( rx_sf_fifo_d_12 ),
+ .rx_d_13( rx_sf_fifo_d_13 ),
+ .rx_d_20( rx_sf_fifo_d_20 ),
+ .rx_d_21( rx_sf_fifo_d_21 ),
+ .rx_d_23( rx_sf_fifo_d_23 ),
+ .rx_d_2u( rx_sf_fifo_d_2u ),
+ .rx_d_30( rx_sf_fifo_d_30 ),
+ .rx_d_31( rx_sf_fifo_d_31 ),
+ .rx_d_32( rx_sf_fifo_d_32 ),
+ .rx_d_u2( rx_uc_fifo_d_u2 ),
+ // RX FIFO read enables
+ .rx_fifo_re_01( rx_sw_fifo_re_01 ),
+ .rx_fifo_re_02( rx_sw_fifo_re_02 ),
+ .rx_fifo_re_03( rx_sw_fifo_re_03 ),
+ .rx_fifo_re_10( rx_sw_fifo_re_10 ),
+ .rx_fifo_re_12( rx_sw_fifo_re_12 ),
+ .rx_fifo_re_13( rx_sw_fifo_re_13 ),
+ .rx_fifo_re_20( rx_sw_fifo_re_20 ),
+ .rx_fifo_re_21( rx_sw_fifo_re_21 ),
+ .rx_fifo_re_23( rx_sw_fifo_re_23 ),
+ .rx_fifo_re_2u( rx_sw_fifo_re_2u ),
+ .rx_fifo_re_30( rx_sw_fifo_re_30 ),
+ .rx_fifo_re_31( rx_sw_fifo_re_31 ),
+ .rx_fifo_re_32( rx_sw_fifo_re_32 ),
+ .rx_fifo_re_u2( rx_sw_fifo_re_u2 ),
+ // RX FIFO Empty flags
+ .rx_fifo_empty_01( rx_sf_fifo_empty_01 ),
+ .rx_fifo_empty_02( rx_sf_fifo_empty_02 ),
+ .rx_fifo_empty_03( rx_sf_fifo_empty_03 ),
+ .rx_fifo_empty_10( rx_sf_fifo_empty_10 ),
+ .rx_fifo_empty_12( rx_sf_fifo_empty_12 ),
+ .rx_fifo_empty_13( rx_sf_fifo_empty_13 ),
+ .rx_fifo_empty_20( rx_sf_fifo_empty_20 ),
+ .rx_fifo_empty_21( rx_sf_fifo_empty_21 ),
+ .rx_fifo_empty_23( rx_sf_fifo_empty_23 ),
+ .rx_fifo_empty_2u( rx_sf_fifo_empty_2u ),
+ .rx_fifo_empty_30( rx_sf_fifo_empty_30 ),
+ .rx_fifo_empty_31( rx_sf_fifo_empty_31 ),
+ .rx_fifo_empty_32( rx_sf_fifo_empty_32 ),
+ .rx_fifo_empty_u2( rx_uc_fifo_empty_u2 ),
+ // RX Byte Count
+ .rx_wr_done(rx_sc_wr_done),
+ .rx0_byte_cnt(rx0_byte_cnt),
+ .rx1_byte_cnt(rx1_byte_cnt),
+ .rx2_byte_cnt(rx2_byte_cnt),
+ .rx3_byte_cnt(rx3_byte_cnt),
+ // TX FIFO output from internal muxes
+ .tx_d0( tx_sw_fifo_d0),
+ .tx_d1( tx_sw_fifo_d1 ),
+ .tx_d2( tx_sw_fifo_d2 ),
+ .tx_d3( tx_sw_fifo_d3 ),
+ .tx_du( tx_sw_fifo_du ),
+ // TX FIFO read enable inputs (need to route to RX output FIFOs)
+ .tx_fifo_re( tx_sc_fifo_re ),
+ .tx_fifo_we_u ( tx_sw_fifo_we ),
+ // TX FIFO Empty Flags (need to route to RX output FIFOs)
+ .tx_fifo_empty( tx_sw_fifo_empty ),
+ // TX modes for the PHYs and uc
+ .tx_mode0( tx_sw_mode0 ),
+ .tx_mode1( tx_sw_mode1 ),
+ .tx_mode2( tx_sw_mode2 ),
+ .tx_mode3( tx_sw_mode3 ),
+ .tx_modeu( tx_modeu ),
+ // TX byte cnt
+ .tx0_byte_cnt(tx0_byte_cnt),
+ .tx1_byte_cnt(tx1_byte_cnt),
+ .tx2_byte_cnt(tx2_byte_cnt),
+ .tx3_byte_cnt(tx3_byte_cnt),
+ // TX state machine done flag
+ .tx_f( tx_sc_done ),
+ // TX custom packet
+ .tx_custom ( tx_custom )
+);
+
+
+/*
+ * RX and TX controller logic tied to PCS/SGMII protocol
+ */
+mac mac_0(
+ .rstn( ~mac_reset[0] ),
+ .phy_resetn ( phy_resetn[0] ),
+ .clk( pcs_pclk ),
+ .tap_port ( 1'b0 ),
+ // AN
+ .phy_type(2'b00), // SGMII=0
+ .an_disable( 1'b0 ),
+ .pulse_1_6ms(pulse_1_6ms),
+ .pulse_10ms(pulse_10ms),
+ .fixed_speed(SGMII_SPEED_AN),
+ .an_duplex( ),
+ .mode_100Mbit( mode_100Mbit[0] ),
+ .phy_up( phy_up[0] ),
+ // Switch I/F
+ .tx_mode( tx_sw_mode0 ),
+ .tx_f( tx_sc_done[0] ),
+ // PCS / SERDES health
+ .rx_lsm( sgmii_lsm_status[0] ),
+ .rx_cv_err ( sgmii_rx_cv_err[0] ),
+ .rx_disp_err( sgmii_rx_disp_err[0] ),
+ .rx_cdr_lol( sgmii_rx_cdr_lol[0] ),
+ .rx_los ( sgmii_rx_los_low[0] ),
+ // PCS data I/F
+ .rx_k( sgmii_rx_k[0] ),
+ .rx_data( rx_data0 ),
+ .tx_k( sgmii_tx_k[0] ),
+ .tx_data( tx_data0 ),
+ .tx_disp_correct( sgmii_tx_disp_correct[0] ),
+ // Flags and Interrupts
+ .keep( rx_mac_keep[0] ),
+ // TX FCS
+ .fcs_init( fcs_init[0] ),
+ .fcs_enable( fcs_enable[0] ),
+ .fcs_addr( fcs_addr0 ),
+ .fcs_dout( fcs_din0 ),
+ .fcs_din( fcs_dout0 ),
+ // SGMII RX / FIFO Write
+ .rx_fifo_we( rx_sc_fifo_we[0] ),
+ .rx_fifo_d( rx_sc_fifo_d0 ),
+ .rx_error( rx_sc_error[0] ),
+ .rx_wr_done( rx_sc_wr_done[0] ),
+ .rx_byte_cnt(rx0_byte_cnt),
+ // SGMII TX / FIFO Read
+ .tx_byte_cnt_i(tx0_byte_cnt),
+ .tx_fifo_re( tx_sc_fifo_re[0] ),
+ .tx_fifo_d( tx_sw_fifo_d0 ),
+ .tx_fifo_empty( tx_sw_fifo_empty[0] ),
+ // Packet Filter
+ .rx_sample( rx_sample[0] ),
+ .ipv4_pkt_start( ipv4_pkt_start[0] ),
+ .trigger( ),
+ .rx_enet_bcast( rx_enet_bcast[0] ),
+ .rx_ipv4_arp( rx_ipv4_arp[0] ),
+ .rx_k_m1( rx0_k_m1 ),
+ .rx_k_m2( rx0_k_m2 ),
+ .rx_k_m3( rx0_k_m3),
+ .rx_k_m4( rx0_k_m4 ),
+ .rx_data_m1( rx0_data_m1 ),
+ .rx_data_m2( rx0_data_m2 ),
+ .rx_data_m3( rx0_data_m3),
+ .rx_data_m4( rx0_data_m4 ),
+ // Param RAM
+ .dpr_ad( param_phy0_addr ),
+ .dpr_we( param_phy0_we ),
+ .dpr_ce( param_phy0_ce ),
+ .dpr_di( param_phy0_din ),
+ .dpr_do( param_phy0_dout ),
+ // Metrics and Interrupts
+ .mac_int( mac_int[0] ),
+ .rx_sop( rx_sop[0] ),
+ .rx_eop( rx_eop[0] ),
+ .tx_sop( tx_sop[0] ),
+ .tx_eop( tx_eop[0] ),
+ .metrics_start ( ),
+ .metrics_d ( 9'h0 ),
+ .rx_active( mac_rx_active[0] ),
+ .tx_active( mac_tx_active[0] )
+);
+
+
+ipv4_rx ipv4_rx_0(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // control
+ .phy_resetn ( phy_resetn[0] ),
+ .phy_up( phy_up[0] ),
+ // packet data
+ .pkt_start( ipv4_pkt_start[0] ),
+ .rx_eop( rx_eop[0] ),
+ .rx_data_m1( rx0_data_m1 ),
+ .rx_data_m2( rx0_data_m2 ),
+ .rx_data_m3( rx0_data_m3),
+ .rx_data_m4( rx0_data_m4 ),
+ // flags
+ .pkt_complete(ipv4_pkt_complete[0]),
+ .trigger_src_addr( ),
+ .trigger_dst_addr( trigger[0] ),
+ .keep( )
+ );
+
+
+pkt_filter pkt_filter_01(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_01 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx0_data_m1 ),
+ .rx_data_m2( rx0_data_m2 ),
+ .rx_data_m3( rx0_data_m3),
+ .rx_data_m4( rx0_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[0] ),
+ .block( 1'b0 ),
+ .invert( 1'b1 ),
+ .trigger( trigger[0] ),
+ .keep( rx_pf_keep_01 )
+);
+
+drop_fifo drop_fifo_01(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b1 ),
+ // control
+ .keep ( rx_pf_keep_01 | rx_mac_keep[0] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[0] ),
+ .wr_done( rx_sc_wr_done[0] ),
+ .d_in( rx_sc_fifo_d0 ),
+ // output
+ .we_out( rx_df_fifo_we_01 ),
+ .d_out( rx_df_fifo_d_01 ),
+ // debug
+ .active( drop_rx0_active[1] )
+);
+
+sync_fifo sync_fifo_rx_01(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input
+ .we ( rx_df_fifo_we_01 & phy_up[1] ),
+ .d_in ( rx_df_fifo_d_01 ),
+ // output
+ .re ( rx_sw_fifo_re_01 ),
+ .d_out( rx_sf_fifo_d_01 ),
+ .empty( rx_sf_fifo_empty_01 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx0_active[1] )
+);
+
+pkt_filter pkt_filter_02(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_02 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx0_data_m1 ),
+ .rx_data_m2( rx0_data_m2 ),
+ .rx_data_m3( rx0_data_m3),
+ .rx_data_m4( rx0_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[0] ),
+ .block( rx_sf_almost_full_02 ),
+ .invert(1'b1),
+ .trigger(trigger[0]),
+ .keep( rx_pf_keep_02 )
+);
+
+drop_fifo drop_fifo_02(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b1 ),
+ // control
+ .keep ( rx_pf_keep_02 | rx_mac_keep[0] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[0] ),
+ .wr_done( rx_sc_wr_done[0] ),
+ .d_in( rx_sc_fifo_d0 ),
+ // output
+ .we_out( rx_df_fifo_we_02 ),
+ .d_out( rx_df_fifo_d_02 ),
+ .active( drop_rx0_active[2] )
+ );
+
+sync_fifo sync_fifo_rx_02(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input
+ .we ( rx_df_fifo_we_02 & phy_up[2] ),
+ .d_in ( rx_df_fifo_d_02 ),
+ // output
+ .re ( rx_sw_fifo_re_02 ),
+ .d_out( rx_sf_fifo_d_02 ),
+ .empty( rx_sf_fifo_empty_02 ),
+ .almost_full( rx_sf_almost_full_02 ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active(sync_rx0_active[2] )
+);
+
+
+pkt_filter pkt_filter_03(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_03 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx0_data_m1 ),
+ .rx_data_m2( rx0_data_m2 ),
+ .rx_data_m3( rx0_data_m3),
+ .rx_data_m4( rx0_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[0] ),
+ .block( rx_sf_almost_full_03 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[0] ),
+ .keep( rx_pf_keep_03 )
+ );
+
+drop_fifo drop_fifo_03(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_03 | rx_mac_keep[0] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[0] ),
+ .wr_done( rx_sc_wr_done[0] ),
+ .d_in( rx_sc_fifo_d0 ),
+ // output
+ .we_out( rx_df_fifo_we_03 ),
+ .d_out( rx_df_fifo_d_03 ),
+ .active( drop_rx0_active[3] )
+ );
+
+sync_fifo sync_fifo_rx_03(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input
+ .we ( rx_df_fifo_we_03 & phy_up[3] ),
+ .d_in ( rx_df_fifo_d_03 ),
+ // output
+ .re ( rx_sw_fifo_re_03 ),
+ .d_out( rx_sf_fifo_d_03 ),
+ .empty( rx_sf_fifo_empty_03 ),
+ .almost_full( rx_sf_almost_full_03 ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx0_active[3] )
+ );
+
+fcs fcs_0(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .init( fcs_init[0] ),
+ .enable( fcs_enable[0] ),
+ .addr( fcs_addr0 ),
+ .din( fcs_din0 ),
+ .dout( fcs_dout0 )
+);
+
+/*
+ * Param RAM
+ */
+dpram param_ram_0(
+ .rstn(rstn),
+ .a_clk(clk_10),
+ .a_clk_e(param_sel[0]),
+ .a_we(mem_we),
+ .a_oe(mem_oe),
+ .a_addr(mem_addr),
+ .a_din(mem_d_i[8:0]),
+ .a_dout(param_ram_0_do),
+ // port B
+ .b_clk( pcs_pclk),
+ .b_clk_e(param_phy0_ce),
+ .b_we(param_phy0_we),
+ .b_oe( 1'b1 ),
+ .b_addr( param_phy0_addr ),
+ .b_din( param_phy0_dout ),
+ .b_dout( param_phy0_din )
+ );
+
+mac mac_1(
+ .rstn( ~mac_reset[1] ),
+ .phy_resetn ( phy_resetn[1] ),
+ .clk( pcs_pclk ),
+ .tap_port ( 1'b0 ),
+ // AN
+ .phy_type(2'b00), // SGMII==0
+ .an_disable( 1'b0 ),
+ .pulse_1_6ms(pulse_1_6ms),
+ .pulse_10ms(pulse_10ms),
+ .fixed_speed(SGMII_SPEED_AN),
+ .an_duplex( ),
+ .mode_100Mbit( mode_100Mbit[1] ),
+ .phy_up( phy_up[1] ),
+ // Switch I/F
+ .tx_mode( tx_sw_mode1 ),
+ .tx_f( tx_sc_done[1] ),
+ // PCS / SERDES health
+ .rx_lsm( sgmii_lsm_status[1] ),
+ .rx_cv_err ( sgmii_rx_cv_err[1] ),
+ .rx_disp_err( sgmii_rx_disp_err[1] ),
+ .rx_cdr_lol( sgmii_rx_cdr_lol[1] ),
+ .rx_los ( sgmii_rx_los_low[1] ),
+ // PCS data I/F
+ .rx_k( sgmii_rx_k[1] ),
+ .rx_data( rx_data1 ),
+ .tx_k( sgmii_tx_k[1] ),
+ .tx_data( tx_data1 ),
+ .tx_disp_correct( sgmii_tx_disp_correct[1] ),
+ // Flags and Interrupts
+ .keep( rx_mac_keep[1] ),
+ // FCS
+ .fcs_init( fcs_init[1] ),
+ .fcs_enable( fcs_enable[1] ),
+ .fcs_addr( fcs_addr1 ),
+ .fcs_dout( fcs_din1 ),
+ .fcs_din( fcs_dout1 ),
+ // SGMII RX / FIFO Write
+ .rx_fifo_we( rx_sc_fifo_we[1] ),
+ .rx_fifo_d( rx_sc_fifo_d1 ),
+ .rx_error( rx_sc_error[1] ),
+ .rx_wr_done( rx_sc_wr_done[1] ),
+ .rx_byte_cnt(rx1_byte_cnt),
+ // SGMII TX / FIFO Read
+ .tx_byte_cnt_i(tx1_byte_cnt),
+ .tx_fifo_re( tx_sc_fifo_re[1] ),
+ .tx_fifo_d( tx_sw_fifo_d1 ),
+ .tx_fifo_empty( tx_sw_fifo_empty[1] ),
+ // Packet Filter
+ .rx_sample( ),
+ .ipv4_pkt_start( ipv4_pkt_start[1] ),
+ .trigger( ),
+ .rx_enet_bcast( rx_enet_bcast[1] ),
+ .rx_ipv4_arp( rx_ipv4_arp[1] ),
+ .rx_k_m1( rx1_k_m1 ),
+ .rx_k_m2( rx1_k_m2 ),
+ .rx_k_m3( rx1_k_m3),
+ .rx_k_m4( rx1_k_m4 ),
+ .rx_data_m1( rx1_data_m1 ),
+ .rx_data_m2( rx1_data_m2 ),
+ .rx_data_m3( rx1_data_m3),
+ .rx_data_m4( rx1_data_m4 ),
+ // Param RAM
+ .dpr_ad( param_phy1_addr ),
+ .dpr_we( param_phy1_we),
+ .dpr_ce(param_phy1_ce ),
+ .dpr_di(param_phy1_din),
+ .dpr_do(param_phy1_dout),
+ // Metrics and Interrupts
+ .mac_int( mac_int[1] ),
+ .rx_sop( rx_sop[1] ),
+ .rx_eop( rx_eop[1] ),
+ .tx_sop( tx_sop[1] ),
+ .tx_eop( tx_eop[1] ),
+ .metrics_start ( ),
+ .metrics_d ( 9'h0 ),
+ .rx_active( mac_rx_active[1] ),
+ .tx_active( mac_tx_active[1] )
+);
+
+ipv4_rx ipv4_rx_1(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // control
+ .phy_resetn ( phy_resetn[1] ),
+ .phy_up( phy_up[1] ),
+ // packet data
+ .pkt_start( ipv4_pkt_start[1] ),
+ .rx_eop( rx_eop[1] ),
+ .rx_data_m1( rx1_data_m1 ),
+ .rx_data_m2( rx1_data_m2 ),
+ .rx_data_m3( rx1_data_m3),
+ .rx_data_m4( rx1_data_m4 ),
+ // flags
+ .pkt_complete(ipv4_pkt_complete[1]),
+ .trigger_src_addr( ),
+ .trigger_dst_addr( trigger[1] ),
+ .keep( )
+ );
+
+pkt_filter #(.DEPTH(8), .DEPTHW(3), .WIDTH(32)) pkt_filter_10(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_10 ),
+ .we( mem_we ),
+ .addr( mem_addr[4:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx1_data_m1 ),
+ .rx_data_m2( rx1_data_m2 ),
+ .rx_data_m3( rx1_data_m3),
+ .rx_data_m4( rx1_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[1] ),
+ .block( 1'b0 ),
+ .invert( 1'b1 ),
+ .trigger( trigger[1] ),
+ .keep( rx_pf_keep_10 )
+ );
+
+drop_fifo drop_fifo_10(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b1 ),
+ // control
+ .keep ( rx_pf_keep_10 | rx_mac_keep[1] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[1] ),
+ .wr_done( rx_sc_wr_done[1] ),
+ .d_in( rx_sc_fifo_d1 ),
+ // output
+ .we_out( rx_df_fifo_we_10 ),
+ .d_out( rx_df_fifo_d_10 ),
+ // debug
+ .active( drop_rx1_active[0] )
+ );
+
+sync_fifo sync_fifo_rx_10(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_10 & phy_up[0] ),
+ .d_in ( rx_df_fifo_d_10 ),
+ // output / TX
+ .re ( rx_sw_fifo_re_10 ),
+ .d_out( rx_sf_fifo_d_10 ),
+ .empty( rx_sf_fifo_empty_10 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx1_active[0] )
+);
+
+pkt_filter pkt_filter_12(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_12 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx1_data_m1 ),
+ .rx_data_m2( rx1_data_m2 ),
+ .rx_data_m3( rx1_data_m3),
+ .rx_data_m4( rx1_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[1] ),
+ .block( rx_sf_almost_full_12 ),
+ .invert( 1'b1 ),
+ .trigger( trigger[1] ),
+ .keep( rx_pf_keep_12 )
+ );
+
+drop_fifo drop_fifo_12(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable(1'b1),
+ // control
+ .keep ( rx_pf_keep_12 | rx_mac_keep[1] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[1] ),
+ .wr_done( rx_sc_wr_done[1] ),
+ .d_in( rx_sc_fifo_d1 ),
+ // output
+ .we_out( rx_df_fifo_we_12 ),
+ .d_out( rx_df_fifo_d_12 ),
+ // debug
+ .active( drop_rx1_active[2] )
+ );
+
+sync_fifo sync_fifo_rx_12(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_12 & phy_up[2] ),
+ .d_in ( rx_df_fifo_d_12 ),
+ // output / TX
+ .re ( rx_sw_fifo_re_12 ),
+ .d_out( rx_sf_fifo_d_12 ),
+ .empty( rx_sf_fifo_empty_12 ),
+ .almost_full( rx_sf_almost_full_12 ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx1_active[2] )
+);
+
+pkt_filter pkt_filter_13(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_13 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx1_data_m1 ),
+ .rx_data_m2( rx1_data_m2 ),
+ .rx_data_m3( rx1_data_m3),
+ .rx_data_m4( rx1_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[1] ),
+ .block( 1'b0 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[1] ),
+ .keep( rx_pf_keep_13 )
+ );
+
+drop_fifo drop_fifo_13(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_13 | rx_mac_keep[1] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[1] ),
+ .wr_done( rx_sc_wr_done[1] ),
+ .d_in( rx_sc_fifo_d1 ),
+ // output
+ .we_out( rx_df_fifo_we_13 ),
+ .d_out( rx_df_fifo_d_13 ),
+ // debug
+ .active( drop_rx1_active[3] )
+ );
+
+sync_fifo sync_fifo_rx_13(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_13 & phy_up[3] ),
+ .d_in ( rx_df_fifo_d_13 ),
+ // output / TX
+ .re ( rx_sw_fifo_re_13 ),
+ .d_out( rx_sf_fifo_d_13 ),
+ .empty( rx_sf_fifo_empty_13 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx1_active[3] )
+ );
+
+fcs fcs_1(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .init( fcs_init[1] ),
+ .enable( fcs_enable[1] ),
+ .addr( fcs_addr1 ),
+ .din( fcs_din1 ),
+ .dout( fcs_dout1 )
+);
+
+/*
+ * Param RAM
+ */
+dpram param_ram_1(
+ .rstn(rstn),
+ .a_clk(clk_10),
+ .a_clk_e(param_sel[0]),
+ .a_we(mem_we),
+ .a_oe(mem_oe),
+ .a_addr(mem_addr),
+ .a_din(mem_d_i[8:0]),
+ .a_dout(param_ram_1_do),
+ // port B
+ .b_clk( pcs_pclk),
+ .b_clk_e(param_phy1_ce),
+ .b_we(param_phy1_we),
+ .b_oe( 1'b1 ),
+ .b_addr( param_phy1_addr ),
+ .b_din( param_phy1_dout ),
+ .b_dout( param_phy1_din )
+ );
+
+
+metrics metrics_2(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .mode_100Mbit( mode_100Mbit[2] ),
+ // input data for gathering metrics
+ .rx_mac_keep( rx_mac_keep ),
+ .rx_pf_keep_01( rx_pf_keep_01 ),
+ .rx_pf_keep_02( rx_pf_keep_02 ),
+ .rx_pf_keep_10( rx_pf_keep_10 ),
+ .rx_pf_keep_12( rx_pf_keep_12 ),
+ .rx_pf_keep_20( rx_pf_keep_20 ),
+ .rx_pf_keep_21( rx_pf_keep_21 ),
+ .rx_pf_keep_23( rx_pf_keep_23 ),
+
+ .rx_sop( rx_sop ),
+ .rx_eop( rx_eop ),
+ .tx_sop( tx_sop ),
+ .tx_eop( tx_eop ),
+ // metric outputs
+ .metrics_start ( metrics_start ),
+ .metrics_d( metrics_d )
+);
+
+
+// GEODSS MAC
+mac mac_2(
+ .rstn(~mac_reset[2]),
+ .phy_resetn ( phy_resetn[2] ),
+ .clk( pcs_pclk ),
+ .tap_port ( 1'b0 ),
+ // SGMII AN
+ .phy_type(2'b01), // SX==1
+ .an_disable( 1'b1 ),
+ .pulse_1_6ms(pulse_1_6ms),
+ .pulse_10ms(pulse_10ms),
+ .fixed_speed(SGMII_SPEED_1GBIT),
+ .an_duplex( ),
+ .mode_100Mbit( mode_100Mbit[2] ),
+ .phy_up( phy_up[2] ),
+ // Switch I/F
+ .tx_mode( tx_sw_mode2 ),
+ .tx_f( tx_sc_done[2] ),
+ // PCS / SERDES health
+ .rx_lsm( 1'b1 ), // TODO: Fix LSM for SFP
+ .rx_cv_err ( sgmii_rx_cv_err[2] ),
+ .rx_disp_err( sgmii_rx_disp_err[2] ),
+ .rx_cdr_lol( sgmii_rx_cdr_lol[2] ),
+ .rx_los ( sgmii_rx_los_low[2] ),
+ // PCS data I/F
+ .rx_k( sgmii_rx_k[2] ),
+ .rx_data( rx_data2 ),
+ .tx_k( sgmii_tx_k[2] ),
+ .tx_data( tx_data2 ),
+ .tx_disp_correct( sgmii_tx_disp_correct[2] ),
+ // Flags and Interrupts
+ .keep( rx_mac_keep[2] ),
+ // FCS
+ .fcs_init( fcs_init[2] ),
+ .fcs_enable( fcs_enable[2] ),
+ .fcs_addr( fcs_addr2 ),
+ .fcs_dout( fcs_din2 ),
+ .fcs_din( fcs_dout2 ),
+ // SGMII RX / FIFO Write
+ .rx_fifo_we( rx_sc_fifo_we[2] ),
+ .rx_fifo_d(rx_sc_fifo_d2),
+ .rx_error( rx_sc_error[2] ),
+ .rx_wr_done( rx_sc_wr_done[2] ),
+ .rx_byte_cnt(rx2_byte_cnt),
+ // SGMII TX / FIFO Read
+ .tx_byte_cnt_i(tx2_byte_cnt),
+ .tx_fifo_re( tx_sc_fifo_re[2] ),
+ .tx_fifo_d( tx_sw_fifo_d2 ),
+ .tx_fifo_empty( tx_sw_fifo_empty[2]),
+ // Packet Filter
+ .rx_sample( ),
+ .ipv4_pkt_start( ipv4_pkt_start[2] ),
+ .trigger( ),
+ .rx_enet_bcast( rx_enet_bcast[2] ),
+ .rx_ipv4_arp( rx_ipv4_arp[2] ),
+ .rx_k_m1( rx2_k_m1 ),
+ .rx_k_m2( rx2_k_m2 ),
+ .rx_k_m3( rx2_k_m3),
+ .rx_k_m4( rx2_k_m4 ),
+ .rx_data_m1( rx2_data_m1 ),
+ .rx_data_m2( rx2_data_m2 ),
+ .rx_data_m3( rx2_data_m3),
+ .rx_data_m4( rx2_data_m4 ),
+ // Param RAM
+ .dpr_ad( param_phy2_addr ),
+ .dpr_we( param_phy2_we ),
+ .dpr_ce( param_phy2_ce ),
+ .dpr_di( param_phy2_din ),
+ .dpr_do( param_phy2_dout ),
+ // Metrics and Interrupts
+ .mac_int( mac_int[2] ),
+ .rx_sop( rx_sop[2] ),
+ .rx_eop( rx_eop[2] ),
+ .tx_sop( tx_sop[2] ),
+ .tx_eop( tx_eop[2] ),
+ .metrics_start ( metrics_start ),
+ .metrics_d( metrics_d ),
+ // Debug
+ .rx_active( mac_rx_active[2] ),
+ .tx_active( mac_tx_active[2] )
+);
+
+ipv4_rx ipv4_rx_2(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // control
+ .phy_resetn ( phy_resetn[2] ),
+ .phy_up( phy_up[2] ),
+ // packet data
+ .pkt_start( ipv4_pkt_start[2] ),
+ .rx_eop( rx_eop[2] ),
+ .rx_data_m1( rx2_data_m1 ),
+ .rx_data_m2( rx2_data_m2 ),
+ .rx_data_m3( rx2_data_m3),
+ .rx_data_m4( rx2_data_m4 ),
+ // flags
+ .pkt_complete(ipv4_pkt_complete[2]),
+ .trigger_src_addr( ),
+ .trigger_dst_addr( trigger[2] ),
+ .keep( )
+ );
+
+
+pkt_filter pkt_filter_20(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_20 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx2_data_m1 ),
+ .rx_data_m2( rx2_data_m2 ),
+ .rx_data_m3( rx2_data_m3),
+ .rx_data_m4( rx2_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[2] ),
+ .block( rx_sf_almost_full_20 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[2] ),
+ .keep( rx_pf_keep_20 )
+);
+
+drop_fifo drop_fifo_20(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_20 | rx_mac_keep[2] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[2] ),
+ .wr_done( rx_sc_wr_done[2] ),
+ .d_in( rx_sc_fifo_d2 ),
+ // output
+ .we_out( rx_df_fifo_we_20 ),
+ .d_out( rx_df_fifo_d_20 ),
+ // debug
+ .active( drop_rx2_active[0] )
+ );
+
+sync_fifo sync_fifo_rx_20(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_20 & phy_up[0]),
+ .d_in ( rx_df_fifo_d_20 ),
+ // output / TX
+ .re ( rx_sw_fifo_re_20 ),
+ .d_out( rx_sf_fifo_d_20 ),
+ .empty( rx_sf_fifo_empty_20 ),
+ .almost_full( rx_sf_almost_full_20 ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx2_active[0] )
+);
+
+pkt_filter pkt_filter_21(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_21 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx2_data_m1 ),
+ .rx_data_m2( rx2_data_m2 ),
+ .rx_data_m3( rx2_data_m3),
+ .rx_data_m4( rx2_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[2] ),
+ .block( 1'b0 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[2] ),
+ .keep( rx_pf_keep_21 )
+);
+
+drop_fifo drop_fifo_21(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_21 | rx_mac_keep[2] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[2] ),
+ .wr_done( rx_sc_wr_done[2] ),
+ .d_in( rx_sc_fifo_d2 ),
+ // output
+ .we_out( rx_df_fifo_we_21 ),
+ .d_out( rx_df_fifo_d_21 ),
+ // debug
+ .active( drop_rx2_active[1] )
+ );
+
+sync_fifo sync_fifo_rx_21(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_21 & phy_up[1] ),
+ .d_in ( rx_df_fifo_d_21 ),
+ // output
+ .re ( rx_sw_fifo_re_21 ),
+ .d_out( rx_sf_fifo_d_21 ),
+ .empty( rx_sf_fifo_empty_21 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx2_active[1] )
+);
+
+pkt_filter pkt_filter_2u(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_2u ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx2_data_m1 ),
+ .rx_data_m2( rx2_data_m2 ),
+ .rx_data_m3( rx2_data_m3),
+ .rx_data_m4( rx2_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[2] ),
+ .block( tx_uc_block ),
+ .invert( 1'b0 ),
+ .trigger( trigger[2] ),
+ .keep( rx_pf_keep_2u )
+ );
+
+drop_fifo drop_fifo_2u(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .passthrough( 1'b0 ),
+ .keep ( rx_pf_keep_2u | rx_mac_keep[2] ),
+ // input
+ .we_in( rx_sc_fifo_we[2] ),
+ .wr_done( rx_sc_wr_done[2] ),
+ .d_in( rx_sc_fifo_d2 ),
+ // output
+ .we_out( rx_df_fifo_we_2u ),
+ .d_out( rx_df_fifo_d_2u ),
+ // debug
+ .active( )
+ );
+
+// TODO: add a flag on we to keep UC from being overwritten
+sync_fifo sync_fifo_rx_2u(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input / RX
+ .we ( rx_df_fifo_we_2u ),
+ .d_in ( rx_df_fifo_d_2u ),
+ // output
+ .re ( rx_sw_fifo_re_2u ),
+ .d_out( rx_sf_fifo_d_2u ),
+ .empty( rx_sf_fifo_empty_2u ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( )
+);
+
+fcs fcs_2(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .init( fcs_init[2] ),
+ .enable( fcs_enable[2] ),
+ .addr( fcs_addr2 ),
+ .din( fcs_din2 ),
+ .dout( fcs_dout2 )
+);
+
+// GEODSS SMA (MAC is bypassed)
+mac mac_3(
+ .rstn( ~mac_reset[3] & ~sgmii_rx_los_low[3] ),
+ .phy_resetn ( phy_resetn[3] ),
+ .clk( pcs_pclk ),
+ .tap_port ( 1'b0 ),
+ // SGMII AN
+ .phy_type(2'b11), // SMA=3
+ .an_disable(1'b1),
+ .pulse_1_6ms(pulse_1_6ms),
+ .pulse_10ms(pulse_10ms),
+ .fixed_speed(SGMII_SPEED_1GBIT),
+ .an_duplex( ),
+ .mode_100Mbit( mode_100Mbit[3] ),
+ .phy_up( phy_up[3] ),
+ // Switch I/F
+ .tx_mode( tx_sw_mode3 ),
+ .tx_f( tx_sc_done[3] ),
+ // PCS / SERDES health
+ .rx_lsm( sgmii_lsm_status[3] ),
+ .rx_cv_err ( sgmii_rx_cv_err[3] ),
+ .rx_disp_err( sgmii_rx_disp_err[3] ),
+ .rx_cdr_lol( sgmii_rx_cdr_lol[3] ),
+ .rx_los ( sgmii_rx_los_low[3] ),
+ // PCS data I/F
+ .rx_k( sgmii_rx_k[3] ),
+ .rx_data( rx_data3 ),
+ .tx_k( sgmii_tx_k[3] ),
+ .tx_data( tx_data3 ),
+ .tx_disp_correct( sgmii_tx_disp_correct[3] ),
+ // Flags and Interrupts
+ .keep( rx_mac_keep[3] ),
+ // TX FCS
+ .fcs_init( fcs_init[3] ),
+ .fcs_enable( fcs_enable[3] ),
+ .fcs_addr( fcs_addr3 ),
+ .fcs_dout( fcs_din3 ),
+ .fcs_din( fcs_dout3 ),
+ // SGMII RX / FIFO Write
+ .rx_fifo_we( rx_sc_fifo_we[3] ),
+ .rx_fifo_d( rx_sc_fifo_d3 ),
+ .rx_error( rx_sc_error[3] ),
+ .rx_wr_done( rx_sc_wr_done[3] ),
+ .rx_byte_cnt(rx3_byte_cnt),
+ // SGMII TX / FIFO Read
+ .tx_byte_cnt_i(tx3_byte_cnt),
+ .tx_fifo_re( tx_sc_fifo_re[3] ),
+ .tx_fifo_d( tx_sw_fifo_d3 ),
+ .tx_fifo_empty( tx_sw_fifo_empty[3] ),
+ // Packet Filter
+ .rx_sample( rx_sample[3] ),
+ .ipv4_pkt_start( ipv4_pkt_start[3] ),
+ .trigger( ),
+ .rx_enet_bcast( rx_enet_bcast[3] ),
+ .rx_ipv4_arp( rx_ipv4_arp[3] ),
+ .rx_k_m1( rx3_k_m1 ),
+ .rx_k_m2( rx3_k_m2 ),
+ .rx_k_m3( rx3_k_m3),
+ .rx_k_m4( rx3_k_m4 ),
+ .rx_data_m1( rx3_data_m1 ),
+ .rx_data_m2( rx3_data_m2 ),
+ .rx_data_m3( rx3_data_m3),
+ .rx_data_m4( rx3_data_m4 ),
+ // Param RAM
+ .dpr_ad( ),
+ .dpr_we( ),
+ .dpr_ce( ),
+ .dpr_di( 9'h0),
+ .dpr_do( ),
+ // Metrics and Interrupts
+ .mac_int( mac_int[3] ),
+ .rx_sop( rx_sop[3] ),
+ .rx_eop( rx_eop[3] ),
+ .tx_sop( tx_sop[3] ),
+ .tx_eop( tx_eop[3] ),
+ .metrics_start ( ),
+ .metrics_d ( 9'h0 ),
+ // Debug
+ .rx_active( mac_rx_active[3] ),
+ .tx_active( mac_tx_active[3] )
+
+ );
+
+
+ipv4_rx ipv4_rx_3(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // control
+ .phy_resetn ( phy_resetn[3] ),
+ .phy_up( phy_up[3] ),
+ // packet data
+ .pkt_start( ipv4_pkt_start[3] ),
+ .rx_eop( rx_eop[3] ),
+ .rx_data_m1( rx3_data_m1 ),
+ .rx_data_m2( rx3_data_m2 ),
+ .rx_data_m3( rx3_data_m3),
+ .rx_data_m4( rx3_data_m4 ),
+ // flags
+ .pkt_complete(ipv4_pkt_complete[3]),
+ .trigger_src_addr( ),
+ .trigger_dst_addr( trigger[3] ),
+ .keep( )
+ );
+
+
+
+pkt_filter pkt_filter_30(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_30 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx3_data_m1 ),
+ .rx_data_m2( rx3_data_m2 ),
+ .rx_data_m3( rx3_data_m3),
+ .rx_data_m4( rx3_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[3] ),
+ .block( 1'b0 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[3] ),
+ .keep( rx_pf_keep_30 )
+ );
+
+drop_fifo drop_fifo_30(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_30 | rx_mac_keep[3] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[3] ),
+ .wr_done( rx_sc_wr_done[3] ),
+ .d_in( rx_sc_fifo_d3 ),
+ // output
+ .we_out( rx_df_fifo_we_30 ),
+ .d_out( rx_df_fifo_d_30 ),
+ // debug
+ .active( drop_rx3_active[0] )
+ );
+
+sync_fifo sync_fifo_rx_30(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input
+ .we ( rx_df_fifo_we_30 & phy_up[0] ),
+ .d_in ( rx_df_fifo_d_30 ),
+ // output
+ .re ( rx_sw_fifo_re_30 ),
+ .d_out( rx_sf_fifo_d_30 ),
+ .empty( rx_sf_fifo_empty_30 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx3_active[0] )
+ );
+
+pkt_filter pkt_filter_31(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ // input for programming
+ .sel( pkt_filter_sel_31 ),
+ .we( mem_we ),
+ .addr( mem_addr[3:0] ),
+ .d_in( mem_d_i[7:0] ),
+ // registered data
+ .rx_data_m1( rx3_data_m1 ),
+ .rx_data_m2( rx3_data_m2 ),
+ .rx_data_m3( rx3_data_m3),
+ .rx_data_m4( rx3_data_m4 ),
+ // filter
+ .new_frame ( rx_sop[3] ),
+ .block( 1'b0 ),
+ .invert( 1'b0 ),
+ .trigger( trigger[3] ),
+ .keep( rx_pf_keep_31 )
+ );
+
+drop_fifo drop_fifo_31(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ .enable( 1'b0 ),
+ // control
+ .keep ( rx_pf_keep_31 | rx_mac_keep[3] ),
+ .passthrough( 1'b0 ),
+ // input
+ .we_in( rx_sc_fifo_we[3] ),
+ .wr_done( rx_sc_wr_done[3] ),
+ .d_in( rx_sc_fifo_d3 ),
+ // output
+ .we_out( rx_df_fifo_we_31 ),
+ .d_out( rx_df_fifo_d_31 ),
+ // debug
+ .active( drop_rx3_active[1] )
+ );
+
+sync_fifo sync_fifo_rx_31(
+ .rstn( rstn ),
+ .clk ( pcs_pclk ),
+ // input
+ .we ( rx_df_fifo_we_31 & phy_up[1] ),
+ .d_in ( rx_df_fifo_d_31 ),
+ // output
+ .re ( rx_sw_fifo_re_31 ),
+ .d_out( rx_sf_fifo_d_31 ),
+ .empty( rx_sf_fifo_empty_31 ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( sync_rx3_active[1] )
+ );
+
+fcs fcs_3(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .init( fcs_init[3] ),
+ .enable( fcs_enable[3] ),
+ .addr( fcs_addr3 ),
+ .din( fcs_din3 ),
+ .dout( fcs_dout3 )
+);
+
+/*
+ * uCont i/f FIFO
+ * FIFO side connects to network switch
+ * RX: processor writes (data into switch)
+ * TX: processor reads (data from switch)
+ */
+half_fifo #(.DPRAM_DEPTH(9)) micro_fifo_0 (
+ .rstn( rstn ),
+ .uc_clk(clk_10),
+ .fifo_clk(pcs_pclk),
+ // UC interrupt support
+ .fifo_we_int ( micro_fifo_int ),
+ // TX mode
+ .tx_mode(tx_sw_modeu),
+ // DPRAM common
+ .dpram_addr( mem_addr[8:0] ),
+ .dpram_din( mem_d_i[8:0] ),
+ .dpram_dout( micro_fifo_do ),
+ .dpram_we( mem_we ),
+ .dpram_oe( mem_oe ),
+ // UC select signals
+ .dpram_ptrs_sel( dpram_ptrs_sel ),
+ .dpram_rx_sel( dpram_rx_sel ),
+ .dpram_tx_sel( dpram_tx_sel ),
+ // FIFO TX (input)
+ .fifo_we( tx_sw_fifo_we ),
+ .fifo_d_in( tx_sw_fifo_du ),
+ // FIFO RX (output)
+ .fifo_re( rx_sw_fifo_re_u2 ),
+ .fifo_d_out( rx_uc_fifo_d_u2 ),
+ // FIFO flags
+ .rx_empty( rx_uc_fifo_empty_u2 ),
+ .tx_full ( tx_uc_block )
+ );
+
+/*
+ * Param RAM
+ */
+dpram param_ram_2(
+ .rstn(rstn),
+ .a_clk(clk_10),
+ .a_clk_e(param_sel[2]),
+ .a_we(mem_we),
+ .a_oe(mem_oe),
+ .a_addr(mem_addr),
+ .a_din(mem_d_i[8:0]),
+ .a_dout(param_ram_2_do),
+ // port B
+ .b_clk( pcs_pclk),
+ .b_clk_e(param_phy2_ce),
+ .b_we(param_phy2_we),
+ .b_oe( 1'b1 ),
+ .b_addr( param_phy2_addr ),
+ .b_din( param_phy2_dout ),
+ .b_dout( param_phy2_din )
+);
+
+//defparam param_ram_2.dp16kd_inst.INITVAL_00 = "00000000000000000000000000000000000000000000000000000000000000000022E10069F00800";
+
+
+
+/*
+* PCS Notes:
+* All _c control signals are asynch in the SERDES/PCS
+* All _s control signals are asynch and should be clocked before being used
+* TxPLL provides system clock for FPGA logic
+* tx_full_clk uses wire name 'txclk' and feeds both txi_clk and rxi_clk, as shown in Figure 9-27
+* For SGMII, tx_pclk is fed back internally to rxi_clk and ebrd_clk
+* ebrd_clk: CTC FIFO Read Clock per Channel
+*
+*/
+
+assign ext_sci_int = sci_int[0];
+
+/*
+PCSCLKDIV pcsclkdiv0 (
+ .RST( ~rstn ),
+ .CLKI( refclko ),
+ .SEL2( 1'b1 ), // 101 is div by 8
+ .SEL1( 1'b0 ),
+ .SEL0( 1'b1 ),
+ .CDIV1( ),
+ .CDIVX( )
+);
+*/
+
+/*
+ * PCS block that encapsulates two DCUs and the SCI block
+ */
+ assign pcs_error[0] = sgmii_rx_cv_err[0] | sgmii_rx_cdr_lol[0] | !sgmii_lsm_status[0] | sgmii_rx_los_low[0];
+ assign pcs_error[1] = sgmii_rx_cv_err[1] | sgmii_rx_cdr_lol[1] | !sgmii_lsm_status[1] | sgmii_rx_los_low[1];
+ assign pcs_error[2] = sgmii_rx_cv_err[2] | sgmii_rx_cdr_lol[2] | sgmii_rx_los_low[2];
+ assign pcs_error[3] = sgmii_rx_cv_err[3] | sgmii_rx_cdr_lol[3] | sgmii_rx_los_low[3];
+
+pcs pcs_0 (
+
+ .refclk0_refclkn(refclkp_d0),
+ .refclk0_refclkp(refclkn_d0),
+ .refclk0_refclko( refclko ),
+
+ // cross DCU tie offs
+ .sgmii0_cyawstn( 1'b0 ),
+
+ //DCU0 CH0 to PHY0
+ .sgmii0_hdinn(sgmii0_hdinn),
+ .sgmii0_hdinp(sgmii0_hdinp),
+ .sgmii0_hdoutn(sgmii0_hdoutn),
+ .sgmii0_hdoutp(sgmii0_hdoutp),
+
+ // DCU resets
+ .sgmii0_tx_serdes_rst_c( tx_serdes_rst[0] ), // rset LOL signal in PLL TODO: change this
+ .sgmii0_rst_dual_c( pcs_rst_dual[0] ), // resets all serdes channels including aux and PCS
+ .sgmii0_serdes_rst_dual_c( serdes_rst_dual[0] ), // resets serdes dual gated by fpga_reset_enable
+
+ // channel resets
+ .sgmii0_rx_pcs_rst_c( rx_pcs_rst[0] ), // reset channel PCS logic
+ .sgmii0_rx_serdes_rst_c( rx_serdes_rst[0] ), // reset digital logic in serdes rx
+ .sgmii0_tx_pcs_rst_c( tx_pcs_rst[0] ), // reset channel PCS logic
+
+ .sgmii0_rx_pwrup_c(1'b1), // channel power up
+ .sgmii0_tx_pwrup_c(1'b1), // channel power up
+
+ /* tx_pclk: Transmit Primary Clock. Direct connection to Primary
+ * clock network. When gearing is not enabled, this output
+ * equals the transmit full rate clock. When 2:1 gearing
+ * is enabled, it is a divide-by-2 half-rate clock.
+ */
+ .sgmii0_tx_pclk( pcs_pclk ), // direct connection from primary clock network
+ .sgmii0_txi_clk( pcs_pclk ), // clocks the TX UI FIFOS (see Figure 27)
+
+ .sgmii0_tx_disp_correct(sgmii_tx_disp_correct[0]),
+ .sgmii0_tx_k(sgmii_tx_k[0]),
+ .sgmii0_txdata( tx_data0 ),
+ .sgmii0_xmit(1'b0), //TODO: Auto Neg state machine
+ .sgmii0_signal_detect_c(1'b1),
+ .sgmii0_rx_cv_err( sgmii_rx_cv_err[0] ), // code violation with associated data, PCS will drive 0xEE and K=1 (Table 9-4)
+ .sgmii0_rx_disp_err( sgmii_rx_disp_err[0] ),
+ .sgmii0_rx_k( sgmii_rx_k[0] ),
+ .sgmii0_rxdata( rx_data0 ),
+ .sgmii0_lsm_status_s( sgmii_lsm_status[0] ), // lane is synced with commas ( 0 means no commas detected )
+ .sgmii0_rx_cdr_lol_s( sgmii_rx_cdr_lol[0] ), // CDR Loss of lock
+ .sgmii0_rx_los_low_s( sgmii_rx_los_low[0] ), // Loss of signal (LO THRESHOLD RANGE) detection
+
+ .sgmii0_ctc_ins_s(), // skip char added by CTC
+ .sgmii0_ctc_orun_s(), // CTC FIFO over run error
+ .sgmii0_ctc_urun_s(), // CTC FIFO under run error
+ .sgmii0_ctc_del_s(), // skip char deleted by CTC
+ .sgmii0_pll_lol( pll_lol[0] ),
+
+ //DCU0 CH1 to PHY1
+ .sgmii1_hdinn( sgmii1_hdinn ),
+ .sgmii1_hdinp( sgmii1_hdinp ),
+ .sgmii1_hdoutn( sgmii1_hdoutn ),
+ .sgmii1_hdoutp( sgmii1_hdoutp ),
+
+ // DCU resets
+ .sgmii1_rst_dual_c( pcs_rst_dual[0] ),
+ .sgmii1_serdes_rst_dual_c( serdes_rst_dual[0] ),
+ .sgmii1_tx_serdes_rst_c( tx_serdes_rst[0] ),
+
+ // Channel resets
+ .sgmii1_rx_pcs_rst_c( rx_pcs_rst[1] ),
+ .sgmii1_rx_serdes_rst_c( rx_serdes_rst[1] ),
+ .sgmii1_tx_pcs_rst_c( tx_pcs_rst[1] ),
+
+ .sgmii1_rx_pwrup_c( 1'b1 ),
+ .sgmii1_tx_pwrup_c( 1'b1 ),
+ .sgmii1_serdes_pdb( 1'b1 ),
+
+ .sgmii1_tx_pclk( ),
+ .sgmii1_txi_clk( pcs_pclk ),
+
+ .sgmii1_rx_cv_err( sgmii_rx_cv_err[1] ),
+ .sgmii1_rx_disp_err( sgmii_rx_disp_err[1] ),
+ .sgmii1_rx_k( sgmii_rx_k[1] ),
+ .sgmii1_rxdata( rx_data1 ),
+ .sgmii1_tx_disp_correct( sgmii_tx_disp_correct[1] ),
+ .sgmii1_tx_k( sgmii_tx_k[1] ),
+ .sgmii1_txdata( tx_data1 ),
+ .sgmii1_xmit( 1'b0 ), // TODO: Auto Negotiation Bit
+
+ .sgmii1_signal_detect_c( 1'b1 ),
+
+ .sgmii1_ctc_del_s(),
+ .sgmii1_ctc_ins_s(),
+ .sgmii1_ctc_orun_s(),
+ .sgmii1_ctc_urun_s(),
+
+ .sgmii1_lsm_status_s( sgmii_lsm_status[1] ),
+ .sgmii1_rx_cdr_lol_s( sgmii_rx_cdr_lol[1] ),
+ .sgmii1_rx_los_low_s( sgmii_rx_los_low[1] ),
+
+ // DCU1 CH0 to Expansion
+ .sgmii2_hdinn( sgmii2_hdinn ),
+ .sgmii2_hdinp( sgmii2_hdinp ),
+ .sgmii2_hdoutn( sgmii2_hdoutn ),
+ .sgmii2_hdoutp( sgmii2_hdoutp ),
+
+ // DCU Tie Offs
+ .sgmii2_cyawstn( 1'b0 ),
+
+ // DCU resets
+ .sgmii2_rst_dual_c( pcs_rst_dual[1] ),
+ .sgmii2_serdes_rst_dual_c( serdes_rst_dual[1] ),
+ .sgmii2_tx_serdes_rst_c( tx_serdes_rst[1] ),
+
+ // Channel resets
+ .sgmii2_rx_pcs_rst_c( rx_pcs_rst[2] ),
+ .sgmii2_rx_serdes_rst_c( rx_serdes_rst[2] ),
+ .sgmii2_tx_pcs_rst_c( tx_pcs_rst[2] ),
+
+ .sgmii2_rx_pwrup_c( 1'b1 ),
+ .sgmii2_tx_pwrup_c( 1'b1 ),
+ .sgmii2_serdes_pdb( 1'b1 ),
+
+ .sgmii2_tx_pclk( ),
+ .sgmii2_txi_clk( pcs_pclk ),
+
+ .sgmii2_rx_cv_err( sgmii_rx_cv_err[2] ),
+ .sgmii2_rx_disp_err( sgmii_rx_disp_err[2] ),
+ .sgmii2_rx_k( sgmii_rx_k[2] ),
+ .sgmii2_rxdata( rx_data2 ),
+ .sgmii2_tx_disp_correct( sgmii_tx_disp_correct[2] ),
+ .sgmii2_tx_k( sgmii_tx_k[2] ),
+ .sgmii2_txdata( tx_data2 ),
+ .sgmii2_xmit( 1'b0 ),
+
+ .sgmii2_signal_detect_c( 1'b1 ),
+
+ .sgmii2_ctc_del_s(),
+ .sgmii2_ctc_ins_s(),
+ .sgmii2_ctc_orun_s(),
+ .sgmii2_ctc_urun_s(),
+
+ .sgmii2_lsm_status_s( sgmii_lsm_status[2] ),
+ .sgmii2_rx_cdr_lol_s( sgmii_rx_cdr_lol[2] ),
+ .sgmii2_rx_los_low_s( sgmii_rx_los_low[2] ),
+
+ .sgmii2_pll_lol( pll_lol[1] ),
+
+ // DCU1 CH1 to Expansion
+ .sgmii3_hdinn( sgmii3_hdinn ),
+ .sgmii3_hdinp( sgmii3_hdinp ),
+ .sgmii3_hdoutn( sgmii3_hdoutn ),
+ .sgmii3_hdoutp( sgmii3_hdoutp ),
+
+ // DCU resets
+ .sgmii3_rst_dual_c( pcs_rst_dual[1] ),
+ .sgmii3_serdes_rst_dual_c( serdes_rst_dual[1] ),
+ .sgmii3_tx_serdes_rst_c( tx_serdes_rst[1] ),
+
+ // Channel resets
+ .sgmii3_rx_pcs_rst_c( rx_pcs_rst[3] ),
+ .sgmii3_rx_serdes_rst_c( rx_serdes_rst[3] ),
+ .sgmii3_tx_pcs_rst_c( tx_pcs_rst[3] ),
+
+ .sgmii3_rx_pwrup_c( 1'b1 ),
+ .sgmii3_tx_pwrup_c( 1'b1 ),
+
+ .sgmii3_tx_pclk( ),
+ .sgmii3_txi_clk( pcs_pclk ),
+
+ .sgmii3_rx_cv_err( sgmii_rx_cv_err[3] ),
+ .sgmii3_rx_disp_err( sgmii_rx_disp_err[3] ),
+ .sgmii3_rx_k( sgmii_rx_k[3] ),
+ .sgmii3_rxdata( rx_data3 ),
+ .sgmii3_tx_disp_correct( sgmii_tx_disp_correct[3] ),
+`ifdef SHIELD_SFP_SMA
+ .sgmii3_tx_k(rx2_k_m1), // MAC 2 RX k
+ .sgmii3_txdata(rx2_data_m1), // MAC 2 RX data
+`else
+ .sgmii3_tx_k( sgmii_tx_k[3] ),
+ .sgmii3_txdata( tx_data3 ),
+`endif
+ .sgmii3_xmit( 1'b0 ), // TODO: Auto Negotiation Bit
+ .sgmii3_signal_detect_c( 1'b1 ),
+
+ .sgmii3_ctc_del_s(),
+ .sgmii3_ctc_ins_s(),
+ .sgmii3_ctc_orun_s(),
+ .sgmii3_ctc_urun_s(),
+
+ .sgmii3_lsm_status_s( sgmii_lsm_status[3] ),
+ .sgmii3_rx_cdr_lol_s( sgmii_rx_cdr_lol[3] ),
+ .sgmii3_rx_los_low_s( sgmii_rx_los_low[3] ),
+
+
+ // DCU0 SCI
+ .sgmii0_sci_sel_dual( sci_sel_dual[0] ),
+ .sgmii0_sci_en_dual( 1'b1 ),
+ .sgmii0_sci_addr( mem_addr[5:0] ), // SCI Register Address Bits
+ .sgmii0_sci_rddata( sci_rddata0 ),
+ .sgmii0_sci_wrdata( mem_d_i[7:0] ),
+ .sgmii0_sci_rd( ~fb_oen ),
+ .sgmii0_sci_wrn( fb_rwn ),
+
+
+ .sgmii0_sci_sel( sci_sel_ch[0] ),
+ .sgmii0_sci_en( 1'b1 ),
+
+ .sgmii1_sci_sel( sci_sel_ch[1] ),
+ .sgmii1_sci_en( 1'b1 ),
+
+ .sgmii0_sci_int( sci_int[1] ),
+
+ // DCU1 SCI
+ .sgmii2_sci_sel_dual( sci_sel_dual[1] ),
+ .sgmii2_sci_en_dual( 1'b1 ),
+ .sgmii2_sci_addr( mem_addr[5:0] ), // SCI Register Address Bits
+ .sgmii2_sci_rddata( sci_rddata1 ),
+ .sgmii2_sci_wrdata( mem_d_i[7:0] ),
+ .sgmii2_sci_rd( ~fb_oen ),
+ .sgmii2_sci_wrn( fb_rwn ),
+
+ .sgmii2_sci_sel( sci_sel_ch[2] ),
+ .sgmii2_sci_en( 1'b1 ),
+
+ .sgmii2_sci_int( sci_int[0] ),
+
+ .sgmii3_sci_sel( sci_sel_ch[3] )
+
+);
+
+// Link Timer for AN
+link_timer link_timer_0(
+ .rstn(rstn),
+ .clk(pcs_pclk),
+ .pulse_1_6ms(pulse_1_6ms),
+ .pulse_10ms(pulse_10ms)
+);
+
+mdio_controller #(.ADDR_SZ( MDIO_ROM_ADDR_SZ )) mdio_controller_0
+(
+ .rstn(rstn),
+ .clk(clk_10),
+ .work_start(mdio_cont_work_start),
+ .work_run(mdio_cont_work_run),
+ .work_done(mdio_cont_work_done),
+ .routine_addr( mdio_routine_addr ),
+ .buffer_full(1'b0),
+ .addr(rom_a),
+ .di(rom_d),
+ .reg_addr(mdio_reg_addr),
+ .dout(mdio_wd),
+ .ld(mdio_ld),
+ .rwn(mdio_rwn),
+ .done(mdio_done)
+);
+
+`ifdef PHY_MARVELL
+mdio_data_mvl #(.ADDR_SZ( MDIO_ROM_ADDR_SZ )) mdio_data_mvl_0(
+ .ad( rom_a ),
+ .page( mdio_page_set ),
+ .reg_addr( mdio_reg_addr_set ),
+ .data_in_h( mdio_w_data_h_set ),
+ .data_in_l( mdio_w_data_l_set ),
+ .d( rom_d ),
+ .oe( ~mdio_mux_sel[1] )
+);
+`endif
+
+mdio_data_ti #(.ADDR_SZ( MDIO_ROM_ADDR_SZ )) mdio_data_ti_0(
+ .ad( rom_a ),
+ .page( mdio_page_set ),
+ .reg_addr( mdio_reg_addr_set ),
+ .data_in_h( mdio_w_data_h_set ),
+ .data_in_l( mdio_w_data_l_set ),
+ .d( rom_d ),
+ .oe( 1'b1 )
+);
+
+
+/* MDIO mux and output enables */
+always @(*) begin
+ case (mdio_mux_sel)
+ 2'b00: mdi = phy0_mdio;
+ 2'b01: mdi = phy1_mdio;
+ 2'b10: mdi = phy2_mdio; // compile as 0 if GIGE_SHIELD isn't defined
+ 2'b11: mdi = 1'b1;
+ endcase
+end
+
+assign phy0_mdio = (mdo_oe & ~mdio_mux_sel[1] & ~mdio_mux_sel[0]) ? mdo : 1'bz;
+assign phy1_mdio = (mdo_oe & ~mdio_mux_sel[1] & mdio_mux_sel[0]) ? mdo : 1'bz;
+assign phy2_mdio = (mdo_oe & mdio_mux_sel[1] & ~mdio_mux_sel[0]) ? mdo : 1'bz;
+
+mdio mdio_0(
+ .rstn(rstn),
+ .mdc(clk_10),
+ // MDIO
+ .mdi(mdi),
+ .mdo(mdo),
+ .mdo_oe(mdo_oe),
+ // mdio controller interface
+ .rwn(mdio_rwn),
+ .phy_addr(5'h00),
+ .reg_addr(mdio_reg_addr),
+ .di(mdio_wd),
+ .ld(mdio_ld),
+ .run( mdio_run ),
+ .done(mdio_done), // signal controller that mdio xfer is done
+ // output port to converter
+ .dout(mdio_rd),
+ .we( mdio_rd_we )
+);
+
+
+spi spi_0 (
+ .rstn(rstn),
+ .clk(clk_10),
+ // spi signals
+ .spi_cs( spi_cs ),
+ .spi_clk( spi_clk ),
+ .spi_d_in( spi_mosi),
+ .spi_d_o( spi_do ),
+ .spi_d_oe(spi_do_e ),
+ // internal FPGA memory
+ .mem_addr( mem_addr ),
+ .mux_sel ( mem_do_mux_sel ),
+ .d_i( mem_d_o ),
+ .d_o( mem_d_i ),
+ // individual memory selects
+ .we( mem_we ),
+ .oe( mem_oe ),
+ .dpram_tx_sel( dpram_tx_sel ),
+ .dpram_rx_sel( dpram_rx_sel ),
+ .dpram_ptrs_sel( dpram_ptrs_sel ),
+ .param_sel( param_sel ),
+ .pkt_filter_sel_01( pkt_filter_sel_01 ),
+ .pkt_filter_sel_02( pkt_filter_sel_02 ),
+ .pkt_filter_sel_03( pkt_filter_sel_03 ),
+ .pkt_filter_sel_10( pkt_filter_sel_10 ),
+ .pkt_filter_sel_12( pkt_filter_sel_12 ),
+ .pkt_filter_sel_13( pkt_filter_sel_13 ),
+ .pkt_filter_sel_20( pkt_filter_sel_20 ),
+ .pkt_filter_sel_21( pkt_filter_sel_21 ),
+ .pkt_filter_sel_23( pkt_filter_sel_23 ),
+ .pkt_filter_sel_2u( pkt_filter_sel_2u ),
+ .pkt_filter_sel_30( pkt_filter_sel_30 ),
+ .pkt_filter_sel_31( pkt_filter_sel_31 ),
+ .pkt_filter_sel_32( pkt_filter_sel_32 ),
+ .pkt_filter_sel_u2( pkt_filter_sel_u2 ),
+ .interrupts_sel( int_sel ),
+ .sci_sel_dual( sci_sel_dual ),
+ .sci_sel_ch( sci_sel_ch )
+);
+
+assign spi_miso = spi_do_e ? spi_do : 1'bz;
+
+/* data mux out of internal memories */
+always@(*)
+begin
+ case(mem_do_mux_sel)
+ 5'b00000: mem_d_o = { 2'b0, sci_rddata1 };
+ 5'b00001: mem_d_o = { 2'b0, sci_rddata0 };
+ 5'b00010: mem_d_o = { 1'b0, micro_fifo_do };
+ 5'b00011: mem_d_o = { 1'b0, micro_fifo_do };
+ 5'b00100: mem_d_o = { 1'b0, micro_fifo_do };
+ 5'b01000: mem_d_o = param_ram_0_do;
+ 5'b01001: mem_d_o = param_ram_1_do;
+ 5'b01010: mem_d_o = param_ram_2_do;
+ 5'b01011: mem_d_o = param_ram_3_do;
+ 5'b10000: mem_d_o = { 2'b0, int_do };
+ default: mem_d_o = 9'h0;
+ endcase
+end
+
+`ifdef DARSENA_V01
+
+// only drive the FB AD bus when OE is asserted
+assign fb_ad = fb_ad_oe ? fb_d : 10'bz;
+
+
+always@(*)
+ begin
+ case({fb_cregs_sel,mem_do_mux_sel})
+ 6'b000000: fb_d = { 2'b0, sci_rddata1 };
+ 6'b000001: fb_d = { 2'b0, sci_rddata0 };
+ 6'b000010: fb_d = { 1'b0, micro_fifo_do };
+ 6'b000011: fb_d = { 1'b0, micro_fifo_do };
+ 6'b000100: fb_d = { 1'b0, micro_fifo_do };
+ 6'b010000: fb_d = { 2'b0, int_do };
+ default: fb_d = fb_ad_o;
+ endcase
+ end
+
+
+flexbus flexbus_0(
+ .clk( fb_clk ),
+ .rstn( rstn ),
+ // strobes
+ .fb_ale( fb_ale ),
+ .fb_oen( fb_oen ),
+ .fb_rwn( fb_rwn ),
+ .fb_csn( fb_csn ),
+ // control
+ .cregs_sel( fb_cregs_sel ),
+ // muxed addr and data
+ .fb_ad_i( fb_ad ),
+ .fb_ad_o( fb_ad_o ),
+ .fb_ad_oe( fb_ad_oe ),
+ // sys mem
+ .mem_addr( mem_addr ),
+ .mux_sel ( mem_do_mux_sel ),
+ // dpram controls
+ .dpram_we( mem_we ),
+ .dpram_oe( mem_oe ),
+ .dpram_tx_sel( dpram_tx_sel ),
+ .dpram_rx_sel( dpram_rx_sel ),
+ .dpram_ptrs_sel( dpram_ptrs_sel ),
+ .param_sel( param_sel ),
+ .pkt_filter_sel_01( pkt_filter_sel_01 ),
+ .pkt_filter_sel_02( pkt_filter_sel_02 ),
+ .pkt_filter_sel_10( pkt_filter_sel_10 ),
+ .pkt_filter_sel_12( pkt_filter_sel_12 ),
+ .pkt_filter_sel_20( pkt_filter_sel_20 ),
+ .pkt_filter_sel_21( pkt_filter_sel_21 ),
+ .pkt_filter_sel_23( pkt_filter_sel_23 ),
+ .interrupts_sel( int_sel ),
+ // SCI I/F
+ .sci_sel_dual( sci_sel_dual ),
+ .sci_sel_ch( sci_sel_ch )
+);
+
+`endif
+
+interrupts interrupts_0(
+ .rstn( rstn ),
+ .clk( pcs_pclk ),
+ .uc_clk( clk_10 ),
+ // uC interface
+ .sel( int_sel ),
+ .we( mem_we ),
+ .addr( mem_addr[0] ),
+ .d_in( mem_d_i[6:0] ),
+ .d_out( int_do ),
+ // interrupt sources
+ .cont_int( micro_fifo_int ),
+ .phy_int ( { 2'b0, phy1_intn, phy0_intn }),
+ .mac_int ( { mac_int[3], mac_int[2], mac_int[1], mac_int[0] } ),
+ .int_o( )
+);
+
+
+assign i2c_sda = sda_oe ? sda_o : 1'bz;
+assign i2c_scl = scl_oe ? scl_o : 1'bz;
+
+i2c i2c_0(
+ .rstn( rstn ),
+ .clk( clk_10 ),
+ // external I2C I/O
+ .scl_i( i2c_scl ),
+ .scl_o( scl_o ),
+ .scl_oe( scl_oe ),
+ .sda_i( i2c_sda ),
+ .sda_o( sda_o ),
+ .sda_oe( sda_oe ),
+ // shared memory and controller data output
+ .mem_do( i2c_d_o ),
+ // dedicated memory interface
+ .mem_ad( ),
+ .mem_we( ),
+ .mem_ce( ),
+ .mem_di( 8'haa ),
+ // dedicated controller write interface
+ .cont_we( i2c_cont_we ),
+ .cont_done( i2c_cont_done ),
+ // Controller->FIFO input interface
+ .fifo_re( i2c_fifo_re ),
+ .tx_fifo_empty( cont_fifo_empty ),
+ .fifo_di( fifo_r_d[6:0] )
+);
+
+
+/*
+* ext_sys_fifo delays and enables:
+* we need the re delay since we need to generate a re pulse from the
+* uart block, which is clocked at a slower rate.
+* we need the mdio_we delay since the fifo is clocked twice: high and low data
+*
+*/
+always@ ( posedge clk_10 or negedge rstn )
+ begin
+ if ( !rstn )
+ begin
+ cont_fifo_re_m1 <= 1'b0;
+ cont_fifo_re_m2 <= 1'b0;
+ end
+ else
+ begin
+ cont_fifo_re_m1 <= uart_fifo_re | i2c_fifo_re;
+ cont_fifo_re_m2 <= cont_fifo_re_m1;
+ end
+ end
+
+// create a single re pulse since uart runs slow.
+assign i_cont_fifo_re = cont_fifo_re_m1 & ~cont_fifo_re_m2;
+
+assign bin_to_ascii_we = mdio_rd_we | cont_rd_we;
+assign bin_to_ascii_d_in = read_fifo_mux_sel ? mdio_rd : cont_rd;
+
+/*
+ * Input: MDIO writes
+ * Output: UART/I2C read FIFO
+ */
+bin_to_ascii bin_to_ascii_0(
+ .rstn( rstn ),
+ .clk( clk_10 ),
+ .width ( 1'b1 ),
+ // mdio interface
+ .we_i ( bin_to_ascii_we ),
+ .d_in( bin_to_ascii_d_in ),
+ // mdio controller interface
+ .run ( bin_to_ascii_run ),
+ .done (),
+ .busy( 1'b0 ),
+ // fifo port
+ .we_o ( read_fifo_we ),
+ .d_out( read_fifo_d_i )
+);
+
+/*
+ * Input: bin_to_ascii
+ * Output: I2C or UART read
+ */
+sync_fifo ext_sys_fifo_0(
+ .rstn( rstn ),
+ .clk ( clk_10 ),
+ // input
+ .we ( read_fifo_we ),
+ .d_in ( { 2'b0, read_fifo_d_i } ),
+ // output
+ .re ( i_cont_fifo_re ),
+ .d_out( fifo_r_d ),
+ .empty( cont_fifo_empty ),
+ .almost_full( ),
+ .reset_ptrs( 1'b0 ),
+ // debug
+ .active( )
+);
+
+always @(*) begin
+ case (mdio_mux_sel)
+ 2'b00: rx_cdr_lol = sgmii_rx_cdr_lol[0];
+ 2'b01: rx_cdr_lol = sgmii_rx_cdr_lol[1];
+ 2'b10: rx_cdr_lol = sgmii_rx_cdr_lol[2];
+ 2'b11: rx_cdr_lol = 1'b1;
+ endcase
+end
+
+always @(*) begin
+ case (mdio_mux_sel)
+ 2'b00: lsm_status = sgmii_lsm_status[0];
+ 2'b01: lsm_status = sgmii_lsm_status[1];
+ 2'b10: lsm_status = sgmii_lsm_status[2];
+ 2'b11: lsm_status = 1'b1;
+ endcase
+end
+
+always @(*) begin
+ case (mdio_mux_sel)
+ 2'b00: rx_los_low = sgmii_rx_los_low[0];
+ 2'b01: rx_los_low = sgmii_rx_los_low[1];
+ 2'b10: rx_los_low = sgmii_rx_los_low[2];
+ 2'b11: rx_los_low = 1'b1;
+ endcase
+end
+
+/* Debug and Arduino Expansion */
+
+assign led[0] = 1'b1;
+assign led[1] = phy_up[0];
+assign led[2] = phy_up[1];
+
+`ifdef DEBUG_SPI
+ assign ard_scl = spi_clk;
+ assign ard_sda = spi_cs;
+ assign ard_rxd1 = spi_do_e ? spi_do : 1'bz;
+ assign ard_txd1 = spi_mosi;
+`elsif DEBUG_MDIO
+ assign ard_scl = phy_mdc;
+ assign ard_sda = phy0_mdio;
+ assign ard_rxd1 = 1'bz;
+ assign ard_txd1 = refclko;
+`elsif DEBUG_IC2
+ assign ard_scl = i2c_scl;
+ assign ard_sda = sda_oe ? sda_o : i2c_sda;
+ assign ard_rxd1 = 1'bz;
+ assign ard_txd1 = sda_oe;
+`else
+ assign ard_scl = rx_sop[0];
+ assign ard_sda = 1'bz;
+`endif
+
+`ifdef ARD_EXP_UART
+ assign ard_txd2 = uart_txd;
+ assign uart_rxd = ard_rxd2;
+ assign ftdi_tdi_rxd = 1'bz;
+`else
+
+ // assign uart_rxd = ftdi_tck_txd;
+`endif
+
+ assign ftdi_tdi_rxd = 1'bz;
+
+ assign pe1 = pcs_error[2]; // RX data on SFP good
+ assign pe4 = ~sgmii_tx_k[2];
+ assign pe5 = phy1_gpio[1];
+ assign pg5 = 1'bz;
+ assign pe3 = fpga_gpio;
+
+`ifdef SHIELD_SFP_SMA
+
+ // SFP UART testing
+ assign uart_rxd = ph3;
+ assign ph4 = uart_txd;
+
+ // SFP LEDS
+ assign sfp_led1 = !sfp_pres_n;
+ assign sfp_led2 = !sfp_tx_fault;
+ assign sfp_led3 = !sfp_los;
+ assign sfp_led4 = !pcs_error[2];
+ assign sfp_led5 = phy_up[0];
+ assign sfp_led6 = !mac_tx_active[0];
+`endif
+
+ assign fpga_int = pcs_error[2] | pcs_error[3];
+
+`ifdef DARSENA_V02
+ assign fpga_jtag_e =1'b1;
+`endif
+
+endmodule