// ---------------------------------------------------------------------- // "THE BEER-WARE LICENSE" (Revision 42): // wrote this file. As long as you retain this // notice you can do whatever you want with this stuff. If we meet // some day, and you think this stuff is worth it, you can buy me a // beer in return Yasunori Osana at University of the Ryukyus, // Japan. // ---------------------------------------------------------------------- // OpenFC project: an open FPGA accelerated cluster toolkit // Kyokko project: an open Multi-vendor Aurora 64B/66B-compatible link // // Modules in this file: // s10_gx_4ch: Quad Stratix 10 transceiver wrapper in GX mode // c10_phy_bitorder: Bit order reverser for Intel GX transceivers // ---------------------------------------------------------------------- `default_nettype none module s10_xcvr_4ch # ( parameter NumCh=4, BondingEnable=0 ) ( input wire RST, // RST somehow input wire USRCLK, // assumed to be 250MHz input wire REFCLK644P, input wire [NumCh-1:0] SFP_RXP, output wire [NumCh-1:0] SFP_TXP, input wire [NumCh*64-1:0] TX_DATA, output wire [NumCh*64-1:0] RX_DATA, input wire [NumCh*2-1:0] TX_CTRL, output wire [NumCh*2-1:0] RX_CTRL, output wire [NumCh-1:0] TX_USRCLK, RX_USRCLK, input wire [NumCh-1:0] TX_VALID, RX_BITSLIP, output wire PLL_LOCKED, output wire [NumCh-1:0] RX_LOCKED ); wire [NumCh-1:0] TX_ARST, TX_DRST, RX_ARST, RX_DRST, TX_ASTAT, TX_DSTAT, RX_ASTAT, RX_DSTAT; wire [NumCh-1:0] TX_CALBUSY, TX_READY; wire [NumCh-1:0] RX_CALBUSY, RX_READY; phy_rst_ctrl_4ch phy_rst ( .clock (USRCLK), // I assumed to be 250MHz .reset (RST), // I .tx_analogreset (TX_ARST), // O [NumCh-1:0] .tx_analogreset_stat (TX_ASTAT), // I [NumCh-1:0] .tx_digitalreset_stat(TX_DSTAT), // I [NumCh-1:0] .tx_digitalreset (TX_DRST), // O [NumCh-1:0] .tx_ready (TX_READY), // O [NumCh-1:0] .pll_locked (PLL_LOCKED), // I .pll_select (1'b0), // I .tx_cal_busy (TX_CALBUSY), // I [NumCh-1:0] .rx_analogreset (RX_ARST), // O [NumCh-1:0] .rx_digitalreset (RX_DRST), // O [NumCh-1:0] .rx_analogreset_stat (RX_ASTAT), // I [NumCh-1:0] .rx_digitalreset_stat(RX_DSTAT), // I [NumCh-1:0] .rx_ready (RX_READY), // O [NumCh-1:0] .rx_is_lockedtodata (RX_LOCKED), // I [NumCh-1:0] .rx_cal_busy (RX_CALBUSY) // I [NumCh-1:0] ); wire [NumCh-1:0] [63:0] RX_DATAi; wire [NumCh-1:0] [63:0] TX_DATAi; wire [NumCh-1:0] [1:0] RX_CTRLi, TX_CTRLi; wire [NumCh-1:0] TX_DLL_LOCK; wire TX_SCLK; wire [5:0] TX_BCLK; // bonding clock generate if (BondingEnable==0) begin : no_bond_gen atx_5g atxpll ( .pll_refclk0 (REFCLK644P), // I .tx_serial_clk (TX_SCLK), // O .pll_locked (PLL_LOCKED), // O .pll_cal_busy () ); // O phy_10g_4ch phy0 ( .tx_analogreset (TX_ARST ), // I .tx_digitalreset (TX_DRST ), // I .rx_analogreset (RX_ARST ), // I .rx_digitalreset (RX_DRST ), // I .tx_analogreset_stat (TX_ASTAT ), // O .tx_digitalreset_stat (TX_DSTAT ), // O .rx_analogreset_stat (RX_ASTAT ), // O .rx_digitalreset_stat (RX_DSTAT ), // O .tx_cal_busy (TX_CALBUSY), // O .rx_cal_busy (RX_CALBUSY), // O .tx_serial_clk0 ({NumCh{TX_SCLK}}), // I .rx_cdr_refclk0 (REFCLK644P), // I .tx_serial_data (SFP_TXP ), // O .rx_serial_data (SFP_RXP ), // I .rx_is_lockedtoref (), // O .rx_is_lockedtodata (RX_LOCKED ), // O .tx_coreclkin (TX_USRCLK ), // I .rx_coreclkin (RX_USRCLK ), // I .tx_clkout (TX_USRCLK ), // O PMA divclk .rx_clkout (RX_USRCLK ), // O PMA divclk .tx_parallel_data (TX_DATAi), // I [63:0] .tx_control (TX_CTRLi), // I [1:0] .unused_tx_parallel_data (), // I .rx_fifo_rd_en ({NumCh{1'b1}}), // I .rx_parallel_data (RX_DATAi), // O [63:0] .rx_control (RX_CTRLi), // O [1:0] .unused_rx_parallel_data (), // O .rx_bitslip (RX_BITSLIP), // I .tx_dll_lock (TX_DLL_LOCK), // O .tx_fifo_wr_en ({NumCh{TX_VALID[0]}} & TX_DLL_LOCK) // I ); end else begin : bond_gen atx_5g_4cb atxpll ( .pll_refclk0 (REFCLK644P), // I .tx_serial_clk (), // O .pll_locked (PLL_LOCKED), // O .pll_cal_busy (), // O .tx_bonding_clocks (TX_BCLK) ); wire TXCLKc, RXCLKc; assign TX_USRCLK = {NumCh{TXCLKc}}; assign RX_USRCLK = {NumCh{RXCLKc}}; phy_10g_4cb phy0 ( .tx_analogreset (TX_ARST ), // I .tx_digitalreset (TX_DRST ), // I .rx_analogreset (RX_ARST ), // I .rx_digitalreset (RX_DRST ), // I .tx_analogreset_stat (TX_ASTAT ), // O .tx_digitalreset_stat (TX_DSTAT ), // O .rx_analogreset_stat (RX_ASTAT ), // O .rx_digitalreset_stat (RX_DSTAT ), // O .tx_cal_busy (TX_CALBUSY), // O .rx_cal_busy (RX_CALBUSY), // O .tx_bonding_clocks ({NumCh{TX_BCLK}}), // I .rx_cdr_refclk0 (REFCLK644P), // I .tx_serial_data (SFP_TXP ), // O .rx_serial_data (SFP_RXP ), // I .rx_is_lockedtoref (), // O .rx_is_lockedtodata (RX_LOCKED ), // O .tx_coreclkin (TX_USRCLK ), // I .rx_coreclkin (RX_USRCLK ), // I .tx_clkout (TXCLKc ), // O PMA divclk .rx_clkout (RXCLKc ), // O PMA divclk .tx_parallel_data (TX_DATAi), // I [63:0] .tx_control (TX_CTRLi), // I [1:0] .unused_tx_parallel_data (), // I .rx_fifo_rd_en ({NumCh{1'b1}}), // I .rx_parallel_data (RX_DATAi), // O [63:0] .rx_control (RX_CTRLi), // O [1:0] .unused_rx_parallel_data (), // O .rx_bitslip (RX_BITSLIP), // I .tx_dll_lock (TX_DLL_LOCK), // O .tx_fifo_wr_en ({NumCh{TX_VALID[0]}} & TX_DLL_LOCK) // I ); end endgenerate generate genvar ch; for (ch=0; ch