diff --git a/README.md b/README.md index 449ebccfc..f67f880d6 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Corundum currently supports Xilinx Virtex 7, UltraScale, and UltraScale+ series * Exablaze ExaNIC X25/Cisco Nexus K3P-S (Xilinx Kintex UltraScale+ XCKU3P) * Silicom fb2CG@KU15P (Xilinx Kintex UltraScale+ XCKU15P) * NetFPGA SUME (Xilinx Virtex 7 XC7V690T) +* Intel Stratix 10 MX dev kit (Intel Stratix 10 MX 1SM21CHU1F53E1VG) * Xilinx Alveo U50 (Xilinx Virtex UltraScale+ XCU50) * Xilinx Alveo U200 (Xilinx Virtex UltraScale+ XCU200) * Xilinx Alveo U250 (Xilinx Virtex UltraScale+ XCU250) diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/README.md b/fpga/mqnic/S10MX_DK/fpga_10g/README.md new file mode 100644 index 000000000..8245d1ad3 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/README.md @@ -0,0 +1,18 @@ +# Corundum mqnic for Stratix 10 MX + +## Introduction + +This design targets the Intel Stratix 10 MX FPGA development board. + +* FPGA: 1SM21BHU2F53E1VG (8 GB HBM2) or 1SM21CHU1F53E1VG (16 GB HBM2) +* PHY: Transceiver in 10G BASE-R native mode + +## How to build + +Run make to build. Ensure that the Intel Quartus Prime Pro toolchain components are in PATH. + +Run make to build the driver. Ensure the headers for the running kernel are installed, otherwise the driver cannot be compiled. + +## How to test + +Run make program to program the board with the Intel software. Then load the driver with insmod mqnic.ko. Check dmesg for output from driver initialization. diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/app b/fpga/mqnic/S10MX_DK/fpga_10g/app new file mode 120000 index 000000000..4d46690fb --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/app @@ -0,0 +1 @@ +../../../app/ \ No newline at end of file diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/common/quartus_pro.mk b/fpga/mqnic/S10MX_DK/fpga_10g/common/quartus_pro.mk new file mode 100644 index 000000000..c8d3d8396 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/common/quartus_pro.mk @@ -0,0 +1,188 @@ +################################################################### +# +# Makefile for Intel Quartus Prime Pro +# +# Alex Forencich +# +################################################################### +# +# Parameters: +# FPGA_TOP - Top module name +# FPGA_FAMILY - FPGA family (e.g. Stratix 10 DX) +# FPGA_DEVICE - FPGA device (e.g. 1SD280PT2F55E1VG) +# SYN_FILES - space-separated list of source files +# IP_FILES - space-separated list of IP files +# IP_TCL_FILES - space-separated list of TCL files for qsys-script +# QSF_FILES - space-separated list of settings files +# SDC_FILES - space-separated list of timing constraint files +# +# Example: +# +# FPGA_TOP = fpga +# FPGA_FAMILY = "Stratix 10 DX" +# FPGA_DEVICE = 1SD280PT2F55E1VG +# SYN_FILES = rtl/fpga.v +# QSF_FILES = fpga.qsf +# SDC_FILES = fpga.sdc +# include ../common/quartus_pro.mk +# +################################################################### + +# phony targets +.PHONY: clean fpga + +# output files to hang on to +.PRECIOUS: %.sof %.ipregen.rpt %.syn.rpt %.fit.rpt %.asm.rpt %.sta.rpt +.SECONDARY: + +# any project specific settings +CONFIG ?= config.mk +-include ../$(CONFIG) + +SYN_FILES_REL = $(patsubst %, ../%, $(filter-out /% ./%,$(SYN_FILES))) $(filter /% ./%,$(SYN_FILES)) + +IP_FILES_REL = $(patsubst %, ../%, $(IP_FILES)) +IP_FILES_INT = $(patsubst %, ip/%, $(notdir $(IP_FILES))) + +IP_TCL_FILES_REL = $(patsubst %, ../%, $(IP_TCL_FILES)) +IP_TCL_FILES_INT = $(patsubst %, ip/%, $(notdir $(IP_TCL_FILES))) +IP_TCL_FILES_IP_INT = $(patsubst %.tcl, ip/%.ip, $(notdir $(IP_TCL_FILES))) + +CONFIG_TCL_FILES_REL = $(patsubst %, ../%, $(filter-out /% ./%,$(CONFIG_TCL_FILES))) $(filter /% ./%,$(CONFIG_TCL_FILES)) + +ifdef QSF_FILES + QSF_FILES_REL = $(patsubst %, ../%, $(filter-out /% ./%,$(QSF_FILES))) $(filter /% ./%,$(QSF_FILES)) +else + QSF_FILES_REL = ../$(FPGA_TOP).qsf +endif + +SDC_FILES_REL = $(patsubst %, ../%, $(SDC_FILES)) + +ASSIGNMENT_FILES = $(FPGA_TOP).qpf $(FPGA_TOP).qsf + +################################################################### +# Main Targets +# +# all: build everything +# clean: remove output files and database +################################################################### + +all: fpga + +fpga: $(FPGA_TOP).sof + +quartus: $(FPGA_TOP).qpf + quartus $(FPGA_TOP).qpf + +tmpclean:: + -rm -rf defines.v + -rm -rf *.rpt *.summary *.done *.smsg *.chg smart.log *.htm *.eqn *.pin *.qsf *.qpf *.sld *.txt *.qws *.stp + -rm -rf ip db qdb incremental_db reconfig_mif tmp-clearbox synth_dumps .qsys_edit + -rm -rf create_project.tcl update_config.tcl update_ip_*.tcl + +clean:: tmpclean + -rm -rf *.sof *.pof *.jdi *.jic *.map + +distclean:: clean + -rm -rf rev + +syn: smart.log output_files/$(PROJECT).syn.rpt +fit: smart.log output_files/$(PROJECT).fit.rpt +asm: smart.log output_files/$(PROJECT).asm.rpt +sta: smart.log output_files/$(PROJECT).sta.rpt +smart: smart.log + +################################################################### +# Executable Configuration +################################################################### + +IP_ARGS = --run_default_mode_op +SYN_ARGS = --read_settings_files=on --write_settings_files=off +FIT_ARGS = --read_settings_files=on --write_settings_files=off +ASM_ARGS = --read_settings_files=on --write_settings_files=off +STA_ARGS = + +################################################################### +# Target implementations +################################################################### + +STAMP = echo done > + +define COPY_IP_RULE +$(patsubst %, ip/%, $(notdir $(1))): $(1) + @mkdir -p ip + @cp -pv $(1) ip/ +endef +$(foreach l,$(IP_FILES_REL) $(IP_TCL_FILES_REL),$(eval $(call COPY_IP_RULE,$(l)))) + +define TCL_IP_GEN_RULE +$(patsubst %.tcl,%.ip,$(1)): $(1) + cd ip && rm -f $(patsubst %.tcl,%,$(notdir $(1))).{qpf,qsf} + cd ip && qsys-script --script=$(notdir $(1)) +endef +$(foreach l,$(IP_TCL_FILES_INT),$(eval $(call TCL_IP_GEN_RULE,$(l)))) + +%.ipregen.rpt: $(FPGA_TOP).qpf $(IP_FILES_INT) $(IP_TCL_FILES_IP_INT) + quartus_ipgenerate $(IP_ARGS) $(FPGA_TOP) + +%.syn.rpt: syn.chg %.ipregen.rpt $(SYN_FILES_REL) + quartus_syn $(SYN_ARGS) $(FPGA_TOP) + +%.fit.rpt: fit.chg %.syn.rpt $(SDC_FILES_REL) + quartus_fit $(FIT_ARGS) $(FPGA_TOP) + +%.sta.rpt: sta.chg %.fit.rpt + quartus_sta $(STA_ARGS) $(FPGA_TOP) + +%.asm.rpt: asm.chg %.sta.rpt + quartus_asm $(ASM_ARGS) $(FPGA_TOP) + mkdir -p rev + EXT=sof; COUNT=100; \ + while [ -e rev/$*_rev$$COUNT.$$EXT ]; \ + do let COUNT=COUNT+1; done; \ + cp $*.$$EXT rev/$*_rev$$COUNT.$$EXT; \ + echo "Output: rev/$*_rev$$COUNT.$$EXT"; + +%.sof: smart.log %.asm.rpt + + +smart.log: $(ASSIGNMENT_FILES) + quartus_sh --determine_smart_action $(FPGA_TOP) > smart.log + +################################################################### +# Project initialization +################################################################### + +create_project.tcl: Makefile $(QSF_FILES_REL) | $(IP_FILES_INT) $(IP_TCL_FILES_IP_INT) + rm -f update_config.tcl + echo "project_new $(FPGA_TOP) -overwrite" > $@ + echo "set_global_assignment -name FAMILY \"$(FPGA_FAMILY)\"" >> $@ + echo "set_global_assignment -name DEVICE \"$(FPGA_DEVICE)\"" >> $@ + for x in $(SYN_FILES_REL) $(IP_FILES_INT) $(IP_TCL_FILES_IP_INT); do \ + case $${x##*.} in \ + v|V) echo set_global_assignment -name VERILOG_FILE "$$x" >> $@ ;;\ + vhd|VHD) echo set_global_assignment -name VHDL_FILE "$$x" >> $@ ;;\ + qip|QIP) echo set_global_assignment -name QIP_FILE "$$x" >> $@ ;;\ + ip|IP) echo set_global_assignment -name IP_FILE "$$x" >> $@ ;;\ + *) echo set_global_assignment -name SOURCE_FILE "$$x" >> $@ ;;\ + esac; \ + done + for x in $(SDC_FILES_REL); do echo set_global_assignment -name SDC_FILE "$$x" >> $@; done + for x in $(QSF_FILES_REL); do echo source "$$x" >> $@; done + +update_config.tcl: $(CONFIG_TCL_FILES_REL) + echo "project_open $(FPGA_TOP)" > $@ + for x in $(CONFIG_TCL_FILES_REL); do echo source "$$x" >> $@; done + +$(ASSIGNMENT_FILES): create_project.tcl update_config.tcl + for x in $?; do quartus_sh -t "$$x"; done + touch -c $(ASSIGNMENT_FILES) + +syn.chg: + $(STAMP) syn.chg +fit.chg: + $(STAMP) fit.chg +sta.chg: + $(STAMP) sta.chg +asm.chg: + $(STAMP) asm.chg diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga.qsf b/fpga/mqnic/S10MX_DK/fpga_10g/fpga.qsf new file mode 100644 index 000000000..bdc19e66f --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga.qsf @@ -0,0 +1,660 @@ +# I/O constraints for the Intel Stratix 10 MX FPGA development board +# part: 1SM21BHU2F53E1VG (DK-DEV-1SMX-H-A with 8 GB HBM2) +# part: 1SM21CHU1F53E1VG (DK-DEV-1SMC-H-A with 16 GB HBM2) + +set_global_assignment -name USE_CONF_DONE SDM_IO16 +set_global_assignment -name USE_INIT_DONE SDM_IO0 +set_global_assignment -name USE_CVP_CONFDONE SDM_IO15 + +set_global_assignment -name USE_PWRMGT_SCL SDM_IO14 +set_global_assignment -name USE_PWRMGT_SDA SDM_IO11 +set_global_assignment -name PWRMGT_BUS_SPEED_MODE "100 KHZ" +set_global_assignment -name PWRMGT_SLAVE_DEVICE_TYPE OTHER +set_global_assignment -name PWRMGT_SLAVE_DEVICE0_ADDRESS 47 +set_global_assignment -name PWRMGT_SLAVE_DEVICE1_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE2_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE3_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE4_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE5_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE6_ADDRESS 00 +set_global_assignment -name PWRMGT_SLAVE_DEVICE7_ADDRESS 00 +set_global_assignment -name PWRMGT_TRANSLATED_VOLTAGE_VALUE_UNIT VOLTS +set_global_assignment -name PWRMGT_PAGE_COMMAND_ENABLE ON + +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100 +set_global_assignment -name ON_CHIP_BITSTREAM_DECOMPRESSION ON +set_global_assignment -name DEVICE_INITIALIZATION_CLOCK OSC_CLK_1_125MHZ +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "ACTIVE SERIAL X4" +set_global_assignment -name ACTIVE_SERIAL_CLOCK AS_FREQ_100MHZ +set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name USE_CHECKSUM_AS_USERCODE ON +set_global_assignment -name GENERATE_PR_RBF_FILE ON +set_global_assignment -name ENABLE_ED_CRC_CHECK ON +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256 +set_global_assignment -name MINIMUM_SEU_INTERVAL 10969 + +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "AS INPUT TRI-STATED" + +set_global_assignment -name PRESERVE_UNUSED_XCVR_CHANNEL ON + +# Clock and reset +set_location_assignment PIN_BE17 -to "clk_sys_50m_p" +set_location_assignment PIN_BD17 -to "clk_sys_50m_n" +set_location_assignment PIN_AU17 -to "clk_sys_100m_p" +set_location_assignment PIN_AU16 -to "clk_sys_100m_n" + +set_location_assignment PIN_AT13 -to "clk_core_bak_p" +set_location_assignment PIN_AU13 -to "clk_core_bak_n" + +set_location_assignment PIN_AR26 -to "clk_uib0_p" +set_location_assignment PIN_AP26 -to "clk_uib0_n" +set_location_assignment PIN_P27 -to "clk_uib1_p" +set_location_assignment PIN_R27 -to "clk_uib1_n" + +set_location_assignment PIN_AU31 -to "clk_esram0_p" +set_location_assignment PIN_AU32 -to "clk_esram0_n" +set_location_assignment PIN_V31 -to "clk_esram1_p" +set_location_assignment PIN_U31 -to "clk_esram1_n" + +set_location_assignment PIN_A42 -to "clk_ddr4_comp_p" +set_location_assignment PIN_B41 -to "clk_ddr4_comp_n" + +set_location_assignment PIN_B18 -to "clk_ddr4_dimm_p" +set_location_assignment PIN_C18 -to "clk_ddr4_dimm_n" + +set_instance_assignment -name IO_STANDARD LVDS -to "clk_sys_50m_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_sys_100m_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_core_bak_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_uib0_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_uib1_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_esram0_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_esram1_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_ddr4_comp_p" +set_instance_assignment -name IO_STANDARD LVDS -to "clk_ddr4_dimm_p" + +# Switches, buttons, LEDs +set_location_assignment PIN_BL14 -to "cpu_resetn" + +set_location_assignment PIN_BH11 -to "user_led[3]" +set_location_assignment PIN_BG11 -to "user_led[2]" +set_location_assignment PIN_BF12 -to "user_led[1]" +set_location_assignment PIN_BG12 -to "user_led[0]" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "user_led[*]" + +# I2C +set_location_assignment PIN_BE14 -to "main_i2c_scl" +set_location_assignment PIN_BF13 -to "main_i2c_sda" +set_location_assignment PIN_D29 -to "ddr4_dimm_sda" +set_location_assignment PIN_H30 -to "ddr4_dimm_scl" +set_location_assignment PIN_BH14 -to "pcie_ep_i2c_sda" +set_location_assignment PIN_BH15 -to "pcie_ep_i2c_scl" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "main_i2c_scl" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "main_i2c_sda" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "ddr4_dimm_sda" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "ddr4_dimm_scl" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_ep_i2c_sda" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_ep_i2c_scl" + +# PCIe EP +set_location_assignment PIN_BH45 -to "pcie_ep_tx_p[0]" +set_location_assignment PIN_BH44 -to "pcie_ep_tx_n[0]" +set_location_assignment PIN_BL47 -to "pcie_ep_rx_p[0]" +set_location_assignment PIN_BL46 -to "pcie_ep_rx_n[0]" +set_location_assignment PIN_BJ47 -to "pcie_ep_tx_p[1]" +set_location_assignment PIN_BJ46 -to "pcie_ep_tx_n[1]" +set_location_assignment PIN_BK49 -to "pcie_ep_rx_p[1]" +set_location_assignment PIN_BK48 -to "pcie_ep_rx_n[1]" +set_location_assignment PIN_BG47 -to "pcie_ep_tx_p[2]" +set_location_assignment PIN_BG46 -to "pcie_ep_tx_n[2]" +set_location_assignment PIN_BH49 -to "pcie_ep_rx_p[2]" +set_location_assignment PIN_BH48 -to "pcie_ep_rx_n[2]" +set_location_assignment PIN_BF45 -to "pcie_ep_tx_p[3]" +set_location_assignment PIN_BF44 -to "pcie_ep_tx_n[3]" +set_location_assignment PIN_BG51 -to "pcie_ep_rx_p[3]" +set_location_assignment PIN_BG50 -to "pcie_ep_rx_n[3]" +set_location_assignment PIN_BE47 -to "pcie_ep_tx_p[4]" +set_location_assignment PIN_BE46 -to "pcie_ep_tx_n[4]" +set_location_assignment PIN_BF49 -to "pcie_ep_rx_p[4]" +set_location_assignment PIN_BF48 -to "pcie_ep_rx_n[4]" +set_location_assignment PIN_BD45 -to "pcie_ep_tx_p[5]" +set_location_assignment PIN_BD44 -to "pcie_ep_tx_n[5]" +set_location_assignment PIN_BE51 -to "pcie_ep_rx_p[5]" +set_location_assignment PIN_BE50 -to "pcie_ep_rx_n[5]" +set_location_assignment PIN_BB45 -to "pcie_ep_tx_p[6]" +set_location_assignment PIN_BB44 -to "pcie_ep_tx_n[6]" +set_location_assignment PIN_BD49 -to "pcie_ep_rx_p[6]" +set_location_assignment PIN_BD48 -to "pcie_ep_rx_n[6]" +set_location_assignment PIN_BC47 -to "pcie_ep_tx_p[7]" +set_location_assignment PIN_BC46 -to "pcie_ep_tx_n[7]" +set_location_assignment PIN_BC51 -to "pcie_ep_rx_p[7]" +set_location_assignment PIN_BC50 -to "pcie_ep_rx_n[7]" +set_location_assignment PIN_BA47 -to "pcie_ep_tx_p[8]" +set_location_assignment PIN_BA46 -to "pcie_ep_tx_n[8]" +set_location_assignment PIN_BB49 -to "pcie_ep_rx_p[8]" +set_location_assignment PIN_BB48 -to "pcie_ep_rx_n[8]" +set_location_assignment PIN_AY45 -to "pcie_ep_tx_p[9]" +set_location_assignment PIN_AY44 -to "pcie_ep_tx_n[9]" +set_location_assignment PIN_BA51 -to "pcie_ep_rx_p[9]" +set_location_assignment PIN_BA50 -to "pcie_ep_rx_n[9]" +set_location_assignment PIN_AW47 -to "pcie_ep_tx_p[10]" +set_location_assignment PIN_AW46 -to "pcie_ep_tx_n[10]" +set_location_assignment PIN_AY49 -to "pcie_ep_rx_p[10]" +set_location_assignment PIN_AY48 -to "pcie_ep_rx_n[10]" +set_location_assignment PIN_AV45 -to "pcie_ep_tx_p[11]" +set_location_assignment PIN_AV44 -to "pcie_ep_tx_n[11]" +set_location_assignment PIN_AW51 -to "pcie_ep_rx_p[11]" +set_location_assignment PIN_AW50 -to "pcie_ep_rx_n[11]" +set_location_assignment PIN_AU47 -to "pcie_ep_tx_p[12]" +set_location_assignment PIN_AU46 -to "pcie_ep_tx_n[12]" +set_location_assignment PIN_AV49 -to "pcie_ep_rx_p[12]" +set_location_assignment PIN_AV48 -to "pcie_ep_rx_n[12]" +set_location_assignment PIN_AT45 -to "pcie_ep_tx_p[13]" +set_location_assignment PIN_AT44 -to "pcie_ep_tx_n[13]" +set_location_assignment PIN_AU51 -to "pcie_ep_rx_p[13]" +set_location_assignment PIN_AU50 -to "pcie_ep_rx_n[13]" +set_location_assignment PIN_AR47 -to "pcie_ep_tx_p[14]" +set_location_assignment PIN_AR46 -to "pcie_ep_tx_n[14]" +set_location_assignment PIN_AT49 -to "pcie_ep_rx_p[14]" +set_location_assignment PIN_AT48 -to "pcie_ep_rx_n[14]" +set_location_assignment PIN_AP45 -to "pcie_ep_tx_p[15]" +set_location_assignment PIN_AP44 -to "pcie_ep_tx_n[15]" +set_location_assignment PIN_AR51 -to "pcie_ep_rx_p[15]" +set_location_assignment PIN_AR50 -to "pcie_ep_rx_n[15]" + +set_location_assignment PIN_AW43 -to "refclk_pcie_ep_p" +set_location_assignment PIN_AW42 -to "refclk_pcie_ep_n" + +set_location_assignment PIN_AR43 -to "refclk_pcie_ep_edge_p" +set_location_assignment PIN_AR42 -to "refclk_pcie_ep_edge_n" + +set_location_assignment PIN_BA43 -to "refclk_pcie_ep1_p" +set_location_assignment PIN_BA42 -to "refclk_pcie_ep1_n" + +set_location_assignment PIN_BH16 -to "pcie_ep_waken" + +set_location_assignment PIN_AH39 -to "s10_pcie_perstn0" +set_location_assignment PIN_BL10 -to "s10_pcie_perstn1" + +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "pcie_ep_tx_p[*]" +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "pcie_ep_rx_p[*]" + +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "pcie_ep_tx_p[*]" +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "pcie_ep_rx_p[*]" + +set_instance_assignment -name IO_STANDARD "HCSL" -to "refclk_pcie_ep_p" +set_instance_assignment -name IO_STANDARD "HCSL" -to "refclk_pcie_ep_edge_p" +set_instance_assignment -name IO_STANDARD "HCSL" -to "refclk_pcie_ep1_p" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_ep_waken" +set_instance_assignment -name USE_AS_3V_GPIO ON -to "s10_pcie_perstn0" +set_instance_assignment -name IO_STANDARD "2.5 V" -to "s10_pcie_perstn0" +set_instance_assignment -name USE_AS_3V_GPIO ON -to "s10_pcie_perstn1" +set_instance_assignment -name IO_STANDARD "2.5 V" -to "s10_pcie_perstn1" + +# PCIe RP +set_location_assignment PIN_BL5 -to "pcie_rp_tx_p[0]" +set_location_assignment PIN_BL6 -to "pcie_rp_tx_n[0]" +set_location_assignment PIN_BH7 -to "pcie_rp_rx_p[0]" +set_location_assignment PIN_BH8 -to "pcie_rp_rx_n[0]" +set_location_assignment PIN_BK3 -to "pcie_rp_tx_p[1]" +set_location_assignment PIN_BK4 -to "pcie_rp_tx_n[1]" +set_location_assignment PIN_BJ5 -to "pcie_rp_rx_p[1]" +set_location_assignment PIN_BJ6 -to "pcie_rp_rx_n[1]" +set_location_assignment PIN_BH3 -to "pcie_rp_tx_p[2]" +set_location_assignment PIN_BH4 -to "pcie_rp_tx_n[2]" +set_location_assignment PIN_BG6 -to "pcie_rp_rx_n[2]" +set_location_assignment PIN_BG5 -to "pcie_rp_rx_p[2]" +set_location_assignment PIN_BG1 -to "pcie_rp_tx_p[3]" +set_location_assignment PIN_BG2 -to "pcie_rp_tx_n[3]" +set_location_assignment PIN_BF8 -to "pcie_rp_rx_n[3]" +set_location_assignment PIN_BF7 -to "pcie_rp_rx_p[3]" +set_location_assignment PIN_BF3 -to "pcie_rp_tx_p[4]" +set_location_assignment PIN_BF4 -to "pcie_rp_tx_n[4]" +set_location_assignment PIN_BE6 -to "pcie_rp_rx_n[4]" +set_location_assignment PIN_BE5 -to "pcie_rp_rx_p[4]" +set_location_assignment PIN_BE1 -to "pcie_rp_tx_p[5]" +set_location_assignment PIN_BE2 -to "pcie_rp_tx_n[5]" +set_location_assignment PIN_BD8 -to "pcie_rp_rx_n[5]" +set_location_assignment PIN_BD7 -to "pcie_rp_rx_p[5]" +set_location_assignment PIN_BD3 -to "pcie_rp_tx_p[6]" +set_location_assignment PIN_BD4 -to "pcie_rp_tx_n[6]" +set_location_assignment PIN_BB8 -to "pcie_rp_rx_n[6]" +set_location_assignment PIN_BB7 -to "pcie_rp_rx_p[6]" +set_location_assignment PIN_BC1 -to "pcie_rp_tx_p[7]" +set_location_assignment PIN_BC2 -to "pcie_rp_tx_n[7]" +set_location_assignment PIN_BC5 -to "pcie_rp_rx_p[7]" +set_location_assignment PIN_BC6 -to "pcie_rp_rx_n[7]" +set_location_assignment PIN_BB3 -to "pcie_rp_tx_p[8]" +set_location_assignment PIN_BB4 -to "pcie_rp_tx_n[8]" +set_location_assignment PIN_BA5 -to "pcie_rp_rx_p[8]" +set_location_assignment PIN_BA6 -to "pcie_rp_rx_n[8]" +set_location_assignment PIN_BA1 -to "pcie_rp_tx_p[9]" +set_location_assignment PIN_BA2 -to "pcie_rp_tx_n[9]" +set_location_assignment PIN_AY7 -to "pcie_rp_rx_p[9]" +set_location_assignment PIN_AY8 -to "pcie_rp_rx_n[9]" +set_location_assignment PIN_AY3 -to "pcie_rp_tx_p[10]" +set_location_assignment PIN_AY4 -to "pcie_rp_tx_n[10]" +set_location_assignment PIN_AW5 -to "pcie_rp_rx_p[10]" +set_location_assignment PIN_AW6 -to "pcie_rp_rx_n[10]" +set_location_assignment PIN_AW1 -to "pcie_rp_tx_p[11]" +set_location_assignment PIN_AW2 -to "pcie_rp_tx_n[11]" +set_location_assignment PIN_AV7 -to "pcie_rp_rx_p[11]" +set_location_assignment PIN_AV8 -to "pcie_rp_rx_n[11]" +set_location_assignment PIN_AV3 -to "pcie_rp_tx_p[12]" +set_location_assignment PIN_AV4 -to "pcie_rp_tx_n[12]" +set_location_assignment PIN_AU5 -to "pcie_rp_rx_p[12]" +set_location_assignment PIN_AU6 -to "pcie_rp_rx_n[12]" +set_location_assignment PIN_AU1 -to "pcie_rp_tx_p[13]" +set_location_assignment PIN_AU2 -to "pcie_rp_tx_n[13]" +set_location_assignment PIN_AT7 -to "pcie_rp_rx_p[13]" +set_location_assignment PIN_AT8 -to "pcie_rp_rx_n[13]" +set_location_assignment PIN_AT3 -to "pcie_rp_tx_p[14]" +set_location_assignment PIN_AT4 -to "pcie_rp_tx_n[14]" +set_location_assignment PIN_AR5 -to "pcie_rp_rx_p[14]" +set_location_assignment PIN_AR6 -to "pcie_rp_rx_n[14]" +set_location_assignment PIN_AR1 -to "pcie_rp_tx_p[15]" +set_location_assignment PIN_AR2 -to "pcie_rp_tx_n[15]" +set_location_assignment PIN_AP7 -to "pcie_rp_rx_p[15]" +set_location_assignment PIN_AP8 -to "pcie_rp_rx_n[15]" + +set_location_assignment PIN_AW9 -to "refclk_pcie_rp_p" +set_location_assignment PIN_AW10 -to "refclk_pcie_rp_n" + +set_location_assignment PIN_BB17 -to "pcie_rp_s10_perstn" +set_location_assignment PIN_BG15 -to "pcie_rp_s10_waken" +set_location_assignment PIN_BG16 -to "pcie_rp_s10_prsnt2n" + +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "pcie_rp_tx_p[*]" +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "pcie_rp_rx_p[*]" + +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "pcie_rp_tx_p[*]" +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "pcie_rp_rx_p[*]" + +set_instance_assignment -name IO_STANDARD "HCSL" -to "refclk_pcie_rp_p" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_rp_s10_perstn" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_rp_s10_waken" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "pcie_rp_s10_prsnt2n" + +# QSFP +set_location_assignment PIN_AN51 -to "qsfp0_tx_p[0]" +set_location_assignment PIN_AN50 -to "qsfp0_tx_n[0]" +set_location_assignment PIN_AM45 -to "qsfp0_rx_p[0]" +set_location_assignment PIN_AM44 -to "qsfp0_rx_n[0]" +set_location_assignment PIN_AL51 -to "qsfp0_tx_p[1]" +set_location_assignment PIN_AL50 -to "qsfp0_tx_n[1]" +set_location_assignment PIN_AK45 -to "qsfp0_rx_p[1]" +set_location_assignment PIN_AK44 -to "qsfp0_rx_n[1]" +set_location_assignment PIN_AG51 -to "qsfp0_tx_p[2]" +set_location_assignment PIN_AG50 -to "qsfp0_tx_n[2]" +set_location_assignment PIN_AF45 -to "qsfp0_rx_p[2]" +set_location_assignment PIN_AF44 -to "qsfp0_rx_n[2]" +set_location_assignment PIN_AJ51 -to "qsfp0_tx_p[3]" +set_location_assignment PIN_AJ50 -to "qsfp0_tx_n[3]" +set_location_assignment PIN_AH45 -to "qsfp0_rx_p[3]" +set_location_assignment PIN_AH44 -to "qsfp0_rx_n[3]" +set_location_assignment PIN_AJ43 -to "refclk_qsfp0_p" +set_location_assignment PIN_AJ42 -to "refclk_qsfp0_n" + +set_location_assignment PIN_AM3 -to "qsfp1_tx_p[0]" +set_location_assignment PIN_AM4 -to "qsfp1_tx_n[0]" +set_location_assignment PIN_AL5 -to "qsfp1_rx_p[0]" +set_location_assignment PIN_AL6 -to "qsfp1_rx_n[0]" +set_location_assignment PIN_AL1 -to "qsfp1_tx_p[1]" +set_location_assignment PIN_AL2 -to "qsfp1_tx_n[1]" +set_location_assignment PIN_AK7 -to "qsfp1_rx_p[1]" +set_location_assignment PIN_AK8 -to "qsfp1_rx_n[1]" +set_location_assignment PIN_AJ1 -to "qsfp1_tx_p[2]" +set_location_assignment PIN_AJ2 -to "qsfp1_tx_n[2]" +set_location_assignment PIN_AH7 -to "qsfp1_rx_p[2]" +set_location_assignment PIN_AH8 -to "qsfp1_rx_n[2]" +set_location_assignment PIN_AH3 -to "qsfp1_tx_p[3]" +set_location_assignment PIN_AH4 -to "qsfp1_tx_n[3]" +set_location_assignment PIN_AG5 -to "qsfp1_rx_p[3]" +set_location_assignment PIN_AG6 -to "qsfp1_rx_n[3]" +set_location_assignment PIN_AJ9 -to "refclk_qsfp1_p" +set_location_assignment PIN_AJ10 -to "refclk_qsfp1_n" + +set_location_assignment PIN_AW17 -to "qsfp0_modsel_l" +set_location_assignment PIN_AV16 -to "qsfp0_reset_l" +set_location_assignment PIN_AW16 -to "qsfp0_modprs_l" +set_location_assignment PIN_BC16 -to "qsfp0_lpmode" +set_location_assignment PIN_BB16 -to "qsfp0_int_l" + +set_location_assignment PIN_BA17 -to "qsfp1_modsel_l" +set_location_assignment PIN_AY16 -to "qsfp1_reset_l" +set_location_assignment PIN_AY15 -to "qsfp1_modprs_l" +set_location_assignment PIN_BE15 -to "qsfp1_lpmode" +set_location_assignment PIN_BF15 -to "qsfp1_int_l" + +set_location_assignment PIN_BD16 -to "qsfp_s10_i2c_sda" +set_location_assignment PIN_BJ16 -to "qsfp_s10_i2c_scl" + +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "qsfp0_tx_p[*]" +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "qsfp0_rx_p[*]" + +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "qsfp0_tx_p[*]" +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "qsfp0_rx_p[*]" + +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "qsfp1_tx_p[*]" +set_instance_assignment -name IO_STANDARD "HSSI DIFFERENTIAL I/O" -to "qsfp1_rx_p[*]" + +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "qsfp1_tx_p[*]" +set_instance_assignment -name XCVR_VCCR_VCCT_VOLTAGE 1_1V -to "qsfp1_rx_p[*]" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp0_modsel_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp0_reset_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp0_modprs_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp0_lpmode" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp0_int_l" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp1_modsel_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp1_reset_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp1_modprs_l" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp1_lpmode" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp1_int_l" + +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp_s10_i2c_sda" +set_instance_assignment -name IO_STANDARD "1.8 V" -to "qsfp_s10_i2c_scl" + +set_instance_assignment -name IO_STANDARD "Differential LVPECL" -to "refclk_qsfp0_p" +set_instance_assignment -name IO_STANDARD "Differential LVPECL" -to "refclk_qsfp1_p" + +# DDR4 COMP +set_location_assignment PIN_A40 -to "ddr4_comp_rzq" + +set_location_assignment PIN_A38 -to "ddr4_comp_alert_n" +set_location_assignment PIN_F35 -to "ddr4_comp_reset_n" +set_location_assignment PIN_A39 -to "ddr4_comp_par" + +set_location_assignment PIN_H34 -to "ddr4_comp_a[0]" +set_location_assignment PIN_J34 -to "ddr4_comp_a[1]" +set_location_assignment PIN_G35 -to "ddr4_comp_a[2]" +set_location_assignment PIN_H35 -to "ddr4_comp_a[3]" +set_location_assignment PIN_L35 -to "ddr4_comp_a[4]" +set_location_assignment PIN_K35 -to "ddr4_comp_a[5]" +set_location_assignment PIN_L34 -to "ddr4_comp_a[6]" +set_location_assignment PIN_K34 -to "ddr4_comp_a[7]" +set_location_assignment PIN_N34 -to "ddr4_comp_a[8]" +set_location_assignment PIN_P34 -to "ddr4_comp_a[9]" +set_location_assignment PIN_M35 -to "ddr4_comp_a[10]" +set_location_assignment PIN_N35 -to "ddr4_comp_a[11]" +set_location_assignment PIN_B40 -to "ddr4_comp_a[12]" +set_location_assignment PIN_C39 -to "ddr4_comp_a[13]" +set_location_assignment PIN_D39 -to "ddr4_comp_a[14]" +set_location_assignment PIN_D38 -to "ddr4_comp_a[15]" +set_location_assignment PIN_C38 -to "ddr4_comp_a[16]" +set_location_assignment PIN_G37 -to "ddr4_comp_bg[0]" +set_location_assignment PIN_F34 -to "ddr4_comp_bg[1]" +set_location_assignment PIN_E35 -to "ddr4_comp_act_n" +set_location_assignment PIN_C36 -to "ddr4_comp_odt" +set_location_assignment PIN_B37 -to "ddr4_comp_clk_p" +set_location_assignment PIN_B38 -to "ddr4_comp_clk_n" +set_location_assignment PIN_E36 -to "ddr4_comp_cs_n" +set_location_assignment PIN_B36 -to "ddr4_comp_cke" +set_location_assignment PIN_D37 -to "ddr4_comp_ba[0]" +set_location_assignment PIN_F37 -to "ddr4_comp_ba[1]" + +set_location_assignment PIN_R34 -to "ddr4_comp_dbi_n[0]" +set_location_assignment PIN_J37 -to "ddr4_comp_dbi_n[1]" +set_location_assignment PIN_K39 -to "ddr4_comp_dbi_n[2]" +set_location_assignment PIN_F32 -to "ddr4_comp_dbi_n[3]" +set_location_assignment PIN_P31 -to "ddr4_comp_dbi_n[4]" +set_location_assignment PIN_N39 -to "ddr4_comp_dbi_n[5]" +set_location_assignment PIN_C41 -to "ddr4_comp_dbi_n[6]" +set_location_assignment PIN_M32 -to "ddr4_comp_dbi_n[7]" +set_location_assignment PIN_A33 -to "ddr4_comp_dbi_n[8]" + +set_location_assignment PIN_M36 -to "ddr4_comp_dqs_p[0]" +set_location_assignment PIN_N36 -to "ddr4_comp_dqs_n[0]" +set_location_assignment PIN_H38 -to "ddr4_comp_dqs_p[1]" +set_location_assignment PIN_J38 -to "ddr4_comp_dqs_n[1]" +set_location_assignment PIN_E42 -to "ddr4_comp_dqs_p[2]" +set_location_assignment PIN_F42 -to "ddr4_comp_dqs_n[2]" +set_location_assignment PIN_D32 -to "ddr4_comp_dqs_p[3]" +set_location_assignment PIN_E32 -to "ddr4_comp_dqs_n[3]" +set_location_assignment PIN_M31 -to "ddr4_comp_dqs_p[4]" +set_location_assignment PIN_N31 -to "ddr4_comp_dqs_n[4]" +set_location_assignment PIN_U37 -to "ddr4_comp_dqs_p[5]" +set_location_assignment PIN_T37 -to "ddr4_comp_dqs_n[5]" +set_location_assignment PIN_E41 -to "ddr4_comp_dqs_p[6]" +set_location_assignment PIN_E40 -to "ddr4_comp_dqs_n[6]" +set_location_assignment PIN_G33 -to "ddr4_comp_dqs_p[7]" +set_location_assignment PIN_F33 -to "ddr4_comp_dqs_n[7]" +set_location_assignment PIN_B31 -to "ddr4_comp_dqs_p[8]" +set_location_assignment PIN_A32 -to "ddr4_comp_dqs_n[8]" + +set_location_assignment PIN_K36 -to "ddr4_comp_dq[0]" +set_location_assignment PIN_H36 -to "ddr4_comp_dq[1]" +set_location_assignment PIN_P36 -to "ddr4_comp_dq[2]" +set_location_assignment PIN_T35 -to "ddr4_comp_dq[3]" +set_location_assignment PIN_J36 -to "ddr4_comp_dq[4]" +set_location_assignment PIN_G36 -to "ddr4_comp_dq[5]" +set_location_assignment PIN_R36 -to "ddr4_comp_dq[6]" +set_location_assignment PIN_T34 -to "ddr4_comp_dq[7]" +set_location_assignment PIN_K37 -to "ddr4_comp_dq[8]" +set_location_assignment PIN_G38 -to "ddr4_comp_dq[9]" +set_location_assignment PIN_M37 -to "ddr4_comp_dq[10]" +set_location_assignment PIN_P38 -to "ddr4_comp_dq[11]" +set_location_assignment PIN_L37 -to "ddr4_comp_dq[12]" +set_location_assignment PIN_P37 -to "ddr4_comp_dq[13]" +set_location_assignment PIN_N38 -to "ddr4_comp_dq[14]" +set_location_assignment PIN_R37 -to "ddr4_comp_dq[15]" +set_location_assignment PIN_G42 -to "ddr4_comp_dq[16]" +set_location_assignment PIN_J39 -to "ddr4_comp_dq[17]" +set_location_assignment PIN_H42 -to "ddr4_comp_dq[18]" +set_location_assignment PIN_G40 -to "ddr4_comp_dq[19]" +set_location_assignment PIN_H41 -to "ddr4_comp_dq[20]" +set_location_assignment PIN_L39 -to "ddr4_comp_dq[21]" +set_location_assignment PIN_H40 -to "ddr4_comp_dq[22]" +set_location_assignment PIN_G41 -to "ddr4_comp_dq[23]" +set_location_assignment PIN_B32 -to "ddr4_comp_dq[24]" +set_location_assignment PIN_G32 -to "ddr4_comp_dq[25]" +set_location_assignment PIN_C33 -to "ddr4_comp_dq[26]" +set_location_assignment PIN_J31 -to "ddr4_comp_dq[27]" +set_location_assignment PIN_B33 -to "ddr4_comp_dq[28]" +set_location_assignment PIN_H31 -to "ddr4_comp_dq[29]" +set_location_assignment PIN_D33 -to "ddr4_comp_dq[30]" +set_location_assignment PIN_K31 -to "ddr4_comp_dq[31]" +set_location_assignment PIN_M33 -to "ddr4_comp_dq[32]" +set_location_assignment PIN_R31 -to "ddr4_comp_dq[33]" +set_location_assignment PIN_N33 -to "ddr4_comp_dq[34]" +set_location_assignment PIN_R32 -to "ddr4_comp_dq[35]" +set_location_assignment PIN_L33 -to "ddr4_comp_dq[36]" +set_location_assignment PIN_T32 -to "ddr4_comp_dq[37]" +set_location_assignment PIN_P33 -to "ddr4_comp_dq[38]" +set_location_assignment PIN_T33 -to "ddr4_comp_dq[39]" +set_location_assignment PIN_P39 -to "ddr4_comp_dq[40]" +set_location_assignment PIN_T39 -to "ddr4_comp_dq[41]" +set_location_assignment PIN_T38 -to "ddr4_comp_dq[42]" +set_location_assignment PIN_V39 -to "ddr4_comp_dq[43]" +set_location_assignment PIN_M38 -to "ddr4_comp_dq[44]" +set_location_assignment PIN_V38 -to "ddr4_comp_dq[45]" +set_location_assignment PIN_U38 -to "ddr4_comp_dq[46]" +set_location_assignment PIN_W39 -to "ddr4_comp_dq[47]" +set_location_assignment PIN_C40 -to "ddr4_comp_dq[48]" +set_location_assignment PIN_E39 -to "ddr4_comp_dq[49]" +set_location_assignment PIN_B42 -to "ddr4_comp_dq[50]" +set_location_assignment PIN_F39 -to "ddr4_comp_dq[51]" +set_location_assignment PIN_D41 -to "ddr4_comp_dq[52]" +set_location_assignment PIN_F38 -to "ddr4_comp_dq[53]" +set_location_assignment PIN_D42 -to "ddr4_comp_dq[54]" +set_location_assignment PIN_F40 -to "ddr4_comp_dq[55]" +set_location_assignment PIN_C34 -to "ddr4_comp_dq[56]" +set_location_assignment PIN_H33 -to "ddr4_comp_dq[57]" +set_location_assignment PIN_D34 -to "ddr4_comp_dq[58]" +set_location_assignment PIN_J32 -to "ddr4_comp_dq[59]" +set_location_assignment PIN_C35 -to "ddr4_comp_dq[60]" +set_location_assignment PIN_J33 -to "ddr4_comp_dq[61]" +set_location_assignment PIN_E34 -to "ddr4_comp_dq[62]" +set_location_assignment PIN_L32 -to "ddr4_comp_dq[63]" +set_location_assignment PIN_C31 -to "ddr4_comp_dq[64]" +set_location_assignment PIN_C30 -to "ddr4_comp_dq[65]" +set_location_assignment PIN_A34 -to "ddr4_comp_dq[66]" +set_location_assignment PIN_A30 -to "ddr4_comp_dq[67]" +set_location_assignment PIN_D31 -to "ddr4_comp_dq[68]" +set_location_assignment PIN_E31 -to "ddr4_comp_dq[69]" +set_location_assignment PIN_B35 -to "ddr4_comp_dq[70]" +set_location_assignment PIN_B30 -to "ddr4_comp_dq[71]" + +# DDR4 DIMM CH0 +set_location_assignment PIN_B17 -to "ddr4_dimm_rzq" + +set_location_assignment PIN_M30 -to "ddr4_dimm_event_n" +set_location_assignment PIN_F30 -to "ddr4_dimm_save_n" +set_location_assignment PIN_C21 -to "ddr4_dimm_alert_n" +set_location_assignment PIN_P17 -to "ddr4_dimm_reset_n" +set_location_assignment PIN_H18 -to "ddr4_dimm_par" + +set_location_assignment PIN_J19 -to "ddr4_dimm_a[0]" +set_location_assignment PIN_H19 -to "ddr4_dimm_a[1]" +set_location_assignment PIN_L19 -to "ddr4_dimm_a[2]" +set_location_assignment PIN_K19 -to "ddr4_dimm_a[3]" +set_location_assignment PIN_G18 -to "ddr4_dimm_a[4]" +set_location_assignment PIN_F18 -to "ddr4_dimm_a[5]" +set_location_assignment PIN_G17 -to "ddr4_dimm_a[6]" +set_location_assignment PIN_F17 -to "ddr4_dimm_a[7]" +set_location_assignment PIN_E17 -to "ddr4_dimm_a[8]" +set_location_assignment PIN_E16 -to "ddr4_dimm_a[9]" +set_location_assignment PIN_D17 -to "ddr4_dimm_a[10]" +set_location_assignment PIN_D18 -to "ddr4_dimm_a[11]" +set_location_assignment PIN_A17 -to "ddr4_dimm_a[12]" +set_location_assignment PIN_E19 -to "ddr4_dimm_a[13]" +set_location_assignment PIN_F19 -to "ddr4_dimm_a[14]" +set_location_assignment PIN_C19 -to "ddr4_dimm_a[15]" +set_location_assignment PIN_D19 -to "ddr4_dimm_a[16]" +set_location_assignment PIN_A20 -to "ddr4_dimm_a[17]" +set_location_assignment PIN_A19 -to "ddr4_dimm_bg[0]" +set_location_assignment PIN_R17 -to "ddr4_dimm_bg[1]" +set_location_assignment PIN_N18 -to "ddr4_dimm_act_n" +set_location_assignment PIN_M18 -to "ddr4_dimm_odt[0]" +set_location_assignment PIN_L18 -to "ddr4_dimm_odt[1]" +set_location_assignment PIN_K17 -to "ddr4_dimm_ck_p[0]" +set_location_assignment PIN_J17 -to "ddr4_dimm_ck_n[0]" +set_location_assignment PIN_D22 -to "ddr4_dimm_ck_p[1]" +set_location_assignment PIN_E22 -to "ddr4_dimm_ck_n[1]" +set_location_assignment PIN_P18 -to "ddr4_dimm_cs_n[0]" +set_location_assignment PIN_J18 -to "ddr4_dimm_cs_n[1]" +set_location_assignment PIN_E20 -to "ddr4_dimm_cs_n[2]" +set_location_assignment PIN_F20 -to "ddr4_dimm_cs_n[3]" +set_location_assignment PIN_G20 -to "ddr4_dimm_c2" +set_location_assignment PIN_M17 -to "ddr4_dimm_cke[0]" +set_location_assignment PIN_L17 -to "ddr4_dimm_cke[1]" +set_location_assignment PIN_B20 -to "ddr4_dimm_ba[0]" +set_location_assignment PIN_A18 -to "ddr4_dimm_ba[1]" + +set_location_assignment PIN_L14 -to "ddr4_dimm_dqs_p[0]" +set_location_assignment PIN_K14 -to "ddr4_dimm_dqs_n[0]" +set_location_assignment PIN_M15 -to "ddr4_dimm_dqs_p[1]" +set_location_assignment PIN_N15 -to "ddr4_dimm_dqs_n[1]" +set_location_assignment PIN_L20 -to "ddr4_dimm_dqs_p[2]" +set_location_assignment PIN_K20 -to "ddr4_dimm_dqs_n[2]" +set_location_assignment PIN_E10 -to "ddr4_dimm_dqs_p[3]" +set_location_assignment PIN_E11 -to "ddr4_dimm_dqs_n[3]" +set_location_assignment PIN_A14 -to "ddr4_dimm_dqs_p[4]" +set_location_assignment PIN_A15 -to "ddr4_dimm_dqs_n[4]" +set_location_assignment PIN_F27 -to "ddr4_dimm_dqs_p[5]" +set_location_assignment PIN_E27 -to "ddr4_dimm_dqs_n[5]" +set_location_assignment PIN_D24 -to "ddr4_dimm_dqs_p[6]" +set_location_assignment PIN_C24 -to "ddr4_dimm_dqs_n[6]" +set_location_assignment PIN_B22 -to "ddr4_dimm_dqs_p[7]" +set_location_assignment PIN_B21 -to "ddr4_dimm_dqs_n[7]" +set_location_assignment PIN_B12 -to "ddr4_dimm_dqs_p[8]" +set_location_assignment PIN_B11 -to "ddr4_dimm_dqs_n[8]" +set_location_assignment PIN_F13 -to "ddr4_dimm_dqs_p[9]" +set_location_assignment PIN_F14 -to "ddr4_dimm_dqs_n[9]" +set_location_assignment PIN_J16 -to "ddr4_dimm_dqs_p[10]" +set_location_assignment PIN_K16 -to "ddr4_dimm_dqs_n[10]" +set_location_assignment PIN_N19 -to "ddr4_dimm_dqs_p[11]" +set_location_assignment PIN_P19 -to "ddr4_dimm_dqs_n[11]" +set_location_assignment PIN_C10 -to "ddr4_dimm_dqs_p[12]" +set_location_assignment PIN_B10 -to "ddr4_dimm_dqs_n[12]" +set_location_assignment PIN_B15 -to "ddr4_dimm_dqs_p[13]" +set_location_assignment PIN_B16 -to "ddr4_dimm_dqs_n[13]" +set_location_assignment PIN_J26 -to "ddr4_dimm_dqs_p[14]" +set_location_assignment PIN_H26 -to "ddr4_dimm_dqs_n[14]" +set_location_assignment PIN_J24 -to "ddr4_dimm_dqs_p[15]" +set_location_assignment PIN_H24 -to "ddr4_dimm_dqs_n[15]" +set_location_assignment PIN_G23 -to "ddr4_dimm_dqs_p[16]" +set_location_assignment PIN_F23 -to "ddr4_dimm_dqs_n[16]" +set_location_assignment PIN_D14 -to "ddr4_dimm_dqs_p[17]" +set_location_assignment PIN_E14 -to "ddr4_dimm_dqs_n[17]" + +set_location_assignment PIN_T14 -to "ddr4_dimm_dq[0]" +set_location_assignment PIN_R14 -to "ddr4_dimm_dq[1]" +set_location_assignment PIN_N14 -to "ddr4_dimm_dq[2]" +set_location_assignment PIN_H14 -to "ddr4_dimm_dq[3]" +set_location_assignment PIN_T15 -to "ddr4_dimm_dq[4]" +set_location_assignment PIN_R15 -to "ddr4_dimm_dq[5]" +set_location_assignment PIN_P14 -to "ddr4_dimm_dq[6]" +set_location_assignment PIN_J14 -to "ddr4_dimm_dq[7]" +set_location_assignment PIN_N16 -to "ddr4_dimm_dq[8]" +set_location_assignment PIN_M16 -to "ddr4_dimm_dq[9]" +set_location_assignment PIN_H16 -to "ddr4_dimm_dq[10]" +set_location_assignment PIN_G16 -to "ddr4_dimm_dq[11]" +set_location_assignment PIN_R16 -to "ddr4_dimm_dq[12]" +set_location_assignment PIN_P16 -to "ddr4_dimm_dq[13]" +set_location_assignment PIN_L15 -to "ddr4_dimm_dq[14]" +set_location_assignment PIN_K15 -to "ddr4_dimm_dq[15]" +set_location_assignment PIN_K21 -to "ddr4_dimm_dq[16]" +set_location_assignment PIN_J22 -to "ddr4_dimm_dq[17]" +set_location_assignment PIN_M20 -to "ddr4_dimm_dq[18]" +set_location_assignment PIN_K22 -to "ddr4_dimm_dq[19]" +set_location_assignment PIN_J23 -to "ddr4_dimm_dq[20]" +set_location_assignment PIN_H23 -to "ddr4_dimm_dq[21]" +set_location_assignment PIN_N20 -to "ddr4_dimm_dq[22]" +set_location_assignment PIN_J21 -to "ddr4_dimm_dq[23]" +set_location_assignment PIN_H10 -to "ddr4_dimm_dq[24]" +set_location_assignment PIN_A10 -to "ddr4_dimm_dq[25]" +set_location_assignment PIN_G10 -to "ddr4_dimm_dq[26]" +set_location_assignment PIN_C11 -to "ddr4_dimm_dq[27]" +set_location_assignment PIN_F10 -to "ddr4_dimm_dq[28]" +set_location_assignment PIN_A9 -to "ddr4_dimm_dq[29]" +set_location_assignment PIN_H11 -to "ddr4_dimm_dq[30]" +set_location_assignment PIN_D11 -to "ddr4_dimm_dq[31]" +set_location_assignment PIN_C14 -to "ddr4_dimm_dq[32]" +set_location_assignment PIN_C16 -to "ddr4_dimm_dq[33]" +set_location_assignment PIN_F15 -to "ddr4_dimm_dq[34]" +set_location_assignment PIN_E15 -to "ddr4_dimm_dq[35]" +set_location_assignment PIN_G15 -to "ddr4_dimm_dq[36]" +set_location_assignment PIN_C15 -to "ddr4_dimm_dq[37]" +set_location_assignment PIN_D16 -to "ddr4_dimm_dq[38]" +set_location_assignment PIN_H15 -to "ddr4_dimm_dq[39]" +set_location_assignment PIN_C26 -to "ddr4_dimm_dq[40]" +set_location_assignment PIN_C25 -to "ddr4_dimm_dq[41]" +set_location_assignment PIN_B27 -to "ddr4_dimm_dq[42]" +set_location_assignment PIN_G26 -to "ddr4_dimm_dq[43]" +set_location_assignment PIN_E26 -to "ddr4_dimm_dq[44]" +set_location_assignment PIN_D26 -to "ddr4_dimm_dq[45]" +set_location_assignment PIN_B26 -to "ddr4_dimm_dq[46]" +set_location_assignment PIN_G27 -to "ddr4_dimm_dq[47]" +set_location_assignment PIN_B25 -to "ddr4_dimm_dq[48]" +set_location_assignment PIN_F24 -to "ddr4_dimm_dq[49]" +set_location_assignment PIN_F25 -to "ddr4_dimm_dq[50]" +set_location_assignment PIN_H25 -to "ddr4_dimm_dq[51]" +set_location_assignment PIN_A25 -to "ddr4_dimm_dq[52]" +set_location_assignment PIN_E24 -to "ddr4_dimm_dq[53]" +set_location_assignment PIN_E25 -to "ddr4_dimm_dq[54]" +set_location_assignment PIN_G25 -to "ddr4_dimm_dq[55]" +set_location_assignment PIN_A22 -to "ddr4_dimm_dq[56]" +set_location_assignment PIN_F22 -to "ddr4_dimm_dq[57]" +set_location_assignment PIN_A24 -to "ddr4_dimm_dq[58]" +set_location_assignment PIN_B23 -to "ddr4_dimm_dq[59]" +set_location_assignment PIN_C23 -to "ddr4_dimm_dq[60]" +set_location_assignment PIN_G22 -to "ddr4_dimm_dq[61]" +set_location_assignment PIN_A23 -to "ddr4_dimm_dq[62]" +set_location_assignment PIN_D23 -to "ddr4_dimm_dq[63]" +set_location_assignment PIN_D12 -to "ddr4_dimm_dq[64]" +set_location_assignment PIN_E12 -to "ddr4_dimm_dq[65]" +set_location_assignment PIN_A12 -to "ddr4_dimm_dq[66]" +set_location_assignment PIN_A13 -to "ddr4_dimm_dq[67]" +set_location_assignment PIN_D13 -to "ddr4_dimm_dq[68]" +set_location_assignment PIN_F12 -to "ddr4_dimm_dq[69]" +set_location_assignment PIN_C13 -to "ddr4_dimm_dq[70]" +set_location_assignment PIN_B13 -to "ddr4_dimm_dq[71]" diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga.sdc b/fpga/mqnic/S10MX_DK/fpga_10g/fpga.sdc new file mode 100644 index 000000000..381741137 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga.sdc @@ -0,0 +1,103 @@ +# Timing constraints for the Intel Stratix 10 MX FPGA development board + +set_time_format -unit ns -decimal_places 3 + +# Clock constraints +create_clock -period 20.000 -name {clk_sys_50m} [ get_ports {clk_sys_50m_p} ] +create_clock -period 10.000 -name {clk_sys_100m} [ get_ports {clk_sys_100m_p} ] +create_clock -period 10.000 -name {clk_core_bak} [ get_ports {clk_core_bak_p} ] +create_clock -period 10.000 -name {clk_uib0} [ get_ports {clk_uib0_p} ] +create_clock -period 10.000 -name {clk_uib1} [ get_ports {clk_uib1_p} ] +create_clock -period 10.000 -name {clk_esram0} [ get_ports {clk_esram0_p} ] +create_clock -period 10.000 -name {clk_esram1} [ get_ports {clk_esram1_p} ] +create_clock -period 7.500 -name {clk_ddr4_comp} [ get_ports {clk_ddr4_comp_p} ] +create_clock -period 7.500 -name {clk_ddr4_dimm} [ get_ports {clk_ddr4_dimm_p} ] + +create_clock -period 10.000 -name {refclk_pcie_ep} [ get_ports {refclk_pcie_ep_p} ] +create_clock -period 10.000 -name {refclk_pcie_ep_edge} [ get_ports {refclk_pcie_ep_edge_p} ] +create_clock -period 10.000 -name {refclk_pcie_ep1} [ get_ports {refclk_pcie_ep1_p} ] +create_clock -period 10.000 -name {refclk_pcie_rp} [ get_ports {refclk_pcie_rp_p} ] + +create_clock -period 1.551 -name {refclk_qsfp0} [ get_ports {refclk_qsfp0_p} ] +create_clock -period 1.551 -name {refclk_qsfp1} [ get_ports {refclk_qsfp1_p} ] + +derive_clock_uncertainty + +set_clock_groups -asynchronous -group [ get_clocks {clk_sys_50m} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_sys_100m} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_core_bak} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_uib0} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_uib1} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_esram0} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_esram1} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_ddr4_comp} ] +set_clock_groups -asynchronous -group [ get_clocks {clk_ddr4_dimm} ] + +set_clock_groups -asynchronous -group [ get_clocks {refclk_pcie_ep} ] +set_clock_groups -asynchronous -group [ get_clocks {refclk_pcie_ep_edge} ] +set_clock_groups -asynchronous -group [ get_clocks {refclk_pcie_ep1} ] +set_clock_groups -asynchronous -group [ get_clocks {refclk_pcie_rp} ] + +set_clock_groups -asynchronous -group [ get_clocks {refclk_qsfp0} ] +set_clock_groups -asynchronous -group [ get_clocks {refclk_qsfp1} ] + +# JTAG constraints +create_clock -name {altera_reserved_tck} -period 40.800 {altera_reserved_tck} + +set_clock_groups -asynchronous -group [get_clocks {altera_reserved_tck}] + +# IO constraints +set_false_path -from "cpu_resetn" +set_false_path -to "user_led[*]" + +set_false_path -from "s10_pcie_perstn0" +set_false_path -from "s10_pcie_perstn1" + + +source ../lib/eth/syn/quartus_pro/eth_mac_fifo.sdc +source ../lib/eth/lib/axis/syn/quartus_pro/sync_reset.sdc +source ../lib/eth/lib/axis/syn/quartus_pro/axis_async_fifo.sdc + +# clocking infrastructure +constrain_sync_reset_inst "sync_reset_100mhz_inst" + +# PHY clocks +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_1|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_1|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_2|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_2|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_3|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_3|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_4|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_4|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_1|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_1|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_2|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_2|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_3|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_3|eth_xcvr_inst|rx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_4|eth_xcvr_inst|tx_clkout|ch0} ] +set_clock_groups -asynchronous -group [ get_clocks {qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_4|eth_xcvr_inst|rx_clkout|ch0} ] + +# PHY resets +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_1|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_1|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_2|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_2|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_3|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_3|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_4|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp0_eth_xcvr_phy_quad|eth_xcvr_phy_4|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_1|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_1|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_2|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_2|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_3|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_3|phy_rx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_4|phy_tx_rst_reset_sync_inst" +constrain_sync_reset_inst "qsfp1_eth_xcvr_phy_quad|eth_xcvr_phy_4|phy_rx_rst_reset_sync_inst" + +# 10G MAC +constrain_eth_mac_fifo_inst "core_inst|eth_mac_10g_fifo_inst" +constrain_axis_async_fifo_inst "core_inst|eth_mac_10g_fifo_inst|rx_fifo|fifo_inst" +constrain_axis_async_fifo_inst "core_inst|eth_mac_10g_fifo_inst|tx_fifo|fifo_inst" diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/Makefile b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/Makefile new file mode 100644 index 000000000..8c9e3ac28 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/Makefile @@ -0,0 +1,125 @@ + +# FPGA settings +FPGA_TOP = fpga +FPGA_FAMILY = "Stratix 10 MX" +FPGA_DEVICE = 1SM21BHU2F53E1VG + +# Files for synthesis +SYN_FILES = rtl/fpga.v +SYN_FILES += rtl/fpga_core.v +SYN_FILES += rtl/sync_signal.v +SYN_FILES += rtl/eth_xcvr_phy_wrapper.v +SYN_FILES += rtl/eth_xcvr_phy_quad_wrapper.v +SYN_FILES += rtl/common/mqnic_core_pcie_s10.v +SYN_FILES += rtl/common/mqnic_core_pcie.v +SYN_FILES += rtl/common/mqnic_core.v +SYN_FILES += rtl/common/mqnic_interface.v +SYN_FILES += rtl/common/mqnic_port.v +SYN_FILES += rtl/common/mqnic_ptp.v +SYN_FILES += rtl/common/mqnic_ptp_clock.v +SYN_FILES += rtl/common/mqnic_ptp_perout.v +SYN_FILES += rtl/common/cpl_write.v +SYN_FILES += rtl/common/cpl_op_mux.v +SYN_FILES += rtl/common/desc_fetch.v +SYN_FILES += rtl/common/desc_op_mux.v +SYN_FILES += rtl/common/event_mux.v +SYN_FILES += rtl/common/queue_manager.v +SYN_FILES += rtl/common/cpl_queue_manager.v +SYN_FILES += rtl/common/tx_engine.v +SYN_FILES += rtl/common/rx_engine.v +SYN_FILES += rtl/common/tx_checksum.v +SYN_FILES += rtl/common/rx_hash.v +SYN_FILES += rtl/common/rx_checksum.v +SYN_FILES += rtl/common/stats_counter.v +SYN_FILES += rtl/common/stats_collect.v +SYN_FILES += rtl/common/stats_pcie_if.v +SYN_FILES += rtl/common/stats_pcie_tlp.v +SYN_FILES += rtl/common/stats_dma_if_pcie.v +SYN_FILES += rtl/common/stats_dma_latency.v +SYN_FILES += rtl/common/mqnic_tx_scheduler_block_rr.v +SYN_FILES += rtl/common/tx_scheduler_rr.v +SYN_FILES += rtl/common/tdma_scheduler.v +SYN_FILES += rtl/common/tdma_ber.v +SYN_FILES += rtl/common/tdma_ber_ch.v +SYN_FILES += lib/eth/rtl/eth_mac_10g.v +SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v +SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v +SYN_FILES += lib/eth/rtl/eth_phy_10g.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_frame_sync.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_ber_mon.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_watchdog.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_tx.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_tx_if.v +SYN_FILES += lib/eth/rtl/xgmii_baser_dec_64.v +SYN_FILES += lib/eth/rtl/xgmii_baser_enc_64.v +SYN_FILES += lib/eth/rtl/lfsr.v +SYN_FILES += lib/eth/rtl/ptp_clock.v +SYN_FILES += lib/eth/rtl/ptp_clock_cdc.v +SYN_FILES += lib/eth/rtl/ptp_perout.v +SYN_FILES += lib/eth/rtl/ptp_ts_extract.v +SYN_FILES += lib/axi/rtl/axil_interconnect.v +SYN_FILES += lib/axi/rtl/axil_crossbar.v +SYN_FILES += lib/axi/rtl/axil_crossbar_addr.v +SYN_FILES += lib/axi/rtl/axil_crossbar_rd.v +SYN_FILES += lib/axi/rtl/axil_crossbar_wr.v +SYN_FILES += lib/axi/rtl/axil_reg_if.v +SYN_FILES += lib/axi/rtl/axil_reg_if_rd.v +SYN_FILES += lib/axi/rtl/axil_reg_if_wr.v +SYN_FILES += lib/axi/rtl/axil_register_rd.v +SYN_FILES += lib/axi/rtl/axil_register_wr.v +SYN_FILES += lib/axi/rtl/arbiter.v +SYN_FILES += lib/axi/rtl/priority_encoder.v +SYN_FILES += lib/axis/rtl/axis_adapter.v +SYN_FILES += lib/axis/rtl/axis_arb_mux.v +SYN_FILES += lib/axis/rtl/axis_async_fifo.v +SYN_FILES += lib/axis/rtl/axis_async_fifo_adapter.v +SYN_FILES += lib/axis/rtl/axis_arb_mux.v +SYN_FILES += lib/axis/rtl/axis_fifo.v +SYN_FILES += lib/axis/rtl/axis_pipeline_fifo.v +SYN_FILES += lib/axis/rtl/axis_register.v +SYN_FILES += lib/axis/rtl/sync_reset.v +SYN_FILES += lib/pcie/rtl/pcie_axil_master.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_demux.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_demux_bar.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_mux.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie_rd.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie_wr.v +SYN_FILES += lib/pcie/rtl/dma_if_mux.v +SYN_FILES += lib/pcie/rtl/dma_if_mux_rd.v +SYN_FILES += lib/pcie/rtl/dma_if_mux_wr.v +SYN_FILES += lib/pcie/rtl/dma_if_desc_mux.v +SYN_FILES += lib/pcie/rtl/dma_ram_demux_rd.v +SYN_FILES += lib/pcie/rtl/dma_ram_demux_wr.v +SYN_FILES += lib/pcie/rtl/dma_psdpram.v +SYN_FILES += lib/pcie/rtl/dma_client_axis_sink.v +SYN_FILES += lib/pcie/rtl/dma_client_axis_source.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if_rx.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if_tx.v +SYN_FILES += lib/pcie/rtl/pcie_s10_cfg.v +SYN_FILES += lib/pcie/rtl/pcie_s10_msi.v +SYN_FILES += lib/pcie/rtl/pulse_merge.v + +# IP files +IP_TCL_FILES += ip/reset_release.tcl +IP_TCL_FILES += ip/pcie.tcl +IP_TCL_FILES += ip/eth_xcvr.tcl +IP_TCL_FILES += ip/eth_xcvr_pll.tcl +IP_TCL_FILES += ip/eth_xcvr_reset.tcl + +# QSF files +QSF_FILES = fpga.qsf + +# SDC files +SDC_FILES = fpga.sdc + +# Configuration +CONFIG_TCL_FILES = ./config.tcl + +include ../common/quartus_pro.mk + +program: fpga + quartus_pgm --no_banner --mode=jtag -o "P;$(FPGA_TOP).sof@1" diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/config.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/config.tcl new file mode 100644 index 000000000..6f4de83f8 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21b/config.tcl @@ -0,0 +1,208 @@ +# Copyright 2021, The Regents of the University of California. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of The Regents of the University of California. + +set params [dict create] + +# FW and board IDs +dict set params FW_ID "32'd0" +dict set params FW_VER "32'h00000001" +dict set params BOARD_ID "32'h11720001" +dict set params BOARD_VER "32'h00000001" +dict set params FPGA_ID "32'h632ac0dd" + +# Structural configuration + +# counts QSFP 0 QSFP 1 +# IF PORT 0_1 0_2 0_3 0_4 1_1 1_2 1_3 1_4 +# 1 1 0 (0.0) +# 1 2 0 (0.0) 1 (0.1) +# 1 3 0 (0.0) 1 (0.1) 2 (0.2) +# 1 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) +# 1 5 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) +# 1 6 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) +# 1 7 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) +# 1 8 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) 7 (0.7) +# 2 1 0 (0.0) 1 (1.0) +# 2 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) +# 2 3 0 (0.0) 1 (0.1) 2 (0.2) 3 (1.0) 4 (1.1) 5 (1.2) +# 2 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (1.0) 5 (1.1) 6 (1.2) 7 (1.3) +# 3 1 0 (0.0) 1 (1.0) 2 (2.0) +# 3 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) +# 4 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) +# 4 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) 6 (3.0) 7 (3.1) +# 5 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) +# 6 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) +# 7 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) +# 8 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) 7 (7.0) + +dict set params IF_COUNT "2" +dict set params PORTS_PER_IF "1" + +# PTP configuration +dict set params PTP_PEROUT_ENABLE "1" +dict set params PTP_PEROUT_COUNT "1" + +# Queue manager configuration (interface) +dict set params EVENT_QUEUE_OP_TABLE_SIZE "32" +dict set params TX_QUEUE_OP_TABLE_SIZE "32" +dict set params RX_QUEUE_OP_TABLE_SIZE "32" +dict set params TX_CPL_QUEUE_OP_TABLE_SIZE [dict get $params TX_QUEUE_OP_TABLE_SIZE] +dict set params RX_CPL_QUEUE_OP_TABLE_SIZE [dict get $params RX_QUEUE_OP_TABLE_SIZE] +dict set params TX_QUEUE_INDEX_WIDTH "10" +dict set params RX_QUEUE_INDEX_WIDTH "8" +dict set params TX_CPL_QUEUE_INDEX_WIDTH [dict get $params TX_QUEUE_INDEX_WIDTH] +dict set params RX_CPL_QUEUE_INDEX_WIDTH [dict get $params RX_QUEUE_INDEX_WIDTH] +dict set params EVENT_QUEUE_PIPELINE "3" +dict set params TX_QUEUE_PIPELINE [expr 3+([dict get $params TX_QUEUE_INDEX_WIDTH] > 12 ? [dict get $params TX_QUEUE_INDEX_WIDTH]-12 : 0)] +dict set params RX_QUEUE_PIPELINE [expr 3+([dict get $params RX_QUEUE_INDEX_WIDTH] > 12 ? [dict get $params RX_QUEUE_INDEX_WIDTH]-12 : 0)] +dict set params TX_CPL_QUEUE_PIPELINE [dict get $params TX_QUEUE_PIPELINE] +dict set params RX_CPL_QUEUE_PIPELINE [dict get $params RX_QUEUE_PIPELINE] + +# TX and RX engine configuration (port) +dict set params TX_DESC_TABLE_SIZE "32" +dict set params RX_DESC_TABLE_SIZE "32" + +# Scheduler configuration (port) +dict set params TX_SCHEDULER_OP_TABLE_SIZE [dict get $params TX_DESC_TABLE_SIZE] +dict set params TX_SCHEDULER_PIPELINE [dict get $params TX_QUEUE_PIPELINE] +dict set params TDMA_INDEX_WIDTH "6" + +# Timestamping configuration (port) +dict set params PTP_TS_ENABLE "1" +dict set params TX_PTP_TS_FIFO_DEPTH "32" +dict set params RX_PTP_TS_FIFO_DEPTH "32" + +# Interface configuration (port) +dict set params TX_CHECKSUM_ENABLE "1" +dict set params RX_RSS_ENABLE "1" +dict set params RX_HASH_ENABLE "1" +dict set params RX_CHECKSUM_ENABLE "1" +dict set params TX_FIFO_DEPTH "32768" +dict set params RX_FIFO_DEPTH "32768" +dict set params MAX_TX_SIZE "9214" +dict set params MAX_RX_SIZE "9214" +dict set params TX_RAM_SIZE "32768" +dict set params RX_RAM_SIZE "32768" + +# Application block configuration +dict set params APP_ENABLE "0" +dict set params APP_CTRL_ENABLE "1" +dict set params APP_DMA_ENABLE "1" +dict set params APP_AXIS_DIRECT_ENABLE "1" +dict set params APP_AXIS_SYNC_ENABLE "1" +dict set params APP_AXIS_IF_ENABLE "1" +dict set params APP_STAT_ENABLE "1" + +# DMA interface configuration +dict set params DMA_LEN_WIDTH "16" +dict set params DMA_TAG_WIDTH "16" +dict set params RAM_PIPELINE "2" + +# PCIe interface configuration +dict set params SEG_COUNT "1" +dict set params SEG_DATA_WIDTH "256" +dict set params SEG_EMPTY_WIDTH [expr int(ceil(log([dict get $params SEG_DATA_WIDTH]/32.0)/log(2)))] +dict set params TX_SEQ_NUM_WIDTH "6" +dict set params PCIE_TAG_COUNT "256" +dict set params PCIE_DMA_READ_OP_TABLE_SIZE [dict get $params PCIE_TAG_COUNT] +dict set params PCIE_DMA_READ_TX_LIMIT "16" +dict set params PCIE_DMA_READ_TX_FC_ENABLE "1" +dict set params PCIE_DMA_WRITE_OP_TABLE_SIZE "16" +dict set params PCIE_DMA_WRITE_TX_LIMIT "3" +dict set params PCIE_DMA_WRITE_TX_FC_ENABLE "1" + +# AXI lite interface configuration (control) +dict set params AXIL_CTRL_DATA_WIDTH "32" +dict set params AXIL_CTRL_ADDR_WIDTH "24" + +# AXI lite interface configuration (application control) +dict set params AXIL_APP_CTRL_DATA_WIDTH [dict get $params AXIL_CTRL_DATA_WIDTH] +dict set params AXIL_APP_CTRL_ADDR_WIDTH "24" + +# Ethernet interface configuration +dict set params AXIS_ETH_TX_PIPELINE "0" +dict set params AXIS_ETH_TX_FIFO_PIPELINE "2" +dict set params AXIS_ETH_TX_TS_PIPELINE "0" +dict set params AXIS_ETH_RX_PIPELINE "0" +dict set params AXIS_ETH_RX_FIFO_PIPELINE "2" + +# Statistics counter subsystem +dict set params STAT_ENABLE "0" +dict set params STAT_DMA_ENABLE "1" +dict set params STAT_PCIE_ENABLE "1" +dict set params STAT_INC_WIDTH "24" +dict set params STAT_ID_WIDTH "12" + +# PCIe IP core settings +set pcie pcie_s10_hip_ast_0 +set pcie_ip pcie +set fp [open "update_ip_${pcie_ip}.tcl" "w"] + +puts $fp "package require qsys" +puts $fp "load_system ip/${pcie_ip}.ip" + +puts $fp "set_instance_parameter_value ${pcie} {pf0_pci_type0_device_id_hwtcl} {4097}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_pci_type0_vendor_id_hwtcl} {4660}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_class_code_hwtcl} {131072}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_revision_id_hwtcl} {0}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_subsys_dev_id_hwtcl} {1}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_subsys_vendor_id_hwtcl} {4466}" + +# configure BAR settings +proc configure_bar {fp pcie pf bar aperture} { + if {$aperture > 0} { + puts "PF${pf} BAR${bar}: aperture ${aperture} bits" + + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_address_width_hwtcl} {${aperture}}" + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_type_hwtcl} {64-bit prefetchable memory}" + + return + } + puts "PF${pf} BAR${bar}: disabled" + + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_address_width_hwtcl} {0}" + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_type_hwtcl} {Disabled}" +} + +# Control BAR (BAR 0) +configure_bar $fp $pcie 0 0 [dict get $params AXIL_CTRL_ADDR_WIDTH] + +# Application BAR (BAR 2) +configure_bar $fp $pcie 0 2 [expr [dict get $params APP_ENABLE] ? [dict get $params AXIL_APP_CTRL_ADDR_WIDTH] : 0] + +puts $fp "save_system" +close $fp + +# apply parameters to PCIe IP core +exec -ignorestderr qsys-script "--qpf=fpga.qpf" "--script=update_ip_${pcie_ip}.tcl" + +# apply parameters to top-level +dict for {name value} $params { + set_parameter -name $name $value +} diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/Makefile b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/Makefile new file mode 100644 index 000000000..f0a8b5d9f --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/Makefile @@ -0,0 +1,125 @@ + +# FPGA settings +FPGA_TOP = fpga +FPGA_FAMILY = "Stratix 10 MX" +FPGA_DEVICE = 1SM21CHU1F53E1VG + +# Files for synthesis +SYN_FILES = rtl/fpga.v +SYN_FILES += rtl/fpga_core.v +SYN_FILES += rtl/sync_signal.v +SYN_FILES += rtl/eth_xcvr_phy_wrapper.v +SYN_FILES += rtl/eth_xcvr_phy_quad_wrapper.v +SYN_FILES += rtl/common/mqnic_core_pcie_s10.v +SYN_FILES += rtl/common/mqnic_core_pcie.v +SYN_FILES += rtl/common/mqnic_core.v +SYN_FILES += rtl/common/mqnic_interface.v +SYN_FILES += rtl/common/mqnic_port.v +SYN_FILES += rtl/common/mqnic_ptp.v +SYN_FILES += rtl/common/mqnic_ptp_clock.v +SYN_FILES += rtl/common/mqnic_ptp_perout.v +SYN_FILES += rtl/common/cpl_write.v +SYN_FILES += rtl/common/cpl_op_mux.v +SYN_FILES += rtl/common/desc_fetch.v +SYN_FILES += rtl/common/desc_op_mux.v +SYN_FILES += rtl/common/event_mux.v +SYN_FILES += rtl/common/queue_manager.v +SYN_FILES += rtl/common/cpl_queue_manager.v +SYN_FILES += rtl/common/tx_engine.v +SYN_FILES += rtl/common/rx_engine.v +SYN_FILES += rtl/common/tx_checksum.v +SYN_FILES += rtl/common/rx_hash.v +SYN_FILES += rtl/common/rx_checksum.v +SYN_FILES += rtl/common/stats_counter.v +SYN_FILES += rtl/common/stats_collect.v +SYN_FILES += rtl/common/stats_pcie_if.v +SYN_FILES += rtl/common/stats_pcie_tlp.v +SYN_FILES += rtl/common/stats_dma_if_pcie.v +SYN_FILES += rtl/common/stats_dma_latency.v +SYN_FILES += rtl/common/mqnic_tx_scheduler_block_rr.v +SYN_FILES += rtl/common/tx_scheduler_rr.v +SYN_FILES += rtl/common/tdma_scheduler.v +SYN_FILES += rtl/common/tdma_ber.v +SYN_FILES += rtl/common/tdma_ber_ch.v +SYN_FILES += lib/eth/rtl/eth_mac_10g.v +SYN_FILES += lib/eth/rtl/axis_xgmii_rx_64.v +SYN_FILES += lib/eth/rtl/axis_xgmii_tx_64.v +SYN_FILES += lib/eth/rtl/eth_phy_10g.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_if.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_frame_sync.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_ber_mon.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_rx_watchdog.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_tx.v +SYN_FILES += lib/eth/rtl/eth_phy_10g_tx_if.v +SYN_FILES += lib/eth/rtl/xgmii_baser_dec_64.v +SYN_FILES += lib/eth/rtl/xgmii_baser_enc_64.v +SYN_FILES += lib/eth/rtl/lfsr.v +SYN_FILES += lib/eth/rtl/ptp_clock.v +SYN_FILES += lib/eth/rtl/ptp_clock_cdc.v +SYN_FILES += lib/eth/rtl/ptp_perout.v +SYN_FILES += lib/eth/rtl/ptp_ts_extract.v +SYN_FILES += lib/axi/rtl/axil_interconnect.v +SYN_FILES += lib/axi/rtl/axil_crossbar.v +SYN_FILES += lib/axi/rtl/axil_crossbar_addr.v +SYN_FILES += lib/axi/rtl/axil_crossbar_rd.v +SYN_FILES += lib/axi/rtl/axil_crossbar_wr.v +SYN_FILES += lib/axi/rtl/axil_reg_if.v +SYN_FILES += lib/axi/rtl/axil_reg_if_rd.v +SYN_FILES += lib/axi/rtl/axil_reg_if_wr.v +SYN_FILES += lib/axi/rtl/axil_register_rd.v +SYN_FILES += lib/axi/rtl/axil_register_wr.v +SYN_FILES += lib/axi/rtl/arbiter.v +SYN_FILES += lib/axi/rtl/priority_encoder.v +SYN_FILES += lib/axis/rtl/axis_adapter.v +SYN_FILES += lib/axis/rtl/axis_arb_mux.v +SYN_FILES += lib/axis/rtl/axis_async_fifo.v +SYN_FILES += lib/axis/rtl/axis_async_fifo_adapter.v +SYN_FILES += lib/axis/rtl/axis_arb_mux.v +SYN_FILES += lib/axis/rtl/axis_fifo.v +SYN_FILES += lib/axis/rtl/axis_pipeline_fifo.v +SYN_FILES += lib/axis/rtl/axis_register.v +SYN_FILES += lib/axis/rtl/sync_reset.v +SYN_FILES += lib/pcie/rtl/pcie_axil_master.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_demux.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_demux_bar.v +SYN_FILES += lib/pcie/rtl/pcie_tlp_mux.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie_rd.v +SYN_FILES += lib/pcie/rtl/dma_if_pcie_wr.v +SYN_FILES += lib/pcie/rtl/dma_if_mux.v +SYN_FILES += lib/pcie/rtl/dma_if_mux_rd.v +SYN_FILES += lib/pcie/rtl/dma_if_mux_wr.v +SYN_FILES += lib/pcie/rtl/dma_if_desc_mux.v +SYN_FILES += lib/pcie/rtl/dma_ram_demux_rd.v +SYN_FILES += lib/pcie/rtl/dma_ram_demux_wr.v +SYN_FILES += lib/pcie/rtl/dma_psdpram.v +SYN_FILES += lib/pcie/rtl/dma_client_axis_sink.v +SYN_FILES += lib/pcie/rtl/dma_client_axis_source.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if_rx.v +SYN_FILES += lib/pcie/rtl/pcie_s10_if_tx.v +SYN_FILES += lib/pcie/rtl/pcie_s10_cfg.v +SYN_FILES += lib/pcie/rtl/pcie_s10_msi.v +SYN_FILES += lib/pcie/rtl/pulse_merge.v + +# IP files +IP_TCL_FILES += ip/reset_release.tcl +IP_TCL_FILES += ip/pcie.tcl +IP_TCL_FILES += ip/eth_xcvr.tcl +IP_TCL_FILES += ip/eth_xcvr_pll.tcl +IP_TCL_FILES += ip/eth_xcvr_reset.tcl + +# QSF files +QSF_FILES = fpga.qsf + +# SDC files +SDC_FILES = fpga.sdc + +# Configuration +CONFIG_TCL_FILES = ./config.tcl + +include ../common/quartus_pro.mk + +program: fpga + quartus_pgm --no_banner --mode=jtag -o "P;$(FPGA_TOP).sof@1" diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/config.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/config.tcl new file mode 100644 index 000000000..cfdab4a97 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/fpga_1sm21c/config.tcl @@ -0,0 +1,208 @@ +# Copyright 2021, The Regents of the University of California. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of The Regents of the University of California. + +set params [dict create] + +# FW and board IDs +dict set params FW_ID "32'd0" +dict set params FW_VER "32'h00000001" +dict set params BOARD_ID "32'h11720001" +dict set params BOARD_VER "32'h00000001" +dict set params FPGA_ID "32'h432AC0DD" + +# Structural configuration + +# counts QSFP 0 QSFP 1 +# IF PORT 0_1 0_2 0_3 0_4 1_1 1_2 1_3 1_4 +# 1 1 0 (0.0) +# 1 2 0 (0.0) 1 (0.1) +# 1 3 0 (0.0) 1 (0.1) 2 (0.2) +# 1 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) +# 1 5 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) +# 1 6 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) +# 1 7 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) +# 1 8 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) 7 (0.7) +# 2 1 0 (0.0) 1 (1.0) +# 2 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) +# 2 3 0 (0.0) 1 (0.1) 2 (0.2) 3 (1.0) 4 (1.1) 5 (1.2) +# 2 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (1.0) 5 (1.1) 6 (1.2) 7 (1.3) +# 3 1 0 (0.0) 1 (1.0) 2 (2.0) +# 3 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) +# 4 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) +# 4 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) 6 (3.0) 7 (3.1) +# 5 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) +# 6 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) +# 7 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) +# 8 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) 7 (7.0) + +dict set params IF_COUNT "2" +dict set params PORTS_PER_IF "1" + +# PTP configuration +dict set params PTP_PEROUT_ENABLE "1" +dict set params PTP_PEROUT_COUNT "1" + +# Queue manager configuration (interface) +dict set params EVENT_QUEUE_OP_TABLE_SIZE "32" +dict set params TX_QUEUE_OP_TABLE_SIZE "32" +dict set params RX_QUEUE_OP_TABLE_SIZE "32" +dict set params TX_CPL_QUEUE_OP_TABLE_SIZE [dict get $params TX_QUEUE_OP_TABLE_SIZE] +dict set params RX_CPL_QUEUE_OP_TABLE_SIZE [dict get $params RX_QUEUE_OP_TABLE_SIZE] +dict set params TX_QUEUE_INDEX_WIDTH "10" +dict set params RX_QUEUE_INDEX_WIDTH "8" +dict set params TX_CPL_QUEUE_INDEX_WIDTH [dict get $params TX_QUEUE_INDEX_WIDTH] +dict set params RX_CPL_QUEUE_INDEX_WIDTH [dict get $params RX_QUEUE_INDEX_WIDTH] +dict set params EVENT_QUEUE_PIPELINE "3" +dict set params TX_QUEUE_PIPELINE [expr 3+([dict get $params TX_QUEUE_INDEX_WIDTH] > 12 ? [dict get $params TX_QUEUE_INDEX_WIDTH]-12 : 0)] +dict set params RX_QUEUE_PIPELINE [expr 3+([dict get $params RX_QUEUE_INDEX_WIDTH] > 12 ? [dict get $params RX_QUEUE_INDEX_WIDTH]-12 : 0)] +dict set params TX_CPL_QUEUE_PIPELINE [dict get $params TX_QUEUE_PIPELINE] +dict set params RX_CPL_QUEUE_PIPELINE [dict get $params RX_QUEUE_PIPELINE] + +# TX and RX engine configuration (port) +dict set params TX_DESC_TABLE_SIZE "32" +dict set params RX_DESC_TABLE_SIZE "32" + +# Scheduler configuration (port) +dict set params TX_SCHEDULER_OP_TABLE_SIZE [dict get $params TX_DESC_TABLE_SIZE] +dict set params TX_SCHEDULER_PIPELINE [dict get $params TX_QUEUE_PIPELINE] +dict set params TDMA_INDEX_WIDTH "6" + +# Timestamping configuration (port) +dict set params PTP_TS_ENABLE "1" +dict set params TX_PTP_TS_FIFO_DEPTH "32" +dict set params RX_PTP_TS_FIFO_DEPTH "32" + +# Interface configuration (port) +dict set params TX_CHECKSUM_ENABLE "1" +dict set params RX_RSS_ENABLE "1" +dict set params RX_HASH_ENABLE "1" +dict set params RX_CHECKSUM_ENABLE "1" +dict set params TX_FIFO_DEPTH "32768" +dict set params RX_FIFO_DEPTH "32768" +dict set params MAX_TX_SIZE "9214" +dict set params MAX_RX_SIZE "9214" +dict set params TX_RAM_SIZE "32768" +dict set params RX_RAM_SIZE "32768" + +# Application block configuration +dict set params APP_ENABLE "0" +dict set params APP_CTRL_ENABLE "1" +dict set params APP_DMA_ENABLE "1" +dict set params APP_AXIS_DIRECT_ENABLE "1" +dict set params APP_AXIS_SYNC_ENABLE "1" +dict set params APP_AXIS_IF_ENABLE "1" +dict set params APP_STAT_ENABLE "1" + +# DMA interface configuration +dict set params DMA_LEN_WIDTH "16" +dict set params DMA_TAG_WIDTH "16" +dict set params RAM_PIPELINE "2" + +# PCIe interface configuration +dict set params SEG_COUNT "1" +dict set params SEG_DATA_WIDTH "256" +dict set params SEG_EMPTY_WIDTH [expr int(ceil(log([dict get $params SEG_DATA_WIDTH]/32.0)/log(2)))] +dict set params TX_SEQ_NUM_WIDTH "6" +dict set params PCIE_TAG_COUNT "256" +dict set params PCIE_DMA_READ_OP_TABLE_SIZE [dict get $params PCIE_TAG_COUNT] +dict set params PCIE_DMA_READ_TX_LIMIT "16" +dict set params PCIE_DMA_READ_TX_FC_ENABLE "1" +dict set params PCIE_DMA_WRITE_OP_TABLE_SIZE "16" +dict set params PCIE_DMA_WRITE_TX_LIMIT "3" +dict set params PCIE_DMA_WRITE_TX_FC_ENABLE "1" + +# AXI lite interface configuration (control) +dict set params AXIL_CTRL_DATA_WIDTH "32" +dict set params AXIL_CTRL_ADDR_WIDTH "24" + +# AXI lite interface configuration (application control) +dict set params AXIL_APP_CTRL_DATA_WIDTH [dict get $params AXIL_CTRL_DATA_WIDTH] +dict set params AXIL_APP_CTRL_ADDR_WIDTH "24" + +# Ethernet interface configuration +dict set params AXIS_ETH_TX_PIPELINE "0" +dict set params AXIS_ETH_TX_FIFO_PIPELINE "2" +dict set params AXIS_ETH_TX_TS_PIPELINE "0" +dict set params AXIS_ETH_RX_PIPELINE "0" +dict set params AXIS_ETH_RX_FIFO_PIPELINE "2" + +# Statistics counter subsystem +dict set params STAT_ENABLE "0" +dict set params STAT_DMA_ENABLE "1" +dict set params STAT_PCIE_ENABLE "1" +dict set params STAT_INC_WIDTH "24" +dict set params STAT_ID_WIDTH "12" + +# PCIe IP core settings +set pcie pcie_s10_hip_ast_0 +set pcie_ip pcie +set fp [open "update_ip_${pcie_ip}.tcl" "w"] + +puts $fp "package require qsys" +puts $fp "load_system ip/${pcie_ip}.ip" + +puts $fp "set_instance_parameter_value ${pcie} {pf0_pci_type0_device_id_hwtcl} {4097}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_pci_type0_vendor_id_hwtcl} {4660}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_class_code_hwtcl} {131072}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_revision_id_hwtcl} {0}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_subsys_dev_id_hwtcl} {1}" +puts $fp "set_instance_parameter_value ${pcie} {pf0_subsys_vendor_id_hwtcl} {4466}" + +# configure BAR settings +proc configure_bar {fp pcie pf bar aperture} { + if {$aperture > 0} { + puts "PF${pf} BAR${bar}: aperture ${aperture} bits" + + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_address_width_hwtcl} {${aperture}}" + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_type_hwtcl} {64-bit prefetchable memory}" + + return + } + puts "PF${pf} BAR${bar}: disabled" + + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_address_width_hwtcl} {0}" + puts $fp "set_instance_parameter_value ${pcie} {pf${pf}_bar${bar}_type_hwtcl} {Disabled}" +} + +# Control BAR (BAR 0) +configure_bar $fp $pcie 0 0 [dict get $params AXIL_CTRL_ADDR_WIDTH] + +# Application BAR (BAR 2) +configure_bar $fp $pcie 0 2 [expr [dict get $params APP_ENABLE] ? [dict get $params AXIL_APP_CTRL_ADDR_WIDTH] : 0] + +puts $fp "save_system" +close $fp + +# apply parameters to PCIe IP core +exec -ignorestderr qsys-script "--qpf=fpga.qpf" "--script=update_ip_${pcie_ip}.tcl" + +# apply parameters to top-level +dict for {name value} $params { + set_parameter -name $name $value +} diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr.tcl new file mode 100644 index 000000000..20bb8cc2b --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr.tcl @@ -0,0 +1,382 @@ +package require -exact qsys 20.4 + +# create the system "eth_xcvr" +proc do_create_eth_xcvr {} { + # create the system + create_system eth_xcvr + set_project_property DEVICE {1SM21CHU1F53E1VG} + set_project_property DEVICE_FAMILY {Stratix 10} + set_project_property HIDE_FROM_IP_CATALOG {true} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_instance xcvr_native_s10_htile_0 altera_xcvr_native_s10_htile + set_instance_parameter_value xcvr_native_s10_htile_0 {adapter_ehip_mode} {disable_hip} + set_instance_parameter_value xcvr_native_s10_htile_0 {anlg_link} {lr} + set_instance_parameter_value xcvr_native_s10_htile_0 {anlg_voltage} {1_1V} + set_instance_parameter_value xcvr_native_s10_htile_0 {avmm_ehip_mode} {disable_hip} + set_instance_parameter_value xcvr_native_s10_htile_0 {base_device} {Unknown} + set_instance_parameter_value xcvr_native_s10_htile_0 {bonded_mode} {not_bonded} + set_instance_parameter_value xcvr_native_s10_htile_0 {cdr_refclk_cnt} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {cdr_refclk_select} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {channel_type} {GX} + set_instance_parameter_value xcvr_native_s10_htile_0 {channels} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {delay_measurement_clkout2_sel} {clock_delay_measurement_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {delay_measurement_clkout_sel} {clock_delay_measurement_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {design_environment} {NATIVE} + set_instance_parameter_value xcvr_native_s10_htile_0 {design_example_filename} {dexample} + set_instance_parameter_value xcvr_native_s10_htile_0 {disable_digital_reset_sequencer} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {disable_reset_sequencer} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {duplex_mode} {duplex} + set_instance_parameter_value xcvr_native_s10_htile_0 {early_spd_chng_t1} {60} + set_instance_parameter_value xcvr_native_s10_htile_0 {early_spd_chng_t2} {150} + set_instance_parameter_value xcvr_native_s10_htile_0 {early_spd_chng_t3} {1000} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_advanced_user_mode} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_background_cal_gui} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_channel_powerdown} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_de_hardware_debug} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_debug_ports} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_direct_reset_control} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_double_rate_transfer} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_early_spd_chng} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ehip} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_fast_sim} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_hard_reset} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_hip} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_insert_eios_err} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_mac_total_control} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_manual_bonding_settings} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_clock_delay_measurement} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_krfec_rx_enh_frame} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_krfec_rx_enh_frame_diag_status} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_krfec_tx_enh_frame} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_latency_measurement} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_clkout2} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_clkout2_hioint} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_clkout_hioint} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_data_valid} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_bitslip} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_blk_lock} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_clr_errblk_count} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_crc32_err} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_frame} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_frame_diag_status} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_frame_lock} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_highber} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_enh_highber_clr_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_align_clr} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_del} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_empty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_full} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_insert} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_latency_adj_ena} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_pempty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_pfull} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_fifo_rd_en} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_is_lockedtodata} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_is_lockedtoref} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_pcs_fifo_empty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_pcs_fifo_full} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_pma_clkslip} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_pma_iqtxrx_clkout} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_pma_qpipulldn} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_polinv} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_seriallpbken} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_bitrev_ena} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_bitslip} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_bitslipboundarysel} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_byterev_ena} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_rmfifo_empty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_rmfifo_full} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_signaldetect} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_wa_a1a2size} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_rx_std_wa_patternalign} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_clkout2} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_clkout2_hioint} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_clkout_hioint} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_dll_lock} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_enh_bitslip} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_enh_frame} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_enh_frame_burst_en} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_enh_frame_diag_status} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_fifo_empty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_fifo_full} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_fifo_latency_adj_ena} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_fifo_pempty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_fifo_pfull} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pcs_fifo_empty} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pcs_fifo_full} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_elecidle} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_iqtxrx_clkout} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_qpipulldn} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_qpipullup} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_rxfound} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_pma_txdetectrx} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_polinv} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_port_tx_std_bitslipboundarysel} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_adaptation} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_pipe_hclk} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_pipe_rx_elecidle} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_pipe_sw} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_rx_manual_cdr_mode} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_ports_rx_prbs} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_qpi_async_transfer} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_qpi_mode} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_rcfg_tx_digitalreset_release_ctrl} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_rx_fast_pipeln_reg} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_simple_interface} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_split_interface} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_transparent_pcs} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_tx_coreclkin2} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_tx_fast_pipeln_reg} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enable_workaround_rules} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_advanced_user_mode} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_low_latency_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_pcs_pma_width} {64} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_pld_pcs_width} {66} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_64b66b_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_bitslip_enable} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_blksync_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_crcchk_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_descram_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_dispchk_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_frmsync_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_frmsync_mfrm_length} {2048} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_krfec_err_mark_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_krfec_err_mark_type} {10G} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_rx_polinv_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_64b66b_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_bitslip_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_crcerr_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_crcgen_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_dispgen_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_frmgen_burst_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_frmgen_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_frmgen_mfrm_length} {2048} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_krfec_burst_err_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_krfec_burst_err_len} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_polinv_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_randomdispbit_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_scram_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_scram_seed} {2.88230376152e+17} + set_instance_parameter_value xcvr_native_s10_htile_0 {enh_tx_sh_err} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {generate_add_hdl_instance_example} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {generate_docs} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {hip_channels} {x1} + set_instance_parameter_value xcvr_native_s10_htile_0 {hip_mode} {disable_hip} + set_instance_parameter_value xcvr_native_s10_htile_0 {hip_prot_mode} {gen1} + set_instance_parameter_value xcvr_native_s10_htile_0 {loopback_tx_clk_sel} {internal_clk} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_pcs_bonding_comp_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_pcs_bonding_mode} {individual} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_core_aib_bonding_comp_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_core_aib_bonding_mode} {individual} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_core_aib_indv} {indv_en} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_hssi_aib_bonding_comp_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_hssi_aib_bonding_mode} {individual} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_rx_hssi_aib_indv} {indv_en} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_core_aib_bonding_comp_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_core_aib_bonding_mode} {individual} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_core_aib_indv} {indv_en} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_hssi_aib_bonding_comp_cnt} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_hssi_aib_bonding_mode} {individual} + set_instance_parameter_value xcvr_native_s10_htile_0 {manual_tx_hssi_aib_indv} {indv_en} + set_instance_parameter_value xcvr_native_s10_htile_0 {message_level} {error} + set_instance_parameter_value xcvr_native_s10_htile_0 {number_physical_bonding_clocks} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {osc_clk_divider} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {ovrd_rx_dv_mode} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {ovrd_tx_dv_mode} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {parallel_loopback_mode} {disable} + set_instance_parameter_value xcvr_native_s10_htile_0 {pcie_rate_match} {Bypass} + set_instance_parameter_value xcvr_native_s10_htile_0 {pcs_direct_width} {8} + set_instance_parameter_value xcvr_native_s10_htile_0 {pcs_reset_sequencing_mode} {not_bonded} + set_instance_parameter_value xcvr_native_s10_htile_0 {pll_select} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {plls} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {pma_mode} {basic} + set_instance_parameter_value xcvr_native_s10_htile_0 {protocol_mode} {basic_enh} + set_instance_parameter_value xcvr_native_s10_htile_0 {qsf_assignments_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_debug} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_enable_avmm_busy_port} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_file_prefix} {altera_xcvr_rcfg_10} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_files_as_common_package} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_h_file_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_iface_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_jtag_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_mif_file_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_multi_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_cnt} {2} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data0} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data1} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data2} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data3} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data4} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data5} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data6} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_data7} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_profile_select} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_reduced_files_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data0} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data1} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data2} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data3} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data4} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data5} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data6} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sdc_derived_profile_data7} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_separate_avmm_busy} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_shared} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_sv_file_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_txt_file_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rcfg_use_clk_reset_only} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {reduced_reset_sim_time} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_clkout2_sel} {pcs_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_clkout_sel} {pma_div_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_coreclkin_clock_network} {dedicated} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_ctle_ac_gain} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_ctle_eq_gain} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_fifo_align_del} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_fifo_control_del} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_fifo_mode} {Phase compensation} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_fifo_pempty} {2} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_fifo_pfull} {10} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_pma_adapt_mode} {ctle_dfe} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_pma_analog_mode} {user_custom} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_pma_div_clkout_divider} {33} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_pma_optimal_settings} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_pma_term_sel} {r_r2} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_ppm_detect_threshold} {1000} + set_instance_parameter_value xcvr_native_s10_htile_0 {rx_vga_dc_gain} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_capability_reg_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_cdr_refclk_freq} {644.531250} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_cdr_refclk_receiver_detect_src} {iqclk} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_csr_soft_logic_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_data_rate} {10312.5} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_embedded_debug_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_enable_calibration} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_enable_eios_rx_protect} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_hip_cal_en} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_odi_soft_logic_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_pcs_bonding_master} {Auto} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_prbs_soft_logic_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_rcfg_emb_strm_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {set_user_identifier} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_low_latency_bypass_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_pcs_pma_width} {10} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_8b10b_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_bitrev_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_byte_deser_mode} {Disabled} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_byterev_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_polinv_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_rmfifo_mode} {disabled} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_rmfifo_pattern_n} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_rmfifo_pattern_p} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_fast_sync_status_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_mode} {bitslip} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_pattern} {0.0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_pattern_len} {7} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_renumber} {3} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_rgnumber} {3} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_rknumber} {3} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_rx_word_aligner_rvnumber} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_8b10b_disp_ctrl_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_8b10b_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_bitrev_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_bitslip_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_byte_ser_mode} {Disabled} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_byterev_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {std_tx_polinv_enable} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {support_mode} {user_mode} + set_instance_parameter_value xcvr_native_s10_htile_0 {suppress_design_example_messages} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {tile_type_suffix} {} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_clkout2_sel} {pcs_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_clkout_sel} {pma_div_clkout} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_coreclkin_clock_network} {dedicated} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_fifo_mode} {Phase compensation} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_fifo_pempty} {2} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_fifo_pfull} {10} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pcs_bonding_clock_network} {dedicated} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pll_refclk} {644.53125} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pll_type} {ATX} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_analog_mode} {user_custom} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_clk_div} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_compensation_en} {enable} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_div_clkout_divider} {33} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_optimal_settings} {1} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_output_swing_ctrl} {12} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_pre_emp_sign_1st_post_tap} {negative} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_pre_emp_sign_pre_tap_1t} {negative} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_pre_emp_switching_ctrl_1st_post_tap} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_pre_emp_switching_ctrl_pre_tap_1t} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_slew_rate_ctrl} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {tx_pma_term_sel} {r_r1} + set_instance_parameter_value xcvr_native_s10_htile_0 {use_rx_clkout2} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {use_tx_clkout2} {0} + set_instance_parameter_value xcvr_native_s10_htile_0 {usr_rx_dv_mode} {enable} + set_instance_parameter_value xcvr_native_s10_htile_0 {usr_tx_dv_mode} {enable} + set_instance_parameter_value xcvr_native_s10_htile_0 {validation_rule_select} {} + set_instance_property xcvr_native_s10_htile_0 AUTO_EXPORT true + + # add wirelevel expressions + + # add the exports + set_interface_property tx_analogreset EXPORT_OF xcvr_native_s10_htile_0.tx_analogreset + set_interface_property rx_analogreset EXPORT_OF xcvr_native_s10_htile_0.rx_analogreset + set_interface_property tx_digitalreset EXPORT_OF xcvr_native_s10_htile_0.tx_digitalreset + set_interface_property rx_digitalreset EXPORT_OF xcvr_native_s10_htile_0.rx_digitalreset + set_interface_property tx_analogreset_stat EXPORT_OF xcvr_native_s10_htile_0.tx_analogreset_stat + set_interface_property rx_analogreset_stat EXPORT_OF xcvr_native_s10_htile_0.rx_analogreset_stat + set_interface_property tx_digitalreset_stat EXPORT_OF xcvr_native_s10_htile_0.tx_digitalreset_stat + set_interface_property rx_digitalreset_stat EXPORT_OF xcvr_native_s10_htile_0.rx_digitalreset_stat + set_interface_property tx_cal_busy EXPORT_OF xcvr_native_s10_htile_0.tx_cal_busy + set_interface_property rx_cal_busy EXPORT_OF xcvr_native_s10_htile_0.rx_cal_busy + set_interface_property tx_serial_clk0 EXPORT_OF xcvr_native_s10_htile_0.tx_serial_clk0 + set_interface_property rx_cdr_refclk0 EXPORT_OF xcvr_native_s10_htile_0.rx_cdr_refclk0 + set_interface_property tx_serial_data EXPORT_OF xcvr_native_s10_htile_0.tx_serial_data + set_interface_property rx_serial_data EXPORT_OF xcvr_native_s10_htile_0.rx_serial_data + set_interface_property rx_is_lockedtoref EXPORT_OF xcvr_native_s10_htile_0.rx_is_lockedtoref + set_interface_property rx_is_lockedtodata EXPORT_OF xcvr_native_s10_htile_0.rx_is_lockedtodata + set_interface_property tx_coreclkin EXPORT_OF xcvr_native_s10_htile_0.tx_coreclkin + set_interface_property rx_coreclkin EXPORT_OF xcvr_native_s10_htile_0.rx_coreclkin + set_interface_property tx_clkout EXPORT_OF xcvr_native_s10_htile_0.tx_clkout + set_interface_property tx_clkout2 EXPORT_OF xcvr_native_s10_htile_0.tx_clkout2 + set_interface_property rx_clkout EXPORT_OF xcvr_native_s10_htile_0.rx_clkout + set_interface_property rx_clkout2 EXPORT_OF xcvr_native_s10_htile_0.rx_clkout2 + set_interface_property tx_parallel_data EXPORT_OF xcvr_native_s10_htile_0.tx_parallel_data + set_interface_property tx_control EXPORT_OF xcvr_native_s10_htile_0.tx_control + set_interface_property tx_enh_data_valid EXPORT_OF xcvr_native_s10_htile_0.tx_enh_data_valid + set_interface_property unused_tx_parallel_data EXPORT_OF xcvr_native_s10_htile_0.unused_tx_parallel_data + set_interface_property rx_parallel_data EXPORT_OF xcvr_native_s10_htile_0.rx_parallel_data + set_interface_property rx_control EXPORT_OF xcvr_native_s10_htile_0.rx_control + set_interface_property rx_enh_data_valid EXPORT_OF xcvr_native_s10_htile_0.rx_enh_data_valid + set_interface_property unused_rx_parallel_data EXPORT_OF xcvr_native_s10_htile_0.unused_rx_parallel_data + set_interface_property rx_bitslip EXPORT_OF xcvr_native_s10_htile_0.rx_bitslip + + # set values for exposed HDL parameters + + # set the the module properties + set_module_property BONUS_DATA { + + + + + +} + set_module_property FILE {eth_xcvr.ip} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {eth_xcvr} + + # save the system + sync_sysinfo_parameters + save_system eth_xcvr +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_eth_xcvr + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_pll.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_pll.tcl new file mode 100644 index 000000000..93d7851a4 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_pll.tcl @@ -0,0 +1,141 @@ +package require -exact qsys 20.4 + +# create the system "eth_xcvr_pll" +proc do_create_eth_xcvr_pll {} { + # create the system + create_system eth_xcvr_pll + set_project_property DEVICE {1SM21CHU1F53E1VG} + set_project_property DEVICE_FAMILY {Stratix 10} + set_project_property HIDE_FROM_IP_CATALOG {true} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_instance xcvr_atx_pll_s10_htile_0 altera_xcvr_atx_pll_s10_htile + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {base_device} {Unknown} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {bw_sel} {high} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_28G_input_frm_abv_atx} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_28G_input_frm_blw_atx} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_28G_local_atx_path} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_28G_output_frm_abv_atx} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_28G_output_frm_blw_atx} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_8G_path} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_GXT_clock_source} {disabled} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_GXT_out_buffer_abv} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_GXT_out_buffer_blw} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_analog_resets} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_bonding_clks} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_cascade_out} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_debug_ports_parameters} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_ext_lockdetect_ports} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_fb_comp_bonding} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_hfreq_clk} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_hip_cal_done_port} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_manual_configuration} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_mcgb} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_mcgb_pcie_clksw} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_mcgb_reset} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_pcie_clk} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_pcie_hip_connectivity} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_pld_atx_cal_busy_port} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_pld_mcgb_cal_busy_port} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_pll_lock} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {enable_vco_bypass} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {generate_add_hdl_instance_example} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {mcgb_aux_clkin_cnt} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {mcgb_div} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {message_level} {error} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {pma_width} {64} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {primary_pll_buffer} {GX clock output buffer} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {prot_mode} {Basic} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_debug} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_enable_avmm_busy_port} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_file_prefix} {altera_xcvr_atx_pll_s10} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_files_as_common_package} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_h_file_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_jtag_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_mif_file_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_multi_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_cnt} {2} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data0} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data1} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data2} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data3} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data4} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data5} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data6} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_data7} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_profile_select} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_reduced_files_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data0} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data1} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data2} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data3} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data4} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data5} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data6} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sdc_derived_profile_data7} {} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_separate_avmm_busy} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_sv_file_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {rcfg_txt_file_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {refclk_cnt} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {refclk_index} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_altera_xcvr_atx_pll_s10_calibration_en} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_auto_reference_clock_frequency} {644.53125} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_capability_reg_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_csr_soft_logic_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_fref_clock_frequency} {156.25} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_hip_cal_en} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_k_counter} {1.0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_l_cascade_counter} {4} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_l_cascade_predivider} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_l_counter} {4} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_m_counter} {24} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_manual_reference_clock_frequency} {200.0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_output_clock_frequency} {5156.25} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_rcfg_emb_strm_enable} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_ref_clk_div} {1} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {set_user_identifier} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {silicon_rev} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {support_mode} {user_mode} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {test_mode} {0} + set_instance_parameter_value xcvr_atx_pll_s10_htile_0 {usr_analog_voltage} {1_1V} + set_instance_property xcvr_atx_pll_s10_htile_0 AUTO_EXPORT true + + # add wirelevel expressions + + # add the exports + set_interface_property pll_refclk0 EXPORT_OF xcvr_atx_pll_s10_htile_0.pll_refclk0 + set_interface_property tx_serial_clk EXPORT_OF xcvr_atx_pll_s10_htile_0.tx_serial_clk + set_interface_property pll_locked EXPORT_OF xcvr_atx_pll_s10_htile_0.pll_locked + set_interface_property pll_cal_busy EXPORT_OF xcvr_atx_pll_s10_htile_0.pll_cal_busy + + # set values for exposed HDL parameters + + # set the the module properties + set_module_property BONUS_DATA { + + + + + +} + set_module_property FILE {eth_xcvr_pll.ip} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {eth_xcvr_pll} + + # save the system + sync_sysinfo_parameters + save_system eth_xcvr_pll +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_eth_xcvr_pll + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_reset.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_reset.tcl new file mode 100644 index 000000000..b33562c45 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/ip/eth_xcvr_reset.tcl @@ -0,0 +1,87 @@ +package require -exact qsys 20.4 + +# create the system "eth_xcvr_reset" +proc do_create_eth_xcvr_reset {} { + # create the system + create_system eth_xcvr_reset + set_project_property DEVICE {1SM21CHU1F53E1VG} + set_project_property DEVICE_FAMILY {Stratix 10} + set_project_property HIDE_FROM_IP_CATALOG {true} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_instance xcvr_reset_control_s10_0 altera_xcvr_reset_control_s10 + set_instance_parameter_value xcvr_reset_control_s10_0 {CHANNELS} {4} + set_instance_parameter_value xcvr_reset_control_s10_0 {ENABLE_DIGITAL_SEQ} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {PLLS} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {REDUCED_SIM_TIME} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {RX_ENABLE} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {RX_MANUAL_RESET} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {RX_PER_CHANNEL} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {SYS_CLK_IN_MHZ} {100} + set_instance_parameter_value xcvr_reset_control_s10_0 {TILE_TYPE} {h_tile} + set_instance_parameter_value xcvr_reset_control_s10_0 {TX_ENABLE} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {TX_MANUAL_RESET} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {TX_PER_CHANNEL} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {TX_PLL_ENABLE} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_PLL_LOCK_HYST} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_PLL_POWERDOWN} {1000} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_RX_ANALOGRESET} {40} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_RX_DIGITALRESET} {5000} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_TX_ANALOGRESET} {0} + set_instance_parameter_value xcvr_reset_control_s10_0 {T_TX_DIGITALRESET} {20} + set_instance_parameter_value xcvr_reset_control_s10_0 {gui_pll_cal_busy} {1} + set_instance_parameter_value xcvr_reset_control_s10_0 {gui_split_interfaces} {0} + set_instance_property xcvr_reset_control_s10_0 AUTO_EXPORT true + + # add wirelevel expressions + + # add the exports + set_interface_property clock EXPORT_OF xcvr_reset_control_s10_0.clock + set_interface_property reset EXPORT_OF xcvr_reset_control_s10_0.reset + set_interface_property tx_analogreset EXPORT_OF xcvr_reset_control_s10_0.tx_analogreset + set_interface_property tx_digitalreset EXPORT_OF xcvr_reset_control_s10_0.tx_digitalreset + set_interface_property tx_ready EXPORT_OF xcvr_reset_control_s10_0.tx_ready + set_interface_property pll_locked EXPORT_OF xcvr_reset_control_s10_0.pll_locked + set_interface_property pll_select EXPORT_OF xcvr_reset_control_s10_0.pll_select + set_interface_property tx_cal_busy EXPORT_OF xcvr_reset_control_s10_0.tx_cal_busy + set_interface_property tx_analogreset_stat EXPORT_OF xcvr_reset_control_s10_0.tx_analogreset_stat + set_interface_property tx_digitalreset_stat EXPORT_OF xcvr_reset_control_s10_0.tx_digitalreset_stat + set_interface_property pll_cal_busy EXPORT_OF xcvr_reset_control_s10_0.pll_cal_busy + set_interface_property rx_analogreset EXPORT_OF xcvr_reset_control_s10_0.rx_analogreset + set_interface_property rx_digitalreset EXPORT_OF xcvr_reset_control_s10_0.rx_digitalreset + set_interface_property rx_ready EXPORT_OF xcvr_reset_control_s10_0.rx_ready + set_interface_property rx_is_lockedtodata EXPORT_OF xcvr_reset_control_s10_0.rx_is_lockedtodata + set_interface_property rx_cal_busy EXPORT_OF xcvr_reset_control_s10_0.rx_cal_busy + set_interface_property rx_analogreset_stat EXPORT_OF xcvr_reset_control_s10_0.rx_analogreset_stat + set_interface_property rx_digitalreset_stat EXPORT_OF xcvr_reset_control_s10_0.rx_digitalreset_stat + + # set values for exposed HDL parameters + + # set the the module properties + set_module_property BONUS_DATA { + + + + + +} + set_module_property FILE {eth_xcvr_reset.ip} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {eth_xcvr_reset} + + # save the system + sync_sysinfo_parameters + save_system eth_xcvr_reset +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_eth_xcvr_reset + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/ip/pcie.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/ip/pcie.tcl new file mode 100644 index 000000000..4a3e6c0bf --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/ip/pcie.tcl @@ -0,0 +1,350 @@ +package require -exact qsys 21.3 + +# create the system "pcie" +proc do_create_pcie {} { + # create the system + create_system pcie + set_project_property DEVICE {1SM21CHU1F53E1VG} + set_project_property DEVICE_FAMILY {Stratix 10} + set_project_property HIDE_FROM_IP_CATALOG {true} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_instance pcie_s10_hip_ast_0 altera_pcie_s10_hip_ast + set_instance_parameter_value pcie_s10_hip_ast_0 {anlg_voltage} {1_1V} + set_instance_parameter_value pcie_s10_hip_ast_0 {apps_type_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {bfm_drive_interface_clk_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {bfm_drive_interface_control_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {bfm_drive_interface_npor_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {bfm_drive_interface_pipe_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {ceb_extend_pcie_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {chosen_devkit_hwtcl} {Stratix 10 MX H-Tile Production FPGA Development Kit} + set_instance_parameter_value pcie_s10_hip_ast_0 {cvp_user_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {design_environment} {NATIVE} + set_instance_parameter_value pcie_s10_hip_ast_0 {device_ctrl_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {disable_256_to_512_adapter_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {eios_workaround_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_avst_reset_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_qii_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_sim_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_sim_rp_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_synth_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_synth_rp_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_example_design_tb_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_multi_func_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_pcie_cv_fix} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_pipe32_phyip_ser_driver_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_pld_warm_rst_rdy_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_rx_buffer_limit_ports_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_sriov_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {enable_test_out_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {hip_reconfig_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {hrc_rstctl_timer_g_delay_added_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {msi_info_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pcie_link_inspector_avmm_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pcie_link_inspector_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_auto_lane_flip_ctrl_en_hwtcl} {enable} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar0_address_width_hwtcl} {24} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar0_type_hwtcl} {64-bit prefetchable memory} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_class_code_hwtcl} {131072} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_eq_eieos_cnt_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_expansion_base_address_register_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_loopback_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msi_multiple_msg_cap_hwtcl} {32} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_bir_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_pba_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_pba_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_table_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_msix_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_type0_device_id_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pci_type0_vendor_id_hwtcl} {4097} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_ep_l0s_accpt_latency_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_ep_l1_accpt_latency_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_ext_tag_supp_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_flr_cap_user_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_phy_slot_num_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_port_num_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_sel_deemphasis_hwtcl} {6dB} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_slot_clk_config_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_slot_power_limit_scale_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_cap_slot_power_limit_value_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_pcie_slot_imp_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_revision_id_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_sup_page_size_user_hwtcl} {4KB, 8KB, 64KB, 256KB, 1MB, 4MB} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_sriov_vf_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_subsys_dev_id_hwtcl} {1313} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_subsys_vendor_id_hwtcl} {6538} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_req_cap_st_table_loc_1_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_req_cap_st_table_loc_1_vfcomm_cs2_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_req_cap_st_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_req_cap_st_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_vf_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_vf_count_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_vf_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_vf_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf0_vf_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_class_code_hwtcl} {16711680} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_expansion_base_address_register_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msi_multiple_msg_cap_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_bir_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_pba_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_pba_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_table_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_msix_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_type0_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_pci_type0_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_revision_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_sup_page_size_user_hwtcl} {4KB, 8KB, 64KB, 256KB, 1MB, 4MB} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_sriov_vf_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_subsys_dev_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_subsys_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_req_cap_st_table_loc_1_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_req_cap_st_table_loc_1_vfcomm_cs2_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_req_cap_st_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_req_cap_st_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_vf_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_vf_count_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_vf_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_vf_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf1_vf_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_class_code_hwtcl} {16711680} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_expansion_base_address_register_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msi_multiple_msg_cap_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_bir_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_pba_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_pba_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_table_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_msix_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_type0_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_pci_type0_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_revision_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_sup_page_size_user_hwtcl} {4KB, 8KB, 64KB, 256KB, 1MB, 4MB} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_sriov_vf_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_subsys_dev_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_subsys_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_req_cap_st_table_loc_1_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_req_cap_st_table_loc_1_vfcomm_cs2_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_req_cap_st_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_req_cap_st_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_vf_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_vf_count_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_vf_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_vf_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf2_vf_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_class_code_hwtcl} {16711680} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_expansion_base_address_register_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msi_multiple_msg_cap_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_bir_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_pba_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_pba_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_table_offset_hwtcl} {0.0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_msix_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_type0_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_pci_type0_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_revision_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_sup_page_size_user_hwtcl} {4KB, 8KB, 64KB, 256KB, 1MB, 4MB} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar0_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar0_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar1_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar1_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar2_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar2_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar3_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar3_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar4_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar4_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar5_address_width_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_bar5_type_hwtcl} {Disabled} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_sriov_vf_device_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_subsys_dev_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_subsys_vendor_id_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_req_cap_st_table_loc_1_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_req_cap_st_table_loc_1_vfcomm_cs2_hwtcl} {ST table not present} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_req_cap_st_table_size_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_req_cap_st_table_size_vfcomm_cs2_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_vf_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_vf_count_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_vf_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_vf_tph_st_dev_spec_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pf3_vf_tph_st_int_mode_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {pll_refclk_freq_hwtcl} {100 MHz} + set_instance_parameter_value pcie_s10_hip_ast_0 {select_design_example_hwtcl} {PIO} + set_instance_parameter_value pcie_s10_hip_ast_0 {select_design_example_rtl_lang_hwtcl} {Verilog} + set_instance_parameter_value pcie_s10_hip_ast_0 {select_example_design_sim_BFM_hwtcl} {Intel FPGA BFM} + set_instance_parameter_value pcie_s10_hip_ast_0 {serial_sim_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {targeted_devkit_hwtcl} {NONE} + set_instance_parameter_value pcie_s10_hip_ast_0 {total_pf_count_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {use_ast_parity_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {use_pll_lock_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {use_rpbfm_pro} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_ep_native_hwtcl} {Native} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_maxpayload_size_hwtcl} {1024} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf0_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf0_msi_enable_hwtcl} {1} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf0_msix_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf0_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf1_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf1_msi_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf1_msix_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf1_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf2_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf2_msi_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf2_msix_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf2_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf3_ats_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf3_msi_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf3_msix_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_pf3_tph_cap_enable_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {virtual_rp_ep_mode_hwtcl} {Native Endpoint} + set_instance_parameter_value pcie_s10_hip_ast_0 {wrala_hwtcl} {Gen3x8, Interface - 256 bit, 250 MHz} + set_instance_parameter_value pcie_s10_hip_ast_0 {xcvr_adme_hwtcl} {0} + set_instance_parameter_value pcie_s10_hip_ast_0 {xcvr_reconfig_hwtcl} {0} + set_instance_property pcie_s10_hip_ast_0 AUTO_EXPORT true + + # add wirelevel expressions + + # preserve ports for debug + + # add the exports + set_interface_property refclk EXPORT_OF pcie_s10_hip_ast_0.refclk + set_interface_property coreclkout_hip EXPORT_OF pcie_s10_hip_ast_0.coreclkout_hip + set_interface_property npor EXPORT_OF pcie_s10_hip_ast_0.npor + set_interface_property hip_rst EXPORT_OF pcie_s10_hip_ast_0.hip_rst + set_interface_property clr_st EXPORT_OF pcie_s10_hip_ast_0.clr_st + set_interface_property ninit_done EXPORT_OF pcie_s10_hip_ast_0.ninit_done + set_interface_property rx_st EXPORT_OF pcie_s10_hip_ast_0.rx_st + set_interface_property tx_st EXPORT_OF pcie_s10_hip_ast_0.tx_st + set_interface_property rx_bar EXPORT_OF pcie_s10_hip_ast_0.rx_bar + set_interface_property tx_cred EXPORT_OF pcie_s10_hip_ast_0.tx_cred + set_interface_property int_msi EXPORT_OF pcie_s10_hip_ast_0.int_msi + set_interface_property hip_status EXPORT_OF pcie_s10_hip_ast_0.hip_status + set_interface_property config_tl EXPORT_OF pcie_s10_hip_ast_0.config_tl + set_interface_property hip_ctrl EXPORT_OF pcie_s10_hip_ast_0.hip_ctrl + set_interface_property currentspeed EXPORT_OF pcie_s10_hip_ast_0.currentspeed + set_interface_property hip_pipe EXPORT_OF pcie_s10_hip_ast_0.hip_pipe + set_interface_property hip_serial EXPORT_OF pcie_s10_hip_ast_0.hip_serial + set_interface_property power_mgnt EXPORT_OF pcie_s10_hip_ast_0.power_mgnt + + # set values for exposed HDL parameters + + # set the the module properties + set_module_property BONUS_DATA { + + + + + +} + set_module_property FILE {pcie.ip} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {pcie} + + # save the system + sync_sysinfo_parameters + save_system pcie +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_pcie + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/ip/reset_release.tcl b/fpga/mqnic/S10MX_DK/fpga_10g/ip/reset_release.tcl new file mode 100644 index 000000000..d4c02386d --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/ip/reset_release.tcl @@ -0,0 +1,50 @@ +package require -exact qsys 20.4 + +# create the system "reset_release" +proc do_create_reset_release {} { + # create the system + create_system reset_release + set_project_property DEVICE {1SM21CHU1F53E1VG} + set_project_property DEVICE_FAMILY {Stratix 10} + set_project_property HIDE_FROM_IP_CATALOG {true} + set_use_testbench_naming_pattern 0 {} + + # add HDL parameters + + # add the components + add_instance s10_user_rst_clkgate_0 altera_s10_user_rst_clkgate + set_instance_parameter_value s10_user_rst_clkgate_0 {outputType} {Conduit Interface} + set_instance_property s10_user_rst_clkgate_0 AUTO_EXPORT true + + # add wirelevel expressions + + # add the exports + set_interface_property ninit_done EXPORT_OF s10_user_rst_clkgate_0.ninit_done + + # set values for exposed HDL parameters + + # set the the module properties + set_module_property BONUS_DATA { + + + + + +} + set_module_property FILE {reset_release.ip} + set_module_property GENERATION_ID {0x00000000} + set_module_property NAME {reset_release} + + # save the system + sync_sysinfo_parameters + save_system reset_release +} + +proc do_set_exported_interface_sysinfo_parameters {} { +} + +# create all the systems, from bottom up +do_create_reset_release + +# set system info parameters on exported interface, from bottom up +do_set_exported_interface_sysinfo_parameters diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/lib b/fpga/mqnic/S10MX_DK/fpga_10g/lib new file mode 120000 index 000000000..9512b3d5e --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/lib @@ -0,0 +1 @@ +../../../lib/ \ No newline at end of file diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/common b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/common new file mode 120000 index 000000000..449c9409c --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/common @@ -0,0 +1 @@ +../../../../common/rtl/ \ No newline at end of file diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_quad_wrapper.v b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_quad_wrapper.v new file mode 100644 index 000000000..3723a380d --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_quad_wrapper.v @@ -0,0 +1,282 @@ +/* + +Copyright 2021, The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of The Regents of the University of California. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Transceiver and PHY quad wrapper + */ +module eth_xcvr_phy_quad_wrapper ( + input wire xcvr_ctrl_clk, + input wire xcvr_ctrl_rst, + input wire xcvr_ref_clk, + output wire [3:0] xcvr_tx_serial_data, + input wire [3:0] xcvr_rx_serial_data, + + output wire phy_1_tx_clk, + output wire phy_1_tx_rst, + input wire [63:0] phy_1_xgmii_txd, + input wire [7:0] phy_1_xgmii_txc, + output wire phy_1_rx_clk, + output wire phy_1_rx_rst, + output wire [63:0] phy_1_xgmii_rxd, + output wire [7:0] phy_1_xgmii_rxc, + output wire phy_1_rx_block_lock, + output wire phy_1_rx_high_ber, + output wire phy_2_tx_clk, + output wire phy_2_tx_rst, + input wire [63:0] phy_2_xgmii_txd, + input wire [7:0] phy_2_xgmii_txc, + output wire phy_2_rx_clk, + output wire phy_2_rx_rst, + output wire [63:0] phy_2_xgmii_rxd, + output wire [7:0] phy_2_xgmii_rxc, + output wire phy_2_rx_block_lock, + output wire phy_2_rx_high_ber, + output wire phy_3_tx_clk, + output wire phy_3_tx_rst, + input wire [63:0] phy_3_xgmii_txd, + input wire [7:0] phy_3_xgmii_txc, + output wire phy_3_rx_clk, + output wire phy_3_rx_rst, + output wire [63:0] phy_3_xgmii_rxd, + output wire [7:0] phy_3_xgmii_rxc, + output wire phy_3_rx_block_lock, + output wire phy_3_rx_high_ber, + output wire phy_4_tx_clk, + output wire phy_4_tx_rst, + input wire [63:0] phy_4_xgmii_txd, + input wire [7:0] phy_4_xgmii_txc, + output wire phy_4_rx_clk, + output wire phy_4_rx_rst, + output wire [63:0] phy_4_xgmii_rxd, + output wire [7:0] phy_4_xgmii_rxc, + output wire phy_4_rx_block_lock, + output wire phy_4_rx_high_ber +); + +wire xcvr_pll_locked; +wire xcvr_pll_cal_busy; + +wire xcvr_tx_serial_clk; + +wire [3:0] xcvr_tx_analogreset; +wire [3:0] xcvr_rx_analogreset; +wire [3:0] xcvr_tx_digitalreset; +wire [3:0] xcvr_rx_digitalreset; +wire [3:0] xcvr_tx_analogreset_stat; +wire [3:0] xcvr_rx_analogreset_stat; +wire [3:0] xcvr_tx_digitalreset_stat; +wire [3:0] xcvr_rx_digitalreset_stat; +wire [3:0] xcvr_tx_cal_busy; +wire [3:0] xcvr_rx_cal_busy; +wire [3:0] xcvr_rx_is_lockedtoref; +wire [3:0] xcvr_rx_is_lockedtodata; +wire [3:0] xcvr_tx_ready; +wire [3:0] xcvr_rx_ready; + +eth_xcvr_reset eth_xcvr_reset_inst ( + .clock (xcvr_ctrl_clk), + .reset (xcvr_ctrl_rst), + .tx_analogreset (xcvr_tx_analogreset), + .tx_digitalreset (xcvr_tx_digitalreset), + .tx_ready (xcvr_tx_ready), + .pll_locked (xcvr_pll_locked), + .pll_select (4'd0), + .tx_cal_busy (xcvr_tx_cal_busy), + .tx_analogreset_stat (xcvr_tx_analogreset_stat), + .tx_digitalreset_stat (xcvr_tx_digitalreset_stat), + .pll_cal_busy (xcvr_pll_cal_busy), + .rx_analogreset (xcvr_rx_analogreset), + .rx_digitalreset (xcvr_rx_digitalreset), + .rx_ready (xcvr_rx_ready), + .rx_is_lockedtodata (xcvr_rx_is_lockedtodata), + .rx_cal_busy (xcvr_rx_cal_busy), + .rx_analogreset_stat (xcvr_rx_analogreset_stat), + .rx_digitalreset_stat (xcvr_rx_digitalreset_stat) +); + +eth_xcvr_pll eth_xcvr_pll_inst ( + .pll_refclk0 (xcvr_ref_clk), + .tx_serial_clk (xcvr_tx_serial_clk), + .pll_locked (xcvr_pll_locked), + .pll_cal_busy (xcvr_pll_cal_busy) +); + +eth_xcvr_phy_wrapper eth_xcvr_phy_1 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + .xcvr_tx_analogreset(xcvr_tx_analogreset[0]), + .xcvr_rx_analogreset(xcvr_rx_analogreset[0]), + .xcvr_tx_digitalreset(xcvr_tx_digitalreset[0]), + .xcvr_rx_digitalreset(xcvr_rx_digitalreset[0]), + .xcvr_tx_analogreset_stat(xcvr_tx_analogreset_stat[0]), + .xcvr_rx_analogreset_stat(xcvr_rx_analogreset_stat[0]), + .xcvr_tx_digitalreset_stat(xcvr_tx_digitalreset_stat[0]), + .xcvr_rx_digitalreset_stat(xcvr_rx_digitalreset_stat[0]), + .xcvr_tx_cal_busy(xcvr_tx_cal_busy[0]), + .xcvr_rx_cal_busy(xcvr_rx_cal_busy[0]), + .xcvr_tx_serial_clk(xcvr_tx_serial_clk), + .xcvr_rx_cdr_refclk(xcvr_ref_clk), + .xcvr_tx_serial_data(xcvr_tx_serial_data[0]), + .xcvr_rx_serial_data(xcvr_rx_serial_data[0]), + .xcvr_rx_is_lockedtoref(xcvr_rx_is_lockedtoref[0]), + .xcvr_rx_is_lockedtodata(xcvr_rx_is_lockedtodata[0]), + .xcvr_tx_ready(xcvr_tx_ready[0]), + .xcvr_rx_ready(xcvr_rx_ready[0]), + + .phy_tx_clk(phy_1_tx_clk), + .phy_tx_rst(phy_1_tx_rst), + .phy_xgmii_txd(phy_1_xgmii_txd), + .phy_xgmii_txc(phy_1_xgmii_txc), + .phy_rx_clk(phy_1_rx_clk), + .phy_rx_rst(phy_1_rx_rst), + .phy_xgmii_rxd(phy_1_xgmii_rxd), + .phy_xgmii_rxc(phy_1_xgmii_rxc), + .phy_rx_block_lock(phy_1_rx_block_lock), + .phy_rx_high_ber(phy_1_rx_high_ber) +); + +eth_xcvr_phy_wrapper eth_xcvr_phy_2 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + .xcvr_tx_analogreset(xcvr_tx_analogreset[1]), + .xcvr_rx_analogreset(xcvr_rx_analogreset[1]), + .xcvr_tx_digitalreset(xcvr_tx_digitalreset[1]), + .xcvr_rx_digitalreset(xcvr_rx_digitalreset[1]), + .xcvr_tx_analogreset_stat(xcvr_tx_analogreset_stat[1]), + .xcvr_rx_analogreset_stat(xcvr_rx_analogreset_stat[1]), + .xcvr_tx_digitalreset_stat(xcvr_tx_digitalreset_stat[1]), + .xcvr_rx_digitalreset_stat(xcvr_rx_digitalreset_stat[1]), + .xcvr_tx_cal_busy(xcvr_tx_cal_busy[1]), + .xcvr_rx_cal_busy(xcvr_rx_cal_busy[1]), + .xcvr_tx_serial_clk(xcvr_tx_serial_clk), + .xcvr_rx_cdr_refclk(xcvr_ref_clk), + .xcvr_tx_serial_data(xcvr_tx_serial_data[1]), + .xcvr_rx_serial_data(xcvr_rx_serial_data[1]), + .xcvr_rx_is_lockedtoref(xcvr_rx_is_lockedtoref[1]), + .xcvr_rx_is_lockedtodata(xcvr_rx_is_lockedtodata[1]), + .xcvr_tx_ready(xcvr_tx_ready[1]), + .xcvr_rx_ready(xcvr_rx_ready[1]), + + .phy_tx_clk(phy_2_tx_clk), + .phy_tx_rst(phy_2_tx_rst), + .phy_xgmii_txd(phy_2_xgmii_txd), + .phy_xgmii_txc(phy_2_xgmii_txc), + .phy_rx_clk(phy_2_rx_clk), + .phy_rx_rst(phy_2_rx_rst), + .phy_xgmii_rxd(phy_2_xgmii_rxd), + .phy_xgmii_rxc(phy_2_xgmii_rxc), + .phy_rx_block_lock(phy_2_rx_block_lock), + .phy_rx_high_ber(phy_2_rx_high_ber) +); + +eth_xcvr_phy_wrapper eth_xcvr_phy_3 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + .xcvr_tx_analogreset(xcvr_tx_analogreset[2]), + .xcvr_rx_analogreset(xcvr_rx_analogreset[2]), + .xcvr_tx_digitalreset(xcvr_tx_digitalreset[2]), + .xcvr_rx_digitalreset(xcvr_rx_digitalreset[2]), + .xcvr_tx_analogreset_stat(xcvr_tx_analogreset_stat[2]), + .xcvr_rx_analogreset_stat(xcvr_rx_analogreset_stat[2]), + .xcvr_tx_digitalreset_stat(xcvr_tx_digitalreset_stat[2]), + .xcvr_rx_digitalreset_stat(xcvr_rx_digitalreset_stat[2]), + .xcvr_tx_cal_busy(xcvr_tx_cal_busy[2]), + .xcvr_rx_cal_busy(xcvr_rx_cal_busy[2]), + .xcvr_tx_serial_clk(xcvr_tx_serial_clk), + .xcvr_rx_cdr_refclk(xcvr_ref_clk), + .xcvr_tx_serial_data(xcvr_tx_serial_data[2]), + .xcvr_rx_serial_data(xcvr_rx_serial_data[2]), + .xcvr_rx_is_lockedtoref(xcvr_rx_is_lockedtoref[2]), + .xcvr_rx_is_lockedtodata(xcvr_rx_is_lockedtodata[2]), + .xcvr_tx_ready(xcvr_tx_ready[2]), + .xcvr_rx_ready(xcvr_rx_ready[2]), + + .phy_tx_clk(phy_3_tx_clk), + .phy_tx_rst(phy_3_tx_rst), + .phy_xgmii_txd(phy_3_xgmii_txd), + .phy_xgmii_txc(phy_3_xgmii_txc), + .phy_rx_clk(phy_3_rx_clk), + .phy_rx_rst(phy_3_rx_rst), + .phy_xgmii_rxd(phy_3_xgmii_rxd), + .phy_xgmii_rxc(phy_3_xgmii_rxc), + .phy_rx_block_lock(phy_3_rx_block_lock), + .phy_rx_high_ber(phy_3_rx_high_ber) +); + +eth_xcvr_phy_wrapper eth_xcvr_phy_4 ( + .xcvr_ctrl_clk(xcvr_ctrl_clk), + .xcvr_ctrl_rst(xcvr_ctrl_rst), + + .xcvr_tx_analogreset(xcvr_tx_analogreset[3]), + .xcvr_rx_analogreset(xcvr_rx_analogreset[3]), + .xcvr_tx_digitalreset(xcvr_tx_digitalreset[3]), + .xcvr_rx_digitalreset(xcvr_rx_digitalreset[3]), + .xcvr_tx_analogreset_stat(xcvr_tx_analogreset_stat[3]), + .xcvr_rx_analogreset_stat(xcvr_rx_analogreset_stat[3]), + .xcvr_tx_digitalreset_stat(xcvr_tx_digitalreset_stat[3]), + .xcvr_rx_digitalreset_stat(xcvr_rx_digitalreset_stat[3]), + .xcvr_tx_cal_busy(xcvr_tx_cal_busy[3]), + .xcvr_rx_cal_busy(xcvr_rx_cal_busy[3]), + .xcvr_tx_serial_clk(xcvr_tx_serial_clk), + .xcvr_rx_cdr_refclk(xcvr_ref_clk), + .xcvr_tx_serial_data(xcvr_tx_serial_data[3]), + .xcvr_rx_serial_data(xcvr_rx_serial_data[3]), + .xcvr_rx_is_lockedtoref(xcvr_rx_is_lockedtoref[3]), + .xcvr_rx_is_lockedtodata(xcvr_rx_is_lockedtodata[3]), + .xcvr_tx_ready(xcvr_tx_ready[3]), + .xcvr_rx_ready(xcvr_rx_ready[3]), + + .phy_tx_clk(phy_4_tx_clk), + .phy_tx_rst(phy_4_tx_rst), + .phy_xgmii_txd(phy_4_xgmii_txd), + .phy_xgmii_txc(phy_4_xgmii_txc), + .phy_rx_clk(phy_4_rx_clk), + .phy_rx_rst(phy_4_rx_rst), + .phy_xgmii_rxd(phy_4_xgmii_rxd), + .phy_xgmii_rxc(phy_4_xgmii_rxc), + .phy_rx_block_lock(phy_4_rx_block_lock), + .phy_rx_high_ber(phy_4_rx_high_ber) +); + +endmodule + +`resetall diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_wrapper.v b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_wrapper.v new file mode 100644 index 000000000..537baf302 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/eth_xcvr_phy_wrapper.v @@ -0,0 +1,176 @@ +/* + +Copyright 2021, The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of The Regents of the University of California. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * Transceiver and PHY wrapper + */ +module eth_xcvr_phy_wrapper ( + input wire xcvr_ctrl_clk, + input wire xcvr_ctrl_rst, + + input wire xcvr_tx_analogreset, + input wire xcvr_rx_analogreset, + input wire xcvr_tx_digitalreset, + input wire xcvr_rx_digitalreset, + output wire xcvr_tx_analogreset_stat, + output wire xcvr_rx_analogreset_stat, + output wire xcvr_tx_digitalreset_stat, + output wire xcvr_rx_digitalreset_stat, + output wire xcvr_tx_cal_busy, + output wire xcvr_rx_cal_busy, + input wire xcvr_tx_serial_clk, + input wire xcvr_rx_cdr_refclk, + output wire xcvr_tx_serial_data, + input wire xcvr_rx_serial_data, + output wire xcvr_rx_is_lockedtoref, + output wire xcvr_rx_is_lockedtodata, + input wire xcvr_tx_ready, + input wire xcvr_rx_ready, + + output wire phy_tx_clk, + output wire phy_tx_rst, + input wire [63:0] phy_xgmii_txd, + input wire [7:0] phy_xgmii_txc, + output wire phy_rx_clk, + output wire phy_rx_rst, + output wire [63:0] phy_xgmii_rxd, + output wire [7:0] phy_xgmii_rxc, + output wire phy_rx_block_lock, + output wire phy_rx_high_ber +); + +wire xcvr_tx_clk; +wire xcvr_rx_clk; + +assign phy_tx_clk = xcvr_tx_clk; +assign phy_rx_clk = xcvr_rx_clk; + +wire [1:0] xcvr_tx_hdr; +wire [63:0] xcvr_tx_data; +wire [1:0] xcvr_rx_hdr; +wire [63:0] xcvr_rx_data; + +wire [1:0] phy_tx_hdr; +wire [63:0] phy_tx_data; +wire [1:0] phy_rx_hdr; +wire [63:0] phy_rx_data; + +wire xcvr_rx_bitslip; + +assign {xcvr_tx_hdr, xcvr_tx_data} = {phy_tx_data, phy_tx_hdr}; +assign {phy_rx_data, phy_rx_hdr} = {xcvr_rx_hdr, xcvr_rx_data}; + +eth_xcvr eth_xcvr_inst ( + .tx_analogreset (xcvr_tx_analogreset), + .rx_analogreset (xcvr_rx_analogreset), + .tx_digitalreset (xcvr_tx_digitalreset), + .rx_digitalreset (xcvr_rx_digitalreset), + .tx_analogreset_stat (xcvr_tx_analogreset_stat), + .rx_analogreset_stat (xcvr_rx_analogreset_stat), + .tx_digitalreset_stat (xcvr_tx_digitalreset_stat), + .rx_digitalreset_stat (xcvr_rx_digitalreset_stat), + .tx_cal_busy (xcvr_tx_cal_busy), + .rx_cal_busy (xcvr_rx_cal_busy), + .tx_serial_clk0 (xcvr_tx_serial_clk), + .rx_cdr_refclk0 (xcvr_rx_cdr_refclk), + .tx_serial_data (xcvr_tx_serial_data), + .rx_serial_data (xcvr_rx_serial_data), + .rx_is_lockedtoref (xcvr_rx_is_lockedtoref), + .rx_is_lockedtodata (xcvr_rx_is_lockedtodata), + .tx_coreclkin (xcvr_tx_clk), + .rx_coreclkin (xcvr_rx_clk), + .tx_clkout (xcvr_tx_clk), + .tx_clkout2 (), + .rx_clkout (xcvr_rx_clk), + .rx_clkout2 (), + .tx_parallel_data (xcvr_tx_data), + .tx_control (xcvr_tx_hdr), + .tx_enh_data_valid (1'b1), + .unused_tx_parallel_data (13'd0), + .rx_parallel_data (xcvr_rx_data), + .rx_control (xcvr_rx_hdr), + .rx_enh_data_valid (), + .unused_rx_parallel_data (), + .rx_bitslip (xcvr_rx_bitslip) +); + +sync_reset #( + .N(4) +) +phy_tx_rst_reset_sync_inst ( + .clk(phy_tx_clk), + .rst(~xcvr_tx_ready), + .out(phy_tx_rst) +); + +sync_reset #( + .N(4) +) +phy_rx_rst_reset_sync_inst ( + .clk(phy_rx_clk), + .rst(~xcvr_rx_ready), + .out(phy_rx_rst) +); + +eth_phy_10g #( + .BIT_REVERSE(0), + .BITSLIP_HIGH_CYCLES(32), + .BITSLIP_LOW_CYCLES(32) +) +phy_inst ( + .tx_clk(phy_tx_clk), + .tx_rst(phy_tx_rst), + .rx_clk(phy_rx_clk), + .rx_rst(phy_rx_rst), + .xgmii_txd(phy_xgmii_txd), + .xgmii_txc(phy_xgmii_txc), + .xgmii_rxd(phy_xgmii_rxd), + .xgmii_rxc(phy_xgmii_rxc), + .serdes_tx_data(phy_tx_data), + .serdes_tx_hdr(phy_tx_hdr), + .serdes_rx_data(phy_rx_data), + .serdes_rx_hdr(phy_rx_hdr), + .serdes_rx_bitslip(xcvr_rx_bitslip), + .rx_block_lock(phy_rx_block_lock), + .rx_high_ber(phy_rx_high_ber) +); + +endmodule + +`resetall diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga.v b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga.v new file mode 100644 index 000000000..4e24a7939 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga.v @@ -0,0 +1,1099 @@ +/* + +Copyright 2021, The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of The Regents of the University of California. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA top-level module + */ +module fpga # +( + // FW and board IDs + parameter FW_ID = 32'd0, + parameter FW_VER = {16'd0, 16'd1}, + parameter BOARD_ID = {16'h1172, 16'h0001}, + parameter BOARD_VER = {16'd0, 16'd1}, + parameter FPGA_ID = 32'h432AC0DD, + + // Structural configuration + parameter IF_COUNT = 2, + parameter PORTS_PER_IF = 1, + + // PTP configuration + parameter PTP_PEROUT_ENABLE = 1, + parameter PTP_PEROUT_COUNT = 1, + + // Queue manager configuration (interface) + parameter EVENT_QUEUE_OP_TABLE_SIZE = 32, + parameter TX_QUEUE_OP_TABLE_SIZE = 32, + parameter RX_QUEUE_OP_TABLE_SIZE = 32, + parameter TX_CPL_QUEUE_OP_TABLE_SIZE = TX_QUEUE_OP_TABLE_SIZE, + parameter RX_CPL_QUEUE_OP_TABLE_SIZE = RX_QUEUE_OP_TABLE_SIZE, + parameter TX_QUEUE_INDEX_WIDTH = 10, + parameter RX_QUEUE_INDEX_WIDTH = 8, + parameter TX_CPL_QUEUE_INDEX_WIDTH = TX_QUEUE_INDEX_WIDTH, + parameter RX_CPL_QUEUE_INDEX_WIDTH = RX_QUEUE_INDEX_WIDTH, + parameter EVENT_QUEUE_PIPELINE = 3, + parameter TX_QUEUE_PIPELINE = 3+(TX_QUEUE_INDEX_WIDTH > 12 ? TX_QUEUE_INDEX_WIDTH-12 : 0), + parameter RX_QUEUE_PIPELINE = 3+(RX_QUEUE_INDEX_WIDTH > 12 ? RX_QUEUE_INDEX_WIDTH-12 : 0), + parameter TX_CPL_QUEUE_PIPELINE = TX_QUEUE_PIPELINE, + parameter RX_CPL_QUEUE_PIPELINE = RX_QUEUE_PIPELINE, + + // TX and RX engine configuration (port) + parameter TX_DESC_TABLE_SIZE = 32, + parameter RX_DESC_TABLE_SIZE = 32, + + // Scheduler configuration (port) + parameter TX_SCHEDULER_OP_TABLE_SIZE = TX_DESC_TABLE_SIZE, + parameter TX_SCHEDULER_PIPELINE = TX_QUEUE_PIPELINE, + parameter TDMA_INDEX_WIDTH = 6, + + // Timestamping configuration (port) + parameter PTP_TS_ENABLE = 1, + parameter TX_PTP_TS_FIFO_DEPTH = 32, + parameter RX_PTP_TS_FIFO_DEPTH = 32, + + // Interface configuration (port) + parameter TX_CHECKSUM_ENABLE = 1, + parameter RX_RSS_ENABLE = 1, + parameter RX_HASH_ENABLE = 1, + parameter RX_CHECKSUM_ENABLE = 1, + parameter TX_FIFO_DEPTH = 32768, + parameter RX_FIFO_DEPTH = 32768, + parameter MAX_TX_SIZE = 9214, + parameter MAX_RX_SIZE = 9214, + parameter TX_RAM_SIZE = 32768, + parameter RX_RAM_SIZE = 32768, + + // Application block configuration + parameter APP_ENABLE = 0, + parameter APP_CTRL_ENABLE = 1, + parameter APP_DMA_ENABLE = 1, + parameter APP_AXIS_DIRECT_ENABLE = 1, + parameter APP_AXIS_SYNC_ENABLE = 1, + parameter APP_AXIS_IF_ENABLE = 1, + parameter APP_STAT_ENABLE = 1, + + // DMA interface configuration + parameter DMA_LEN_WIDTH = 16, + parameter DMA_TAG_WIDTH = 16, + parameter RAM_PIPELINE = 2, + + // PCIe interface configuration + parameter SEG_COUNT = 1, + parameter SEG_DATA_WIDTH = 256, + parameter SEG_EMPTY_WIDTH = $clog2(SEG_DATA_WIDTH/32), + parameter TX_SEQ_NUM_WIDTH = 6, + parameter PF_COUNT = 1, + parameter VF_COUNT = 0, + parameter PCIE_TAG_COUNT = 256, + parameter PCIE_DMA_READ_OP_TABLE_SIZE = PCIE_TAG_COUNT, + parameter PCIE_DMA_READ_TX_LIMIT = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_READ_TX_FC_ENABLE = 1, + parameter PCIE_DMA_WRITE_OP_TABLE_SIZE = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_WRITE_TX_LIMIT = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_WRITE_TX_FC_ENABLE = 1, + + // AXI lite interface configuration (control) + parameter AXIL_CTRL_DATA_WIDTH = 32, + parameter AXIL_CTRL_ADDR_WIDTH = 24, + + // AXI lite interface configuration (application control) + parameter AXIL_APP_CTRL_DATA_WIDTH = AXIL_CTRL_DATA_WIDTH, + parameter AXIL_APP_CTRL_ADDR_WIDTH = 24, + + // Ethernet interface configuration + parameter AXIS_ETH_TX_PIPELINE = 0, + parameter AXIS_ETH_TX_FIFO_PIPELINE = 2, + parameter AXIS_ETH_TX_TS_PIPELINE = 0, + parameter AXIS_ETH_RX_PIPELINE = 0, + parameter AXIS_ETH_RX_FIFO_PIPELINE = 2, + + // Statistics counter subsystem + parameter STAT_ENABLE = 1, + parameter STAT_DMA_ENABLE = 1, + parameter STAT_PCIE_ENABLE = 1, + parameter STAT_INC_WIDTH = 24, + parameter STAT_ID_WIDTH = 12 +) +( + /* + * Clock: 100 MHz + * Reset: Push button, active low + */ + input wire clk_sys_100m_p, + input wire cpu_resetn, + + /* + * GPIO + */ + output wire [3:0] user_led, + + /* + * PCIe: gen 3 x16 + */ + output wire [7:0] pcie_ep_rx_p, + input wire [7:0] pcie_ep_tx_p, + input wire refclk_pcie_ep_edge_p, + input wire s10_pcie_perstn0, + + /* + * Ethernet: QSFP28 + */ + output wire [3:0] qsfp0_tx_p, + input wire [3:0] qsfp0_rx_p, + input wire refclk_qsfp0_p, + + output wire qsfp0_modsel_l, + output wire qsfp0_reset_l, + input wire qsfp0_modprs_l, + output wire qsfp0_lpmode, + input wire qsfp0_int_l, + + output wire [3:0] qsfp1_tx_p, + input wire [3:0] qsfp1_rx_p, + input wire refclk_qsfp1_p, + + output wire qsfp1_modsel_l, + output wire qsfp1_reset_l, + input wire qsfp1_modprs_l, + output wire qsfp1_lpmode, + input wire qsfp1_int_l +); + +// PTP configuration +parameter PTP_TS_WIDTH = 96; +parameter PTP_TAG_WIDTH = 16; +parameter PTP_PERIOD_NS_WIDTH = 4; +parameter PTP_OFFSET_NS_WIDTH = 32; +parameter PTP_FNS_WIDTH = 32; +parameter PTP_PERIOD_NS = 4'd4; +parameter PTP_PERIOD_FNS = 32'd0; +parameter PTP_USE_SAMPLE_CLOCK = 0; +parameter IF_PTP_PERIOD_NS = 6'h6; +parameter IF_PTP_PERIOD_FNS = 16'h6666; + +// PCIe interface configuration +parameter MSI_COUNT = 32; + +// Ethernet interface configuration +parameter XGMII_DATA_WIDTH = 64; +parameter XGMII_CTRL_WIDTH = XGMII_DATA_WIDTH/8; +parameter AXIS_ETH_DATA_WIDTH = XGMII_DATA_WIDTH; +parameter AXIS_ETH_KEEP_WIDTH = AXIS_ETH_DATA_WIDTH/8; +parameter AXIS_ETH_SYNC_DATA_WIDTH = AXIS_ETH_DATA_WIDTH; +parameter AXIS_ETH_TX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TAG_WIDTH : 0) + 1; +parameter AXIS_ETH_RX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1; + +// Clock and reset +wire ninit_done; + +reset_release reset_release_inst ( + .ninit_done (ninit_done) +); + +wire clk_100mhz = clk_sys_100m_p; +wire rst_100mhz; + +sync_reset #( + .N(20) +) +sync_reset_100mhz_inst ( + .clk(clk_100mhz), + .rst(~cpu_resetn || ninit_done), + .out(rst_100mhz) +); + +// PCIe +wire coreclkout_hip; +wire reset_status; + +wire pcie_clk = coreclkout_hip; +wire pcie_rst = reset_status; + +wire [SEG_COUNT*SEG_DATA_WIDTH-1:0] rx_st_data; +wire [SEG_COUNT*SEG_EMPTY_WIDTH-1:0] rx_st_empty; +wire [SEG_COUNT-1:0] rx_st_sop; +wire [SEG_COUNT-1:0] rx_st_eop; +wire [SEG_COUNT-1:0] rx_st_valid; +wire rx_st_ready; +wire [SEG_COUNT-1:0] rx_st_vf_active = 0; +wire [SEG_COUNT*3-1:0] rx_st_func_num = 0; +wire [SEG_COUNT*11-1:0] rx_st_vf_num = 0; +wire [SEG_COUNT*3-1:0] rx_st_bar_range; + +wire [SEG_COUNT*SEG_DATA_WIDTH-1:0] tx_st_data; +wire [SEG_COUNT-1:0] tx_st_sop; +wire [SEG_COUNT-1:0] tx_st_eop; +wire [SEG_COUNT-1:0] tx_st_valid; +wire tx_st_ready; +wire [SEG_COUNT-1:0] tx_st_err; + +wire [7:0] tx_ph_cdts; +wire [11:0] tx_pd_cdts; +wire [7:0] tx_nph_cdts; +wire [11:0] tx_npd_cdts; +wire [7:0] tx_cplh_cdts; +wire [11:0] tx_cpld_cdts; +wire [SEG_COUNT-1:0] tx_hdr_cdts_consumed; +wire [SEG_COUNT-1:0] tx_data_cdts_consumed; +wire [SEG_COUNT*2-1:0] tx_cdts_type; +wire [SEG_COUNT*1-1:0] tx_cdts_data_value; + +wire app_msi_req; +wire app_msi_ack; +wire [2:0] app_msi_tc; +wire [4:0] app_msi_num; +wire [1:0] app_msi_func_num; + +wire [31:0] tl_cfg_ctl; +wire [4:0] tl_cfg_add; +wire [1:0] tl_cfg_func; + +pcie pcie_hip_inst ( + .refclk (refclk_pcie_ep_edge_p), + .coreclkout_hip (coreclkout_hip), + .npor (!rst_100mhz), + .pin_perst (s10_pcie_perstn0), + .reset_status (reset_status), + .serdes_pll_locked (), + .pld_core_ready (1'b1), + .pld_clk_inuse (), + .testin_zero (), + .clr_st (), + .ninit_done (ninit_done), + .rx_st_ready (rx_st_ready), + .rx_st_sop (rx_st_sop), + .rx_st_eop (rx_st_eop), + .rx_st_data (rx_st_data), + .rx_st_valid (rx_st_valid), + .rx_st_empty (rx_st_empty), + .tx_st_sop (tx_st_sop), + .tx_st_eop (tx_st_eop), + .tx_st_data (tx_st_data), + .tx_st_valid (tx_st_valid), + .tx_st_err (tx_st_err), + .tx_st_ready (tx_st_ready), + .rx_st_bar_range (rx_st_bar_range), + .tx_cdts_type (tx_cdts_type), + .tx_data_cdts_consumed (tx_data_cdts_consumed), + .tx_hdr_cdts_consumed (tx_hdr_cdts_consumed), + .tx_cdts_data_value (tx_cdts_data_value), + .tx_cpld_cdts (tx_cpld_cdts), + .tx_pd_cdts (tx_pd_cdts), + .tx_npd_cdts (tx_npd_cdts), + .tx_cplh_cdts (tx_cplh_cdts), + .tx_ph_cdts (tx_ph_cdts), + .tx_nph_cdts (tx_nph_cdts), + .app_msi_req (app_msi_req), + .app_msi_ack (app_msi_ack), + .app_msi_tc (app_msi_tc), + .app_msi_num (app_msi_num), + .app_int_sts (4'd0), + .app_msi_func_num (app_msi_func_num), + .int_status (), + .int_status_common (), + .derr_cor_ext_rpl (), + .derr_rpl (), + .derr_cor_ext_rcv (), + .derr_uncor_ext_rcv (), + .rx_par_err (), + .tx_par_err (), + .ltssmstate (), + .link_up (), + .lane_act (), + .tl_cfg_func (tl_cfg_func), + .tl_cfg_add (tl_cfg_add), + .tl_cfg_ctl (tl_cfg_ctl), + .app_err_valid (0), + .app_err_hdr (0), + .app_err_info (0), + .app_err_func_num (0), + .test_in (0), + .simu_mode_pipe (0), + .currentspeed (), + .sim_pipe_pclk_in (1'b0), + .sim_pipe_rate (), + .sim_ltssmstate (), + .txdata0 (), + .txdata1 (), + .txdata2 (), + .txdata3 (), + .txdata4 (), + .txdata5 (), + .txdata6 (), + .txdata7 (), + .txdatak0 (), + .txdatak1 (), + .txdatak2 (), + .txdatak3 (), + .txdatak4 (), + .txdatak5 (), + .txdatak6 (), + .txdatak7 (), + .txcompl0 (), + .txcompl1 (), + .txcompl2 (), + .txcompl3 (), + .txcompl4 (), + .txcompl5 (), + .txcompl6 (), + .txcompl7 (), + .txelecidle0 (), + .txelecidle1 (), + .txelecidle2 (), + .txelecidle3 (), + .txelecidle4 (), + .txelecidle5 (), + .txelecidle6 (), + .txelecidle7 (), + .txdetectrx0 (), + .txdetectrx1 (), + .txdetectrx2 (), + .txdetectrx3 (), + .txdetectrx4 (), + .txdetectrx5 (), + .txdetectrx6 (), + .txdetectrx7 (), + .powerdown0 (), + .powerdown1 (), + .powerdown2 (), + .powerdown3 (), + .powerdown4 (), + .powerdown5 (), + .powerdown6 (), + .powerdown7 (), + .txmargin0 (), + .txmargin1 (), + .txmargin2 (), + .txmargin3 (), + .txmargin4 (), + .txmargin5 (), + .txmargin6 (), + .txmargin7 (), + .txdeemph0 (), + .txdeemph1 (), + .txdeemph2 (), + .txdeemph3 (), + .txdeemph4 (), + .txdeemph5 (), + .txdeemph6 (), + .txdeemph7 (), + .txswing0 (), + .txswing1 (), + .txswing2 (), + .txswing3 (), + .txswing4 (), + .txswing5 (), + .txswing6 (), + .txswing7 (), + .txsynchd0 (), + .txsynchd1 (), + .txsynchd2 (), + .txsynchd3 (), + .txsynchd4 (), + .txsynchd5 (), + .txsynchd6 (), + .txsynchd7 (), + .txblkst0 (), + .txblkst1 (), + .txblkst2 (), + .txblkst3 (), + .txblkst4 (), + .txblkst5 (), + .txblkst6 (), + .txblkst7 (), + .txdataskip0 (), + .txdataskip1 (), + .txdataskip2 (), + .txdataskip3 (), + .txdataskip4 (), + .txdataskip5 (), + .txdataskip6 (), + .txdataskip7 (), + .rate0 (), + .rate1 (), + .rate2 (), + .rate3 (), + .rate4 (), + .rate5 (), + .rate6 (), + .rate7 (), + .rxpolarity0 (), + .rxpolarity1 (), + .rxpolarity2 (), + .rxpolarity3 (), + .rxpolarity4 (), + .rxpolarity5 (), + .rxpolarity6 (), + .rxpolarity7 (), + .currentrxpreset0 (), + .currentrxpreset1 (), + .currentrxpreset2 (), + .currentrxpreset3 (), + .currentrxpreset4 (), + .currentrxpreset5 (), + .currentrxpreset6 (), + .currentrxpreset7 (), + .currentcoeff0 (), + .currentcoeff1 (), + .currentcoeff2 (), + .currentcoeff3 (), + .currentcoeff4 (), + .currentcoeff5 (), + .currentcoeff6 (), + .currentcoeff7 (), + .rxeqeval0 (), + .rxeqeval1 (), + .rxeqeval2 (), + .rxeqeval3 (), + .rxeqeval4 (), + .rxeqeval5 (), + .rxeqeval6 (), + .rxeqeval7 (), + .rxeqinprogress0 (), + .rxeqinprogress1 (), + .rxeqinprogress2 (), + .rxeqinprogress3 (), + .rxeqinprogress4 (), + .rxeqinprogress5 (), + .rxeqinprogress6 (), + .rxeqinprogress7 (), + .invalidreq0 (), + .invalidreq1 (), + .invalidreq2 (), + .invalidreq3 (), + .invalidreq4 (), + .invalidreq5 (), + .invalidreq6 (), + .invalidreq7 (), + .rxdata0 (32'd0), + .rxdata1 (32'd0), + .rxdata2 (32'd0), + .rxdata3 (32'd0), + .rxdata4 (32'd0), + .rxdata5 (32'd0), + .rxdata6 (32'd0), + .rxdata7 (32'd0), + .rxdatak0 (4'd0), + .rxdatak1 (4'd0), + .rxdatak2 (4'd0), + .rxdatak3 (4'd0), + .rxdatak4 (4'd0), + .rxdatak5 (4'd0), + .rxdatak6 (4'd0), + .rxdatak7 (4'd0), + .phystatus0 (1'b0), + .phystatus1 (1'b0), + .phystatus2 (1'b0), + .phystatus3 (1'b0), + .phystatus4 (1'b0), + .phystatus5 (1'b0), + .phystatus6 (1'b0), + .phystatus7 (1'b0), + .rxvalid0 (1'b0), + .rxvalid1 (1'b0), + .rxvalid2 (1'b0), + .rxvalid3 (1'b0), + .rxvalid4 (1'b0), + .rxvalid5 (1'b0), + .rxvalid6 (1'b0), + .rxvalid7 (1'b0), + .rxstatus0 (3'd0), + .rxstatus1 (3'd0), + .rxstatus2 (3'd0), + .rxstatus3 (3'd0), + .rxstatus4 (3'd0), + .rxstatus5 (3'd0), + .rxstatus6 (3'd0), + .rxstatus7 (3'd0), + .rxelecidle0 (1'b0), + .rxelecidle1 (1'b0), + .rxelecidle2 (1'b0), + .rxelecidle3 (1'b0), + .rxelecidle4 (1'b0), + .rxelecidle5 (1'b0), + .rxelecidle6 (1'b0), + .rxelecidle7 (1'b0), + .rxsynchd0 (2'd0), + .rxsynchd1 (2'd0), + .rxsynchd2 (2'd0), + .rxsynchd3 (2'd0), + .rxsynchd4 (2'd0), + .rxsynchd5 (2'd0), + .rxsynchd6 (2'd0), + .rxsynchd7 (2'd0), + .rxblkst0 (1'b0), + .rxblkst1 (1'b0), + .rxblkst2 (1'b0), + .rxblkst3 (1'b0), + .rxblkst4 (1'b0), + .rxblkst5 (1'b0), + .rxblkst6 (1'b0), + .rxblkst7 (1'b0), + .rxdataskip0 (1'b0), + .rxdataskip1 (1'b0), + .rxdataskip2 (1'b0), + .rxdataskip3 (1'b0), + .rxdataskip4 (1'b0), + .rxdataskip5 (1'b0), + .rxdataskip6 (1'b0), + .rxdataskip7 (1'b0), + .dirfeedback0 (6'd0), + .dirfeedback1 (6'd0), + .dirfeedback2 (6'd0), + .dirfeedback3 (6'd0), + .dirfeedback4 (6'd0), + .dirfeedback5 (6'd0), + .dirfeedback6 (6'd0), + .dirfeedback7 (6'd0), + .sim_pipe_mask_tx_pll_lock (1'b0), + .rx_in0 (pcie_ep_tx_p[0]), + .rx_in1 (pcie_ep_tx_p[1]), + .rx_in2 (pcie_ep_tx_p[2]), + .rx_in3 (pcie_ep_tx_p[3]), + .rx_in4 (pcie_ep_tx_p[4]), + .rx_in5 (pcie_ep_tx_p[5]), + .rx_in6 (pcie_ep_tx_p[6]), + .rx_in7 (pcie_ep_tx_p[7]), + .tx_out0 (pcie_ep_rx_p[0]), + .tx_out1 (pcie_ep_rx_p[1]), + .tx_out2 (pcie_ep_rx_p[2]), + .tx_out3 (pcie_ep_rx_p[3]), + .tx_out4 (pcie_ep_rx_p[4]), + .tx_out5 (pcie_ep_rx_p[5]), + .tx_out6 (pcie_ep_rx_p[6]), + .tx_out7 (pcie_ep_rx_p[7]), + .pm_linkst_in_l1 (), + .pm_linkst_in_l0s (), + .pm_state (), + .pm_dstate (), + .apps_pm_xmt_pme (0), + .apps_ready_entr_l23 (0), + .apps_pm_xmt_turnoff (0), + .app_init_rst (0), + .app_xfer_pending (0) +); + +// XGMII 10G PHY + +// QSFP0 +assign qsfp0_modsel_l = 1'b0; +assign qsfp0_reset_l = 1'b1; +assign qsfp0_lpmode = 1'b0; + +wire qsfp0_tx_clk_1_int; +wire qsfp0_tx_rst_1_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_1_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_1_int; +wire qsfp0_tx_prbs31_enable_1_int; +wire qsfp0_rx_clk_1_int; +wire qsfp0_rx_rst_1_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_1_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_1_int; +wire qsfp0_rx_prbs31_enable_1_int; +wire [6:0] qsfp0_rx_error_count_1_int; +wire qsfp0_tx_clk_2_int; +wire qsfp0_tx_rst_2_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_2_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_2_int; +wire qsfp0_tx_prbs31_enable_2_int; +wire qsfp0_rx_clk_2_int; +wire qsfp0_rx_rst_2_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_2_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_2_int; +wire qsfp0_rx_prbs31_enable_2_int; +wire [6:0] qsfp0_rx_error_count_2_int; +wire qsfp0_tx_clk_3_int; +wire qsfp0_tx_rst_3_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_3_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_3_int; +wire qsfp0_tx_prbs31_enable_3_int; +wire qsfp0_rx_clk_3_int; +wire qsfp0_rx_rst_3_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_3_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_3_int; +wire qsfp0_rx_prbs31_enable_3_int; +wire [6:0] qsfp0_rx_error_count_3_int; +wire qsfp0_tx_clk_4_int; +wire qsfp0_tx_rst_4_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_4_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_4_int; +wire qsfp0_tx_prbs31_enable_4_int; +wire qsfp0_rx_clk_4_int; +wire qsfp0_rx_rst_4_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_4_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_4_int; +wire qsfp0_rx_prbs31_enable_4_int; +wire [6:0] qsfp0_rx_error_count_4_int; + +wire qsfp0_rx_block_lock_1; +wire qsfp0_rx_block_lock_2; +wire qsfp0_rx_block_lock_3; +wire qsfp0_rx_block_lock_4; + +eth_xcvr_phy_quad_wrapper qsfp0_eth_xcvr_phy_quad ( + .xcvr_ctrl_clk(clk_100mhz), + .xcvr_ctrl_rst(rst_100mhz), + .xcvr_ref_clk(refclk_qsfp0_p), + .xcvr_tx_serial_data(qsfp0_tx_p), + .xcvr_rx_serial_data(qsfp0_rx_p), + + .phy_1_tx_clk(qsfp0_tx_clk_1_int), + .phy_1_tx_rst(qsfp0_tx_rst_1_int), + .phy_1_xgmii_txd(qsfp0_txd_1_int), + .phy_1_xgmii_txc(qsfp0_txc_1_int), + .phy_1_rx_clk(qsfp0_rx_clk_1_int), + .phy_1_rx_rst(qsfp0_rx_rst_1_int), + .phy_1_xgmii_rxd(qsfp0_rxd_1_int), + .phy_1_xgmii_rxc(qsfp0_rxc_1_int), + .phy_1_rx_block_lock(qsfp0_rx_block_lock_1), + .phy_1_rx_high_ber(), + .phy_2_tx_clk(qsfp0_tx_clk_2_int), + .phy_2_tx_rst(qsfp0_tx_rst_2_int), + .phy_2_xgmii_txd(qsfp0_txd_2_int), + .phy_2_xgmii_txc(qsfp0_txc_2_int), + .phy_2_rx_clk(qsfp0_rx_clk_2_int), + .phy_2_rx_rst(qsfp0_rx_rst_2_int), + .phy_2_xgmii_rxd(qsfp0_rxd_2_int), + .phy_2_xgmii_rxc(qsfp0_rxc_2_int), + .phy_2_rx_block_lock(qsfp0_rx_block_lock_2), + .phy_2_rx_high_ber(), + .phy_3_tx_clk(qsfp0_tx_clk_3_int), + .phy_3_tx_rst(qsfp0_tx_rst_3_int), + .phy_3_xgmii_txd(qsfp0_txd_3_int), + .phy_3_xgmii_txc(qsfp0_txc_3_int), + .phy_3_rx_clk(qsfp0_rx_clk_3_int), + .phy_3_rx_rst(qsfp0_rx_rst_3_int), + .phy_3_xgmii_rxd(qsfp0_rxd_3_int), + .phy_3_xgmii_rxc(qsfp0_rxc_3_int), + .phy_3_rx_block_lock(qsfp0_rx_block_lock_3), + .phy_3_rx_high_ber(), + .phy_4_tx_clk(qsfp0_tx_clk_4_int), + .phy_4_tx_rst(qsfp0_tx_rst_4_int), + .phy_4_xgmii_txd(qsfp0_txd_4_int), + .phy_4_xgmii_txc(qsfp0_txc_4_int), + .phy_4_rx_clk(qsfp0_rx_clk_4_int), + .phy_4_rx_rst(qsfp0_rx_rst_4_int), + .phy_4_xgmii_rxd(qsfp0_rxd_4_int), + .phy_4_xgmii_rxc(qsfp0_rxc_4_int), + .phy_4_rx_block_lock(qsfp0_rx_block_lock_4), + .phy_4_rx_high_ber() +); + +// QSFP1 +assign qsfp1_modsel_l = 1'b0; +assign qsfp1_reset_l = 1'b1; +assign qsfp1_lpmode = 1'b0; + +wire qsfp1_tx_clk_1_int; +wire qsfp1_tx_rst_1_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_1_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_1_int; +wire qsfp1_tx_prbs31_enable_1_int; +wire qsfp1_rx_clk_1_int; +wire qsfp1_rx_rst_1_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_1_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_1_int; +wire qsfp1_rx_prbs31_enable_1_int; +wire [6:0] qsfp1_rx_error_count_1_int; +wire qsfp1_tx_clk_2_int; +wire qsfp1_tx_rst_2_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_2_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_2_int; +wire qsfp1_tx_prbs31_enable_2_int; +wire qsfp1_rx_clk_2_int; +wire qsfp1_rx_rst_2_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_2_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_2_int; +wire qsfp1_rx_prbs31_enable_2_int; +wire [6:0] qsfp1_rx_error_count_2_int; +wire qsfp1_tx_clk_3_int; +wire qsfp1_tx_rst_3_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_3_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_3_int; +wire qsfp1_tx_prbs31_enable_3_int; +wire qsfp1_rx_clk_3_int; +wire qsfp1_rx_rst_3_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_3_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_3_int; +wire qsfp1_rx_prbs31_enable_3_int; +wire [6:0] qsfp1_rx_error_count_3_int; +wire qsfp1_tx_clk_4_int; +wire qsfp1_tx_rst_4_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_4_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_4_int; +wire qsfp1_tx_prbs31_enable_4_int; +wire qsfp1_rx_clk_4_int; +wire qsfp1_rx_rst_4_int; +wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_4_int; +wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_4_int; +wire qsfp1_rx_prbs31_enable_4_int; +wire [6:0] qsfp1_rx_error_count_4_int; + +wire qsfp1_rx_block_lock_1; +wire qsfp1_rx_block_lock_2; +wire qsfp1_rx_block_lock_3; +wire qsfp1_rx_block_lock_4; + +eth_xcvr_phy_quad_wrapper qsfp1_eth_xcvr_phy_quad ( + .xcvr_ctrl_clk(clk_100mhz), + .xcvr_ctrl_rst(rst_100mhz), + .xcvr_ref_clk(refclk_qsfp1_p), + .xcvr_tx_serial_data(qsfp1_tx_p), + .xcvr_rx_serial_data(qsfp1_rx_p), + + .phy_1_tx_clk(qsfp1_tx_clk_1_int), + .phy_1_tx_rst(qsfp1_tx_rst_1_int), + .phy_1_xgmii_txd(qsfp1_txd_1_int), + .phy_1_xgmii_txc(qsfp1_txc_1_int), + .phy_1_rx_clk(qsfp1_rx_clk_1_int), + .phy_1_rx_rst(qsfp1_rx_rst_1_int), + .phy_1_xgmii_rxd(qsfp1_rxd_1_int), + .phy_1_xgmii_rxc(qsfp1_rxc_1_int), + .phy_1_rx_block_lock(qsfp1_rx_block_lock_1), + .phy_1_rx_high_ber(), + .phy_2_tx_clk(qsfp1_tx_clk_2_int), + .phy_2_tx_rst(qsfp1_tx_rst_2_int), + .phy_2_xgmii_txd(qsfp1_txd_2_int), + .phy_2_xgmii_txc(qsfp1_txc_2_int), + .phy_2_rx_clk(qsfp1_rx_clk_2_int), + .phy_2_rx_rst(qsfp1_rx_rst_2_int), + .phy_2_xgmii_rxd(qsfp1_rxd_2_int), + .phy_2_xgmii_rxc(qsfp1_rxc_2_int), + .phy_2_rx_block_lock(qsfp1_rx_block_lock_2), + .phy_2_rx_high_ber(), + .phy_3_tx_clk(qsfp1_tx_clk_3_int), + .phy_3_tx_rst(qsfp1_tx_rst_3_int), + .phy_3_xgmii_txd(qsfp1_txd_3_int), + .phy_3_xgmii_txc(qsfp1_txc_3_int), + .phy_3_rx_clk(qsfp1_rx_clk_3_int), + .phy_3_rx_rst(qsfp1_rx_rst_3_int), + .phy_3_xgmii_rxd(qsfp1_rxd_3_int), + .phy_3_xgmii_rxc(qsfp1_rxc_3_int), + .phy_3_rx_block_lock(qsfp1_rx_block_lock_3), + .phy_3_rx_high_ber(), + .phy_4_tx_clk(qsfp1_tx_clk_4_int), + .phy_4_tx_rst(qsfp1_tx_rst_4_int), + .phy_4_xgmii_txd(qsfp1_txd_4_int), + .phy_4_xgmii_txc(qsfp1_txc_4_int), + .phy_4_rx_clk(qsfp1_rx_clk_4_int), + .phy_4_rx_rst(qsfp1_rx_rst_4_int), + .phy_4_xgmii_rxd(qsfp1_rxd_4_int), + .phy_4_xgmii_rxc(qsfp1_rxc_4_int), + .phy_4_rx_block_lock(qsfp1_rx_block_lock_4), + .phy_4_rx_high_ber() +); + +fpga_core #( + // FW and board IDs + .FW_ID(FW_ID), + .FW_VER(FW_VER), + .BOARD_ID(BOARD_ID), + .BOARD_VER(BOARD_VER), + .FPGA_ID(FPGA_ID), + + // Structural configuration + .IF_COUNT(IF_COUNT), + .PORTS_PER_IF(PORTS_PER_IF), + + // PTP configuration + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .PTP_TAG_WIDTH(PTP_TAG_WIDTH), + .PTP_PERIOD_NS_WIDTH(PTP_PERIOD_NS_WIDTH), + .PTP_OFFSET_NS_WIDTH(PTP_OFFSET_NS_WIDTH), + .PTP_FNS_WIDTH(PTP_FNS_WIDTH), + .PTP_PERIOD_NS(PTP_PERIOD_NS), + .PTP_PERIOD_FNS(PTP_PERIOD_FNS), + .PTP_USE_SAMPLE_CLOCK(PTP_USE_SAMPLE_CLOCK), + .PTP_PEROUT_ENABLE(PTP_PEROUT_ENABLE), + .PTP_PEROUT_COUNT(PTP_PEROUT_COUNT), + .IF_PTP_PERIOD_NS(IF_PTP_PERIOD_NS), + .IF_PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS), + + // Queue manager configuration (interface) + .EVENT_QUEUE_OP_TABLE_SIZE(EVENT_QUEUE_OP_TABLE_SIZE), + .TX_QUEUE_OP_TABLE_SIZE(TX_QUEUE_OP_TABLE_SIZE), + .RX_QUEUE_OP_TABLE_SIZE(RX_QUEUE_OP_TABLE_SIZE), + .TX_CPL_QUEUE_OP_TABLE_SIZE(TX_CPL_QUEUE_OP_TABLE_SIZE), + .RX_CPL_QUEUE_OP_TABLE_SIZE(RX_CPL_QUEUE_OP_TABLE_SIZE), + .TX_QUEUE_INDEX_WIDTH(TX_QUEUE_INDEX_WIDTH), + .RX_QUEUE_INDEX_WIDTH(RX_QUEUE_INDEX_WIDTH), + .TX_CPL_QUEUE_INDEX_WIDTH(TX_CPL_QUEUE_INDEX_WIDTH), + .RX_CPL_QUEUE_INDEX_WIDTH(RX_CPL_QUEUE_INDEX_WIDTH), + .EVENT_QUEUE_PIPELINE(EVENT_QUEUE_PIPELINE), + .TX_QUEUE_PIPELINE(TX_QUEUE_PIPELINE), + .RX_QUEUE_PIPELINE(RX_QUEUE_PIPELINE), + .TX_CPL_QUEUE_PIPELINE(TX_CPL_QUEUE_PIPELINE), + .RX_CPL_QUEUE_PIPELINE(RX_CPL_QUEUE_PIPELINE), + + // TX and RX engine configuration (port) + .TX_DESC_TABLE_SIZE(TX_DESC_TABLE_SIZE), + .RX_DESC_TABLE_SIZE(RX_DESC_TABLE_SIZE), + + // Scheduler configuration (port) + .TX_SCHEDULER_OP_TABLE_SIZE(TX_SCHEDULER_OP_TABLE_SIZE), + .TX_SCHEDULER_PIPELINE(TX_SCHEDULER_PIPELINE), + .TDMA_INDEX_WIDTH(TDMA_INDEX_WIDTH), + + // Timestamping configuration (port) + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .TX_PTP_TS_FIFO_DEPTH(TX_PTP_TS_FIFO_DEPTH), + .RX_PTP_TS_FIFO_DEPTH(RX_PTP_TS_FIFO_DEPTH), + + // Interface configuration (port) + .TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE), + .RX_RSS_ENABLE(RX_RSS_ENABLE), + .RX_HASH_ENABLE(RX_HASH_ENABLE), + .RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE), + .TX_FIFO_DEPTH(TX_FIFO_DEPTH), + .RX_FIFO_DEPTH(RX_FIFO_DEPTH), + .MAX_TX_SIZE(MAX_TX_SIZE), + .MAX_RX_SIZE(MAX_RX_SIZE), + .TX_RAM_SIZE(TX_RAM_SIZE), + .RX_RAM_SIZE(RX_RAM_SIZE), + + // Application block configuration + .APP_ENABLE(APP_ENABLE), + .APP_CTRL_ENABLE(APP_CTRL_ENABLE), + .APP_DMA_ENABLE(APP_DMA_ENABLE), + .APP_AXIS_DIRECT_ENABLE(APP_AXIS_DIRECT_ENABLE), + .APP_AXIS_SYNC_ENABLE(APP_AXIS_SYNC_ENABLE), + .APP_AXIS_IF_ENABLE(APP_AXIS_IF_ENABLE), + .APP_STAT_ENABLE(APP_STAT_ENABLE), + + // DMA interface configuration + .DMA_LEN_WIDTH(DMA_LEN_WIDTH), + .DMA_TAG_WIDTH(DMA_TAG_WIDTH), + .RAM_PIPELINE(RAM_PIPELINE), + + // PCIe interface configuration + .SEG_COUNT(SEG_COUNT), + .SEG_DATA_WIDTH(SEG_DATA_WIDTH), + .SEG_EMPTY_WIDTH(SEG_EMPTY_WIDTH), + .TX_SEQ_NUM_WIDTH(TX_SEQ_NUM_WIDTH), + .PF_COUNT(PF_COUNT), + .VF_COUNT(VF_COUNT), + .PCIE_TAG_COUNT(PCIE_TAG_COUNT), + .PCIE_DMA_READ_OP_TABLE_SIZE(PCIE_DMA_READ_OP_TABLE_SIZE), + .PCIE_DMA_READ_TX_LIMIT(PCIE_DMA_READ_TX_LIMIT), + .PCIE_DMA_READ_TX_FC_ENABLE(PCIE_DMA_READ_TX_FC_ENABLE), + .PCIE_DMA_WRITE_OP_TABLE_SIZE(PCIE_DMA_WRITE_OP_TABLE_SIZE), + .PCIE_DMA_WRITE_TX_LIMIT(PCIE_DMA_WRITE_TX_LIMIT), + .PCIE_DMA_WRITE_TX_FC_ENABLE(PCIE_DMA_WRITE_TX_FC_ENABLE), + .MSI_COUNT(MSI_COUNT), + + // AXI lite interface configuration (control) + .AXIL_CTRL_DATA_WIDTH(AXIL_CTRL_DATA_WIDTH), + .AXIL_CTRL_ADDR_WIDTH(AXIL_CTRL_ADDR_WIDTH), + + // AXI lite interface configuration (application control) + .AXIL_APP_CTRL_DATA_WIDTH(AXIL_APP_CTRL_DATA_WIDTH), + .AXIL_APP_CTRL_ADDR_WIDTH(AXIL_APP_CTRL_ADDR_WIDTH), + + // Ethernet interface configuration + .XGMII_DATA_WIDTH(XGMII_DATA_WIDTH), + .XGMII_CTRL_WIDTH(XGMII_CTRL_WIDTH), + .AXIS_ETH_DATA_WIDTH(AXIS_ETH_DATA_WIDTH), + .AXIS_ETH_KEEP_WIDTH(AXIS_ETH_KEEP_WIDTH), + .AXIS_ETH_SYNC_DATA_WIDTH(AXIS_ETH_SYNC_DATA_WIDTH), + .AXIS_ETH_TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH), + .AXIS_ETH_RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH), + .AXIS_ETH_TX_PIPELINE(AXIS_ETH_TX_PIPELINE), + .AXIS_ETH_TX_FIFO_PIPELINE(AXIS_ETH_TX_FIFO_PIPELINE), + .AXIS_ETH_TX_TS_PIPELINE(AXIS_ETH_TX_TS_PIPELINE), + .AXIS_ETH_RX_PIPELINE(AXIS_ETH_RX_PIPELINE), + .AXIS_ETH_RX_FIFO_PIPELINE(AXIS_ETH_RX_FIFO_PIPELINE), + + // Statistics counter subsystem + .STAT_ENABLE(STAT_ENABLE), + .STAT_DMA_ENABLE(STAT_DMA_ENABLE), + .STAT_PCIE_ENABLE(STAT_PCIE_ENABLE), + .STAT_INC_WIDTH(STAT_INC_WIDTH), + .STAT_ID_WIDTH(STAT_ID_WIDTH) +) +core_inst ( + /* + * Clock: 250 MHz + * Synchronous reset + */ + .clk_250mhz(pcie_clk), + .rst_250mhz(pcie_rst), + + /* + * GPIO + */ + .user_led(user_led), + + /* + * H-tile RX AVST interface + */ + .rx_st_data(rx_st_data), + .rx_st_empty(rx_st_empty), + .rx_st_sop(rx_st_sop), + .rx_st_eop(rx_st_eop), + .rx_st_valid(rx_st_valid), + .rx_st_ready(rx_st_ready), + .rx_st_vf_active(rx_st_vf_active), + .rx_st_func_num(rx_st_func_num), + .rx_st_vf_num(rx_st_vf_num), + .rx_st_bar_range(rx_st_bar_range), + + .tx_st_data(tx_st_data), + .tx_st_sop(tx_st_sop), + .tx_st_eop(tx_st_eop), + .tx_st_valid(tx_st_valid), + .tx_st_ready(tx_st_ready), + .tx_st_err(tx_st_err), + + .tx_ph_cdts(tx_ph_cdts), + .tx_pd_cdts(tx_pd_cdts), + .tx_nph_cdts(tx_nph_cdts), + .tx_npd_cdts(tx_npd_cdts), + .tx_cplh_cdts(tx_cplh_cdts), + .tx_cpld_cdts(tx_cpld_cdts), + .tx_hdr_cdts_consumed(tx_hdr_cdts_consumed), + .tx_data_cdts_consumed(tx_data_cdts_consumed), + .tx_cdts_type(tx_cdts_type), + .tx_cdts_data_value(tx_cdts_data_value), + + .app_msi_req(app_msi_req), + .app_msi_ack(app_msi_ack), + .app_msi_tc(app_msi_tc), + .app_msi_num(app_msi_num), + .app_msi_func_num(app_msi_func_num), + + .tl_cfg_ctl(tl_cfg_ctl), + .tl_cfg_add(tl_cfg_add), + .tl_cfg_func(tl_cfg_func), + + /* + * Ethernet: QSFP28 + */ + .qsfp0_tx_clk_1(qsfp0_tx_clk_1_int), + .qsfp0_tx_rst_1(qsfp0_tx_rst_1_int), + .qsfp0_txd_1(qsfp0_txd_1_int), + .qsfp0_txc_1(qsfp0_txc_1_int), + .qsfp0_tx_prbs31_enable_1(qsfp0_tx_prbs31_enable_1_int), + .qsfp0_rx_clk_1(qsfp0_rx_clk_1_int), + .qsfp0_rx_rst_1(qsfp0_rx_rst_1_int), + .qsfp0_rxd_1(qsfp0_rxd_1_int), + .qsfp0_rxc_1(qsfp0_rxc_1_int), + .qsfp0_rx_prbs31_enable_1(qsfp0_rx_prbs31_enable_1_int), + .qsfp0_rx_error_count_1(qsfp0_rx_error_count_1_int), + .qsfp0_tx_clk_2(qsfp0_tx_clk_2_int), + .qsfp0_tx_rst_2(qsfp0_tx_rst_2_int), + .qsfp0_txd_2(qsfp0_txd_2_int), + .qsfp0_txc_2(qsfp0_txc_2_int), + .qsfp0_tx_prbs31_enable_2(qsfp0_tx_prbs31_enable_2_int), + .qsfp0_rx_clk_2(qsfp0_rx_clk_2_int), + .qsfp0_rx_rst_2(qsfp0_rx_rst_2_int), + .qsfp0_rxd_2(qsfp0_rxd_2_int), + .qsfp0_rxc_2(qsfp0_rxc_2_int), + .qsfp0_rx_prbs31_enable_2(qsfp0_rx_prbs31_enable_2_int), + .qsfp0_rx_error_count_2(qsfp0_rx_error_count_2_int), + .qsfp0_tx_clk_3(qsfp0_tx_clk_3_int), + .qsfp0_tx_rst_3(qsfp0_tx_rst_3_int), + .qsfp0_txd_3(qsfp0_txd_3_int), + .qsfp0_txc_3(qsfp0_txc_3_int), + .qsfp0_tx_prbs31_enable_3(qsfp0_tx_prbs31_enable_3_int), + .qsfp0_rx_clk_3(qsfp0_rx_clk_3_int), + .qsfp0_rx_rst_3(qsfp0_rx_rst_3_int), + .qsfp0_rxd_3(qsfp0_rxd_3_int), + .qsfp0_rxc_3(qsfp0_rxc_3_int), + .qsfp0_rx_prbs31_enable_3(qsfp0_rx_prbs31_enable_3_int), + .qsfp0_rx_error_count_3(qsfp0_rx_error_count_3_int), + .qsfp0_tx_clk_4(qsfp0_tx_clk_4_int), + .qsfp0_tx_rst_4(qsfp0_tx_rst_4_int), + .qsfp0_txd_4(qsfp0_txd_4_int), + .qsfp0_txc_4(qsfp0_txc_4_int), + .qsfp0_tx_prbs31_enable_4(qsfp0_tx_prbs31_enable_4_int), + .qsfp0_rx_clk_4(qsfp0_rx_clk_4_int), + .qsfp0_rx_rst_4(qsfp0_rx_rst_4_int), + .qsfp0_rxd_4(qsfp0_rxd_4_int), + .qsfp0_rxc_4(qsfp0_rxc_4_int), + .qsfp0_rx_prbs31_enable_4(qsfp0_rx_prbs31_enable_4_int), + .qsfp0_rx_error_count_4(qsfp0_rx_error_count_4_int), + .qsfp1_tx_clk_1(qsfp1_tx_clk_1_int), + .qsfp1_tx_rst_1(qsfp1_tx_rst_1_int), + .qsfp1_txd_1(qsfp1_txd_1_int), + .qsfp1_txc_1(qsfp1_txc_1_int), + .qsfp1_tx_prbs31_enable_1(qsfp1_tx_prbs31_enable_1_int), + .qsfp1_rx_clk_1(qsfp1_rx_clk_1_int), + .qsfp1_rx_rst_1(qsfp1_rx_rst_1_int), + .qsfp1_rxd_1(qsfp1_rxd_1_int), + .qsfp1_rxc_1(qsfp1_rxc_1_int), + .qsfp1_rx_prbs31_enable_1(qsfp1_rx_prbs31_enable_1_int), + .qsfp1_rx_error_count_1(qsfp1_rx_error_count_1_int), + .qsfp1_tx_clk_2(qsfp1_tx_clk_2_int), + .qsfp1_tx_rst_2(qsfp1_tx_rst_2_int), + .qsfp1_txd_2(qsfp1_txd_2_int), + .qsfp1_txc_2(qsfp1_txc_2_int), + .qsfp1_tx_prbs31_enable_2(qsfp1_tx_prbs31_enable_2_int), + .qsfp1_rx_clk_2(qsfp1_rx_clk_2_int), + .qsfp1_rx_rst_2(qsfp1_rx_rst_2_int), + .qsfp1_rxd_2(qsfp1_rxd_2_int), + .qsfp1_rxc_2(qsfp1_rxc_2_int), + .qsfp1_rx_prbs31_enable_2(qsfp1_rx_prbs31_enable_2_int), + .qsfp1_rx_error_count_2(qsfp1_rx_error_count_2_int), + .qsfp1_tx_clk_3(qsfp1_tx_clk_3_int), + .qsfp1_tx_rst_3(qsfp1_tx_rst_3_int), + .qsfp1_txd_3(qsfp1_txd_3_int), + .qsfp1_txc_3(qsfp1_txc_3_int), + .qsfp1_tx_prbs31_enable_3(qsfp1_tx_prbs31_enable_3_int), + .qsfp1_rx_clk_3(qsfp1_rx_clk_3_int), + .qsfp1_rx_rst_3(qsfp1_rx_rst_3_int), + .qsfp1_rxd_3(qsfp1_rxd_3_int), + .qsfp1_rxc_3(qsfp1_rxc_3_int), + .qsfp1_rx_prbs31_enable_3(qsfp1_rx_prbs31_enable_3_int), + .qsfp1_rx_error_count_3(qsfp1_rx_error_count_3_int), + .qsfp1_tx_clk_4(qsfp1_tx_clk_4_int), + .qsfp1_tx_rst_4(qsfp1_tx_rst_4_int), + .qsfp1_txd_4(qsfp1_txd_4_int), + .qsfp1_txc_4(qsfp1_txc_4_int), + .qsfp1_tx_prbs31_enable_4(qsfp1_tx_prbs31_enable_4_int), + .qsfp1_rx_clk_4(qsfp1_rx_clk_4_int), + .qsfp1_rx_rst_4(qsfp1_rx_rst_4_int), + .qsfp1_rxd_4(qsfp1_rxd_4_int), + .qsfp1_rxc_4(qsfp1_rxc_4_int), + .qsfp1_rx_prbs31_enable_4(qsfp1_rx_prbs31_enable_4_int), + .qsfp1_rx_error_count_4(qsfp1_rx_error_count_4_int) +); + +endmodule + +`resetall diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga_core.v b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga_core.v new file mode 100644 index 000000000..be4c2d719 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/fpga_core.v @@ -0,0 +1,1157 @@ +/* + +Copyright 2021, The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of The Regents of the University of California. + +*/ + +// Language: Verilog 2001 + +`resetall +`timescale 1ns / 1ps +`default_nettype none + +/* + * FPGA core logic + */ +module fpga_core # +( + // FW and board IDs + parameter FW_ID = 32'd0, + parameter FW_VER = {16'd0, 16'd1}, + parameter BOARD_ID = {16'h1c2c, 16'ha00e}, + parameter BOARD_VER = {16'd0, 16'd1}, + parameter FPGA_ID = 32'h432AC0DD, + + // Structural configuration + parameter IF_COUNT = 2, + parameter PORTS_PER_IF = 1, + + // PTP configuration + parameter PTP_TS_WIDTH = 96, + parameter PTP_TAG_WIDTH = 16, + parameter PTP_PERIOD_NS_WIDTH = 4, + parameter PTP_OFFSET_NS_WIDTH = 32, + parameter PTP_FNS_WIDTH = 32, + parameter PTP_PERIOD_NS = 4'd4, + parameter PTP_PERIOD_FNS = 32'd0, + parameter PTP_USE_SAMPLE_CLOCK = 0, + parameter PTP_PEROUT_ENABLE = 1, + parameter PTP_PEROUT_COUNT = 1, + parameter IF_PTP_PERIOD_NS = 6'h6, + parameter IF_PTP_PERIOD_FNS = 16'h6666, + + // Queue manager configuration (interface) + parameter EVENT_QUEUE_OP_TABLE_SIZE = 32, + parameter TX_QUEUE_OP_TABLE_SIZE = 32, + parameter RX_QUEUE_OP_TABLE_SIZE = 32, + parameter TX_CPL_QUEUE_OP_TABLE_SIZE = TX_QUEUE_OP_TABLE_SIZE, + parameter RX_CPL_QUEUE_OP_TABLE_SIZE = RX_QUEUE_OP_TABLE_SIZE, + parameter TX_QUEUE_INDEX_WIDTH = 13, + parameter RX_QUEUE_INDEX_WIDTH = 8, + parameter TX_CPL_QUEUE_INDEX_WIDTH = TX_QUEUE_INDEX_WIDTH, + parameter RX_CPL_QUEUE_INDEX_WIDTH = RX_QUEUE_INDEX_WIDTH, + parameter EVENT_QUEUE_PIPELINE = 3, + parameter TX_QUEUE_PIPELINE = 3+(TX_QUEUE_INDEX_WIDTH > 12 ? TX_QUEUE_INDEX_WIDTH-12 : 0), + parameter RX_QUEUE_PIPELINE = 3+(RX_QUEUE_INDEX_WIDTH > 12 ? RX_QUEUE_INDEX_WIDTH-12 : 0), + parameter TX_CPL_QUEUE_PIPELINE = TX_QUEUE_PIPELINE, + parameter RX_CPL_QUEUE_PIPELINE = RX_QUEUE_PIPELINE, + + // TX and RX engine configuration (port) + parameter TX_DESC_TABLE_SIZE = 32, + parameter RX_DESC_TABLE_SIZE = 32, + + // Scheduler configuration (port) + parameter TX_SCHEDULER_OP_TABLE_SIZE = TX_DESC_TABLE_SIZE, + parameter TX_SCHEDULER_PIPELINE = TX_QUEUE_PIPELINE, + parameter TDMA_INDEX_WIDTH = 6, + + // Timestamping configuration (port) + parameter PTP_TS_ENABLE = 1, + parameter TX_PTP_TS_FIFO_DEPTH = 32, + parameter RX_PTP_TS_FIFO_DEPTH = 32, + + // Interface configuration (port) + parameter TX_CHECKSUM_ENABLE = 1, + parameter RX_RSS_ENABLE = 1, + parameter RX_HASH_ENABLE = 1, + parameter RX_CHECKSUM_ENABLE = 1, + parameter ENABLE_PADDING = 1, + parameter ENABLE_DIC = 1, + parameter MIN_FRAME_LENGTH = 64, + parameter TX_FIFO_DEPTH = 32768, + parameter RX_FIFO_DEPTH = 32768, + parameter MAX_TX_SIZE = 9214, + parameter MAX_RX_SIZE = 9214, + parameter TX_RAM_SIZE = 32768, + parameter RX_RAM_SIZE = 32768, + + // Application block configuration + parameter APP_ENABLE = 0, + parameter APP_CTRL_ENABLE = 1, + parameter APP_DMA_ENABLE = 1, + parameter APP_AXIS_DIRECT_ENABLE = 1, + parameter APP_AXIS_SYNC_ENABLE = 1, + parameter APP_AXIS_IF_ENABLE = 1, + parameter APP_STAT_ENABLE = 1, + + // DMA interface configuration + parameter DMA_LEN_WIDTH = 16, + parameter DMA_TAG_WIDTH = 16, + parameter RAM_PIPELINE = 2, + + // PCIe interface configuration + parameter SEG_COUNT = 1, + parameter SEG_DATA_WIDTH = 256, + parameter SEG_EMPTY_WIDTH = $clog2(SEG_DATA_WIDTH/32), + parameter TX_SEQ_NUM_WIDTH = 6, + parameter PF_COUNT = 1, + parameter VF_COUNT = 0, + parameter PCIE_TAG_COUNT = 256, + parameter PCIE_DMA_READ_OP_TABLE_SIZE = PCIE_TAG_COUNT, + parameter PCIE_DMA_READ_TX_LIMIT = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_READ_TX_FC_ENABLE = 1, + parameter PCIE_DMA_WRITE_OP_TABLE_SIZE = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_WRITE_TX_LIMIT = 2**TX_SEQ_NUM_WIDTH, + parameter PCIE_DMA_WRITE_TX_FC_ENABLE = 1, + parameter MSI_COUNT = 32, + + // AXI lite interface configuration (control) + parameter AXIL_CTRL_DATA_WIDTH = 32, + parameter AXIL_CTRL_ADDR_WIDTH = 24, + + // AXI lite interface configuration (application control) + parameter AXIL_APP_CTRL_DATA_WIDTH = AXIL_CTRL_DATA_WIDTH, + parameter AXIL_APP_CTRL_ADDR_WIDTH = 24, + + // Ethernet interface configuration + parameter XGMII_DATA_WIDTH = 64, + parameter XGMII_CTRL_WIDTH = XGMII_DATA_WIDTH/8, + parameter AXIS_ETH_DATA_WIDTH = XGMII_DATA_WIDTH, + parameter AXIS_ETH_KEEP_WIDTH = AXIS_ETH_DATA_WIDTH/8, + parameter AXIS_ETH_SYNC_DATA_WIDTH = AXIS_ETH_DATA_WIDTH, + parameter AXIS_ETH_TX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TAG_WIDTH : 0) + 1, + parameter AXIS_ETH_RX_USER_WIDTH = (PTP_TS_ENABLE ? PTP_TS_WIDTH : 0) + 1, + parameter AXIS_ETH_TX_PIPELINE = 0, + parameter AXIS_ETH_TX_FIFO_PIPELINE = 2, + parameter AXIS_ETH_TX_TS_PIPELINE = 0, + parameter AXIS_ETH_RX_PIPELINE = 0, + parameter AXIS_ETH_RX_FIFO_PIPELINE = 2, + + // Statistics counter subsystem + parameter STAT_ENABLE = 1, + parameter STAT_DMA_ENABLE = 1, + parameter STAT_PCIE_ENABLE = 1, + parameter STAT_INC_WIDTH = 24, + parameter STAT_ID_WIDTH = 12 +) +( + /* + * Clock: 250 MHz + * Synchronous reset + */ + input wire clk_250mhz, + input wire rst_250mhz, + + /* + * GPIO + */ + output wire [3:0] user_led, + + /* + * H-Tile interface + */ + input wire [SEG_COUNT*SEG_DATA_WIDTH-1:0] rx_st_data, + input wire [SEG_COUNT*SEG_EMPTY_WIDTH-1:0] rx_st_empty, + input wire [SEG_COUNT-1:0] rx_st_sop, + input wire [SEG_COUNT-1:0] rx_st_eop, + input wire [SEG_COUNT-1:0] rx_st_valid, + output wire rx_st_ready, + input wire [SEG_COUNT-1:0] rx_st_vf_active, + input wire [SEG_COUNT*2-1:0] rx_st_func_num, + input wire [SEG_COUNT*11-1:0] rx_st_vf_num, + input wire [SEG_COUNT*3-1:0] rx_st_bar_range, + + output wire [SEG_COUNT*SEG_DATA_WIDTH-1:0] tx_st_data, + output wire [SEG_COUNT-1:0] tx_st_sop, + output wire [SEG_COUNT-1:0] tx_st_eop, + output wire [SEG_COUNT-1:0] tx_st_valid, + input wire tx_st_ready, + output wire [SEG_COUNT-1:0] tx_st_err, + + input wire [7:0] tx_ph_cdts, + input wire [11:0] tx_pd_cdts, + input wire [7:0] tx_nph_cdts, + input wire [11:0] tx_npd_cdts, + input wire [7:0] tx_cplh_cdts, + input wire [11:0] tx_cpld_cdts, + input wire [SEG_COUNT-1:0] tx_hdr_cdts_consumed, + input wire [SEG_COUNT-1:0] tx_data_cdts_consumed, + input wire [SEG_COUNT*2-1:0] tx_cdts_type, + input wire [SEG_COUNT*1-1:0] tx_cdts_data_value, + + output wire app_msi_req, + input wire app_msi_ack, + output wire [2:0] app_msi_tc, + output wire [4:0] app_msi_num, + output wire [1:0] app_msi_func_num, + + input wire [31:0] tl_cfg_ctl, + input wire [4:0] tl_cfg_add, + input wire [1:0] tl_cfg_func, + + /* + * Ethernet: QSFP28 + */ + input wire qsfp0_tx_clk_1, + input wire qsfp0_tx_rst_1, + output wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_1, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_1, + output wire qsfp0_tx_prbs31_enable_1, + input wire qsfp0_rx_clk_1, + input wire qsfp0_rx_rst_1, + input wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_1, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_1, + output wire qsfp0_rx_prbs31_enable_1, + input wire [6:0] qsfp0_rx_error_count_1, + input wire qsfp0_tx_clk_2, + input wire qsfp0_tx_rst_2, + output wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_2, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_2, + output wire qsfp0_tx_prbs31_enable_2, + input wire qsfp0_rx_clk_2, + input wire qsfp0_rx_rst_2, + input wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_2, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_2, + output wire qsfp0_rx_prbs31_enable_2, + input wire [6:0] qsfp0_rx_error_count_2, + input wire qsfp0_tx_clk_3, + input wire qsfp0_tx_rst_3, + output wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_3, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_3, + output wire qsfp0_tx_prbs31_enable_3, + input wire qsfp0_rx_clk_3, + input wire qsfp0_rx_rst_3, + input wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_3, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_3, + output wire qsfp0_rx_prbs31_enable_3, + input wire [6:0] qsfp0_rx_error_count_3, + input wire qsfp0_tx_clk_4, + input wire qsfp0_tx_rst_4, + output wire [XGMII_DATA_WIDTH-1:0] qsfp0_txd_4, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp0_txc_4, + output wire qsfp0_tx_prbs31_enable_4, + input wire qsfp0_rx_clk_4, + input wire qsfp0_rx_rst_4, + input wire [XGMII_DATA_WIDTH-1:0] qsfp0_rxd_4, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp0_rxc_4, + output wire qsfp0_rx_prbs31_enable_4, + input wire [6:0] qsfp0_rx_error_count_4, + input wire qsfp1_tx_clk_1, + input wire qsfp1_tx_rst_1, + output wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_1, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_1, + output wire qsfp1_tx_prbs31_enable_1, + input wire qsfp1_rx_clk_1, + input wire qsfp1_rx_rst_1, + input wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_1, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_1, + output wire qsfp1_rx_prbs31_enable_1, + input wire [6:0] qsfp1_rx_error_count_1, + input wire qsfp1_tx_clk_2, + input wire qsfp1_tx_rst_2, + output wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_2, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_2, + output wire qsfp1_tx_prbs31_enable_2, + input wire qsfp1_rx_clk_2, + input wire qsfp1_rx_rst_2, + input wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_2, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_2, + output wire qsfp1_rx_prbs31_enable_2, + input wire [6:0] qsfp1_rx_error_count_2, + input wire qsfp1_tx_clk_3, + input wire qsfp1_tx_rst_3, + output wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_3, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_3, + output wire qsfp1_tx_prbs31_enable_3, + input wire qsfp1_rx_clk_3, + input wire qsfp1_rx_rst_3, + input wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_3, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_3, + output wire qsfp1_rx_prbs31_enable_3, + input wire [6:0] qsfp1_rx_error_count_3, + input wire qsfp1_tx_clk_4, + input wire qsfp1_tx_rst_4, + output wire [XGMII_DATA_WIDTH-1:0] qsfp1_txd_4, + output wire [XGMII_CTRL_WIDTH-1:0] qsfp1_txc_4, + output wire qsfp1_tx_prbs31_enable_4, + input wire qsfp1_rx_clk_4, + input wire qsfp1_rx_rst_4, + input wire [XGMII_DATA_WIDTH-1:0] qsfp1_rxd_4, + input wire [XGMII_CTRL_WIDTH-1:0] qsfp1_rxc_4, + output wire qsfp1_rx_prbs31_enable_4, + input wire [6:0] qsfp1_rx_error_count_4 +); + +parameter PORT_COUNT = IF_COUNT*PORTS_PER_IF; + +parameter F_COUNT = PF_COUNT+VF_COUNT; + +parameter AXIL_CTRL_STRB_WIDTH = (AXIL_CTRL_DATA_WIDTH/8); +parameter AXIL_IF_CTRL_ADDR_WIDTH = AXIL_CTRL_ADDR_WIDTH-$clog2(IF_COUNT); +parameter AXIL_CSR_ADDR_WIDTH = AXIL_IF_CTRL_ADDR_WIDTH-5-$clog2((PORTS_PER_IF+3)/8); + +initial begin + if (PORT_COUNT > 8) begin + $error("Error: Max port count exceeded (instance %m)"); + $finish; + end +end + +// AXI lite connections +wire [AXIL_CSR_ADDR_WIDTH-1:0] axil_csr_awaddr; +wire [2:0] axil_csr_awprot; +wire axil_csr_awvalid; +wire axil_csr_awready; +wire [AXIL_CTRL_DATA_WIDTH-1:0] axil_csr_wdata; +wire [AXIL_CTRL_STRB_WIDTH-1:0] axil_csr_wstrb; +wire axil_csr_wvalid; +wire axil_csr_wready; +wire [1:0] axil_csr_bresp; +wire axil_csr_bvalid; +wire axil_csr_bready; +wire [AXIL_CSR_ADDR_WIDTH-1:0] axil_csr_araddr; +wire [2:0] axil_csr_arprot; +wire axil_csr_arvalid; +wire axil_csr_arready; +wire [AXIL_CTRL_DATA_WIDTH-1:0] axil_csr_rdata; +wire [1:0] axil_csr_rresp; +wire axil_csr_rvalid; +wire axil_csr_rready; + +// PTP +wire [PTP_TS_WIDTH-1:0] ptp_ts_96; +wire ptp_ts_step; +wire ptp_pps; + +wire [PTP_PEROUT_COUNT-1:0] ptp_perout_locked; +wire [PTP_PEROUT_COUNT-1:0] ptp_perout_error; +wire [PTP_PEROUT_COUNT-1:0] ptp_perout_pulse; + +// control registers +wire [AXIL_CSR_ADDR_WIDTH-1:0] ctrl_reg_wr_addr; +wire [AXIL_CTRL_DATA_WIDTH-1:0] ctrl_reg_wr_data; +wire [AXIL_CTRL_STRB_WIDTH-1:0] ctrl_reg_wr_strb; +wire ctrl_reg_wr_en; +wire ctrl_reg_wr_wait; +wire ctrl_reg_wr_ack; +wire [AXIL_CSR_ADDR_WIDTH-1:0] ctrl_reg_rd_addr; +wire ctrl_reg_rd_en; +wire [AXIL_CTRL_DATA_WIDTH-1:0] ctrl_reg_rd_data; +wire ctrl_reg_rd_wait; +wire ctrl_reg_rd_ack; + +reg ctrl_reg_wr_ack_reg = 1'b0; +reg [AXIL_CTRL_DATA_WIDTH-1:0] ctrl_reg_rd_data_reg = {AXIL_CTRL_DATA_WIDTH{1'b0}}; +reg ctrl_reg_rd_ack_reg = 1'b0; + +reg qsfp0_reset_reg = 1'b0; +reg qsfp0_lp_mode_reg = 1'b0; +// reg qsfp0_i2c_scl_o_reg = 1'b1; +// reg qsfp0_i2c_sda_o_reg = 1'b1; + +reg qsfp1_reset_reg = 1'b0; +reg qsfp1_lp_mode_reg = 1'b0; +// reg qsfp1_i2c_scl_o_reg = 1'b1; +// reg qsfp1_i2c_sda_o_reg = 1'b1; + +// reg fpga_boot_reg = 1'b0; + +// reg qspi_clk_reg = 1'b0; +// reg qspi_cs_reg = 1'b1; +// reg [3:0] qspi_dq_o_reg = 4'd0; +// reg [3:0] qspi_dq_oe_reg = 4'd0; + +assign ctrl_reg_wr_wait = 1'b0; +assign ctrl_reg_wr_ack = ctrl_reg_wr_ack_reg; +assign ctrl_reg_rd_data = ctrl_reg_rd_data_reg; +assign ctrl_reg_rd_wait = 1'b0; +assign ctrl_reg_rd_ack = ctrl_reg_rd_ack_reg; + +// assign qsfp0_reset_n = !qsfp0_reset_reg; +// assign qsfp0_lp_mode = qsfp0_lp_mode_reg; +// assign qsfp0_i2c_scl_o = qsfp0_i2c_scl_o_reg; +// assign qsfp0_i2c_scl_t = qsfp0_i2c_scl_o_reg; +// assign qsfp0_i2c_sda_o = qsfp0_i2c_sda_o_reg; +// assign qsfp0_i2c_sda_t = qsfp0_i2c_sda_o_reg; + +// assign qsfp1_reset_n = !qsfp1_reset_reg; +// assign qsfp1_lp_mode = qsfp1_lp_mode_reg; +// assign qsfp1_i2c_scl_o = qsfp1_i2c_scl_o_reg; +// assign qsfp1_i2c_scl_t = qsfp1_i2c_scl_o_reg; +// assign qsfp1_i2c_sda_o = qsfp1_i2c_sda_o_reg; +// assign qsfp1_i2c_sda_t = qsfp1_i2c_sda_o_reg; + +// assign fpga_boot = fpga_boot_reg; + +// assign qspi_clk = qspi_clk_reg; +// assign qspi_cs = qspi_cs_reg; +// assign qspi_dq_o = qspi_dq_o_reg; +// assign qspi_dq_oe = qspi_dq_oe_reg; + +always @(posedge clk_250mhz) begin + ctrl_reg_wr_ack_reg <= 1'b0; + ctrl_reg_rd_data_reg <= {AXIL_CTRL_DATA_WIDTH{1'b0}}; + ctrl_reg_rd_ack_reg <= 1'b0; + + if (ctrl_reg_wr_en && !ctrl_reg_wr_ack_reg) begin + // write operation + ctrl_reg_wr_ack_reg <= 1'b0; + case ({ctrl_reg_wr_addr >> 2, 2'b00}) + // 16'h0040: begin + // // FPGA ID + // fpga_boot_reg <= ctrl_reg_wr_data == 32'hFEE1DEAD; + // end + // GPIO + // 16'h0110: begin + // // GPIO I2C 0 + // if (ctrl_reg_wr_strb[0]) begin + // qsfp0_i2c_scl_o_reg <= ctrl_reg_wr_data[1]; + // end + // if (ctrl_reg_wr_strb[1]) begin + // qsfp0_i2c_sda_o_reg <= ctrl_reg_wr_data[9]; + // end + // end + // 16'h0114: begin + // // GPIO I2C 1 + // if (ctrl_reg_wr_strb[0]) begin + // qsfp1_i2c_scl_o_reg <= ctrl_reg_wr_data[1]; + // end + // if (ctrl_reg_wr_strb[1]) begin + // qsfp1_i2c_sda_o_reg <= ctrl_reg_wr_data[9]; + // end + // end + // 16'h0120: begin + // // GPIO XCVR 0123 + // if (ctrl_reg_wr_strb[0]) begin + // qsfp0_reset_reg <= ctrl_reg_wr_data[4]; + // qsfp0_lp_mode_reg <= ctrl_reg_wr_data[5]; + // end + // if (ctrl_reg_wr_strb[1]) begin + // qsfp1_reset_reg <= ctrl_reg_wr_data[12]; + // qsfp1_lp_mode_reg <= ctrl_reg_wr_data[13]; + // end + // end + // Flash + // 16'h0144: begin + // // QSPI control + // if (ctrl_reg_wr_strb[0]) begin + // qspi_dq_o_reg <= ctrl_reg_wr_data[3:0]; + // end + // if (ctrl_reg_wr_strb[1]) begin + // qspi_dq_oe_reg <= ctrl_reg_wr_data[11:8]; + // end + // if (ctrl_reg_wr_strb[2]) begin + // qspi_clk_reg <= ctrl_reg_wr_data[16]; + // qspi_cs_reg <= ctrl_reg_wr_data[17]; + // end + // end + default: ctrl_reg_wr_ack_reg <= 1'b0; + endcase + end + + if (ctrl_reg_rd_en && !ctrl_reg_rd_ack_reg) begin + // read operation + ctrl_reg_rd_ack_reg <= 1'b1; + case ({ctrl_reg_rd_addr >> 2, 2'b00}) + 16'h0040: ctrl_reg_rd_data_reg <= FPGA_ID; // FPGA ID + // GPIO + // 16'h0110: begin + // // GPIO I2C 0 + // ctrl_reg_rd_data_reg[0] <= qsfp0_i2c_scl_i; + // ctrl_reg_rd_data_reg[1] <= qsfp0_i2c_scl_o_reg; + // ctrl_reg_rd_data_reg[8] <= qsfp0_i2c_sda_i; + // ctrl_reg_rd_data_reg[9] <= qsfp0_i2c_sda_o_reg; + // end + // 16'h0114: begin + // // GPIO I2C 1 + // ctrl_reg_rd_data_reg[0] <= qsfp1_i2c_scl_i; + // ctrl_reg_rd_data_reg[1] <= qsfp1_i2c_scl_o_reg; + // ctrl_reg_rd_data_reg[8] <= qsfp1_i2c_sda_i; + // ctrl_reg_rd_data_reg[9] <= qsfp1_i2c_sda_o_reg; + // end + // 16'h0120: begin + // // GPIO XCVR 0123 + // ctrl_reg_rd_data_reg[0] <= !qsfp0_mod_prsnt_n; + // ctrl_reg_rd_data_reg[1] <= !qsfp0_intr_n; + // ctrl_reg_rd_data_reg[4] <= qsfp0_reset_reg; + // ctrl_reg_rd_data_reg[5] <= qsfp0_lp_mode_reg; + // ctrl_reg_rd_data_reg[8] <= !qsfp1_mod_prsnt_n; + // ctrl_reg_rd_data_reg[9] <= !qsfp1_intr_n; + // ctrl_reg_rd_data_reg[12] <= qsfp1_reset_reg; + // ctrl_reg_rd_data_reg[13] <= qsfp1_lp_mode_reg; + // end + // Flash + // 16'h0140: begin + // // Flash ID + // ctrl_reg_rd_data_reg[7:0] <= 0; // type (SPI) + // ctrl_reg_rd_data_reg[15:8] <= 1; // configuration (one segment) + // ctrl_reg_rd_data_reg[23:16] <= 4; // data width (QSPI) + // ctrl_reg_rd_data_reg[31:24] <= 0; // address width (N/A for SPI) + // end + // 16'h0144: begin + // // QSPI control + // ctrl_reg_rd_data_reg[3:0] <= qspi_dq_i; + // ctrl_reg_rd_data_reg[11:8] <= qspi_dq_oe; + // ctrl_reg_rd_data_reg[16] <= qspi_clk; + // ctrl_reg_rd_data_reg[17] <= qspi_cs; + // end + default: ctrl_reg_rd_ack_reg <= 1'b0; + endcase + end + + if (rst_250mhz) begin + ctrl_reg_wr_ack_reg <= 1'b0; + ctrl_reg_rd_ack_reg <= 1'b0; + + qsfp0_reset_reg <= 1'b0; + qsfp0_lp_mode_reg <= 1'b0; + // qsfp0_i2c_scl_o_reg <= 1'b1; + // qsfp0_i2c_sda_o_reg <= 1'b1; + + qsfp1_reset_reg <= 1'b0; + qsfp1_lp_mode_reg <= 1'b0; + // qsfp1_i2c_scl_o_reg <= 1'b1; + // qsfp1_i2c_sda_o_reg <= 1'b1; + + // qspi_clk_reg <= 1'b0; + // qspi_cs_reg <= 1'b1; + // qspi_dq_o_reg <= 4'd0; + // qspi_dq_oe_reg <= 4'd0; + end +end + +reg [26:0] pps_led_counter_reg = 0; +reg pps_led_reg = 0; + +always @(posedge clk_250mhz) begin + if (ptp_pps) begin + pps_led_counter_reg <= 125000000; + end else if (pps_led_counter_reg > 0) begin + pps_led_counter_reg <= pps_led_counter_reg - 1; + end + + pps_led_reg <= pps_led_counter_reg > 0; +end + +// // BER tester +// tdma_ber #( +// .COUNT(8), +// .INDEX_WIDTH(6), +// .SLICE_WIDTH(5), +// .AXIL_DATA_WIDTH(AXIL_CTRL_DATA_WIDTH), +// .AXIL_ADDR_WIDTH(8+6+$clog2(8)), +// .AXIL_STRB_WIDTH(AXIL_CTRL_STRB_WIDTH), +// .SCHEDULE_START_S(0), +// .SCHEDULE_START_NS(0), +// .SCHEDULE_PERIOD_S(0), +// .SCHEDULE_PERIOD_NS(1000000), +// .TIMESLOT_PERIOD_S(0), +// .TIMESLOT_PERIOD_NS(100000), +// .ACTIVE_PERIOD_S(0), +// .ACTIVE_PERIOD_NS(90000) +// ) +// tdma_ber_inst ( +// .clk(clk_250mhz), +// .rst(rst_250mhz), +// .phy_tx_clk({qsfp1_tx_clk_4, qsfp1_tx_clk_3, qsfp1_tx_clk_2, qsfp1_tx_clk_1, qsfp0_tx_clk_4, qsfp0_tx_clk_3, qsfp0_tx_clk_2, qsfp0_tx_clk_1}), +// .phy_rx_clk({qsfp1_rx_clk_4, qsfp1_rx_clk_3, qsfp1_rx_clk_2, qsfp1_rx_clk_1, qsfp0_rx_clk_4, qsfp0_rx_clk_3, qsfp0_rx_clk_2, qsfp0_rx_clk_1}), +// .phy_rx_error_count({qsfp1_rx_error_count_4, qsfp1_rx_error_count_3, qsfp1_rx_error_count_2, qsfp1_rx_error_count_1, qsfp0_rx_error_count_4, qsfp0_rx_error_count_3, qsfp0_rx_error_count_2, qsfp0_rx_error_count_1}), +// .phy_tx_prbs31_enable({qsfp1_tx_prbs31_enable_4, qsfp1_tx_prbs31_enable_3, qsfp1_tx_prbs31_enable_2, qsfp1_tx_prbs31_enable_1, qsfp0_tx_prbs31_enable_4, qsfp0_tx_prbs31_enable_3, qsfp0_tx_prbs31_enable_2, qsfp0_tx_prbs31_enable_1}), +// .phy_rx_prbs31_enable({qsfp1_rx_prbs31_enable_4, qsfp1_rx_prbs31_enable_3, qsfp1_rx_prbs31_enable_2, qsfp1_rx_prbs31_enable_1, qsfp0_rx_prbs31_enable_4, qsfp0_rx_prbs31_enable_3, qsfp0_rx_prbs31_enable_2, qsfp0_rx_prbs31_enable_1}), +// .s_axil_awaddr(axil_csr_awaddr), +// .s_axil_awprot(axil_csr_awprot), +// .s_axil_awvalid(axil_csr_awvalid), +// .s_axil_awready(axil_csr_awready), +// .s_axil_wdata(axil_csr_wdata), +// .s_axil_wstrb(axil_csr_wstrb), +// .s_axil_wvalid(axil_csr_wvalid), +// .s_axil_wready(axil_csr_wready), +// .s_axil_bresp(axil_csr_bresp), +// .s_axil_bvalid(axil_csr_bvalid), +// .s_axil_bready(axil_csr_bready), +// .s_axil_araddr(axil_csr_araddr), +// .s_axil_arprot(axil_csr_arprot), +// .s_axil_arvalid(axil_csr_arvalid), +// .s_axil_arready(axil_csr_arready), +// .s_axil_rdata(axil_csr_rdata), +// .s_axil_rresp(axil_csr_rresp), +// .s_axil_rvalid(axil_csr_rvalid), +// .s_axil_rready(axil_csr_rready), +// .ptp_ts_96(ptp_ts_96), +// .ptp_ts_step(ptp_ts_step) +// ); + +assign user_led[0] = pps_led_reg; +assign user_led[1] = 1'b0; +assign user_led[2] = 1'b0; +assign user_led[3] = 1'b0; + +wire [PORT_COUNT-1:0] eth_tx_clk; +wire [PORT_COUNT-1:0] eth_tx_rst; + +wire [PORT_COUNT*PTP_TS_WIDTH-1:0] eth_tx_ptp_ts_96; +wire [PORT_COUNT-1:0] eth_tx_ptp_ts_step; + +wire [PORT_COUNT*AXIS_ETH_DATA_WIDTH-1:0] axis_eth_tx_tdata; +wire [PORT_COUNT*AXIS_ETH_KEEP_WIDTH-1:0] axis_eth_tx_tkeep; +wire [PORT_COUNT-1:0] axis_eth_tx_tvalid; +wire [PORT_COUNT-1:0] axis_eth_tx_tready; +wire [PORT_COUNT-1:0] axis_eth_tx_tlast; +wire [PORT_COUNT*AXIS_ETH_TX_USER_WIDTH-1:0] axis_eth_tx_tuser; + +wire [PORT_COUNT*PTP_TS_WIDTH-1:0] axis_eth_tx_ptp_ts; +wire [PORT_COUNT*PTP_TAG_WIDTH-1:0] axis_eth_tx_ptp_ts_tag; +wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_valid; +wire [PORT_COUNT-1:0] axis_eth_tx_ptp_ts_ready; + +wire [PORT_COUNT-1:0] eth_rx_clk; +wire [PORT_COUNT-1:0] eth_rx_rst; + +wire [PORT_COUNT*PTP_TS_WIDTH-1:0] eth_rx_ptp_ts_96; +wire [PORT_COUNT-1:0] eth_rx_ptp_ts_step; + +wire [PORT_COUNT*AXIS_ETH_DATA_WIDTH-1:0] axis_eth_rx_tdata; +wire [PORT_COUNT*AXIS_ETH_KEEP_WIDTH-1:0] axis_eth_rx_tkeep; +wire [PORT_COUNT-1:0] axis_eth_rx_tvalid; +wire [PORT_COUNT-1:0] axis_eth_rx_tready; +wire [PORT_COUNT-1:0] axis_eth_rx_tlast; +wire [PORT_COUNT*AXIS_ETH_RX_USER_WIDTH-1:0] axis_eth_rx_tuser; + +wire [PORT_COUNT-1:0] port_xgmii_tx_clk; +wire [PORT_COUNT-1:0] port_xgmii_tx_rst; +wire [PORT_COUNT*XGMII_DATA_WIDTH-1:0] port_xgmii_txd; +wire [PORT_COUNT*XGMII_CTRL_WIDTH-1:0] port_xgmii_txc; + +wire [PORT_COUNT-1:0] port_xgmii_rx_clk; +wire [PORT_COUNT-1:0] port_xgmii_rx_rst; +wire [PORT_COUNT*XGMII_DATA_WIDTH-1:0] port_xgmii_rxd; +wire [PORT_COUNT*XGMII_CTRL_WIDTH-1:0] port_xgmii_rxc; + +// counts QSFP 0 QSFP 1 +// IF PORT 0_1 0_2 0_3 0_4 1_1 1_2 1_3 1_4 +// 1 1 0 (0.0) +// 1 2 0 (0.0) 1 (0.1) +// 1 3 0 (0.0) 1 (0.1) 2 (0.2) +// 1 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) +// 1 5 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) +// 1 6 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) +// 1 7 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) +// 1 8 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (0.4) 5 (0.5) 6 (0.6) 7 (0.7) +// 2 1 0 (0.0) 1 (1.0) +// 2 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) +// 2 3 0 (0.0) 1 (0.1) 2 (0.2) 3 (1.0) 4 (1.1) 5 (1.2) +// 2 4 0 (0.0) 1 (0.1) 2 (0.2) 3 (0.3) 4 (1.0) 5 (1.1) 6 (1.2) 7 (1.3) +// 3 1 0 (0.0) 1 (1.0) 2 (2.0) +// 3 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) +// 4 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) +// 4 2 0 (0.0) 1 (0.1) 2 (1.0) 3 (1.1) 4 (2.0) 5 (2.1) 6 (3.0) 7 (3.1) +// 5 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) +// 6 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) +// 7 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) +// 8 1 0 (0.0) 1 (1.0) 2 (2.0) 3 (3.0) 4 (4.0) 5 (5.0) 6 (6.0) 7 (7.0) + +localparam QSFP0_1_IND = 0; +localparam QSFP0_2_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 1 ? 1 : -1) : 1; +localparam QSFP0_3_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 2 ? 2 : -1) : 2; +localparam QSFP0_4_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 3 ? 3 : -1) : 3; +localparam QSFP1_1_IND = IF_COUNT == 2 ? PORTS_PER_IF : 4; +localparam QSFP1_2_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 1 ? PORTS_PER_IF+1 : -1) : 5; +localparam QSFP1_3_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 2 ? PORTS_PER_IF+2 : -1) : 6; +localparam QSFP1_4_IND = IF_COUNT == 2 ? (PORTS_PER_IF > 3 ? PORTS_PER_IF+3 : -1) : 7; + +generate + genvar m, n; + + if (QSFP0_1_IND >= 0 && QSFP0_1_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP0_1_IND] = qsfp0_tx_clk_1; + assign port_xgmii_tx_rst[QSFP0_1_IND] = qsfp0_tx_rst_1; + assign port_xgmii_rx_clk[QSFP0_1_IND] = qsfp0_rx_clk_1; + assign port_xgmii_rx_rst[QSFP0_1_IND] = qsfp0_rx_rst_1; + assign port_xgmii_rxd[QSFP0_1_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp0_rxd_1; + assign port_xgmii_rxc[QSFP0_1_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp0_rxc_1; + + assign qsfp0_txd_1 = port_xgmii_txd[QSFP0_1_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp0_txc_1 = port_xgmii_txc[QSFP0_1_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp0_txd_1 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp0_txc_1 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP0_2_IND >= 0 && QSFP0_2_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP0_2_IND] = qsfp0_tx_clk_2; + assign port_xgmii_tx_rst[QSFP0_2_IND] = qsfp0_tx_rst_2; + assign port_xgmii_rx_clk[QSFP0_2_IND] = qsfp0_rx_clk_2; + assign port_xgmii_rx_rst[QSFP0_2_IND] = qsfp0_rx_rst_2; + assign port_xgmii_rxd[QSFP0_2_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp0_rxd_2; + assign port_xgmii_rxc[QSFP0_2_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp0_rxc_2; + + assign qsfp0_txd_2 = port_xgmii_txd[QSFP0_2_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp0_txc_2 = port_xgmii_txc[QSFP0_2_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp0_txd_2 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp0_txc_2 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP0_3_IND >= 0 && QSFP0_3_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP0_3_IND] = qsfp0_tx_clk_3; + assign port_xgmii_tx_rst[QSFP0_3_IND] = qsfp0_tx_rst_3; + assign port_xgmii_rx_clk[QSFP0_3_IND] = qsfp0_rx_clk_3; + assign port_xgmii_rx_rst[QSFP0_3_IND] = qsfp0_rx_rst_3; + assign port_xgmii_rxd[QSFP0_3_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp0_rxd_3; + assign port_xgmii_rxc[QSFP0_3_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp0_rxc_3; + + assign qsfp0_txd_3 = port_xgmii_txd[QSFP0_3_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp0_txc_3 = port_xgmii_txc[QSFP0_3_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp0_txd_3 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp0_txc_3 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP0_4_IND >= 0 && QSFP0_4_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP0_4_IND] = qsfp0_tx_clk_4; + assign port_xgmii_tx_rst[QSFP0_4_IND] = qsfp0_tx_rst_4; + assign port_xgmii_rx_clk[QSFP0_4_IND] = qsfp0_rx_clk_4; + assign port_xgmii_rx_rst[QSFP0_4_IND] = qsfp0_rx_rst_4; + assign port_xgmii_rxd[QSFP0_4_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp0_rxd_4; + assign port_xgmii_rxc[QSFP0_4_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp0_rxc_4; + + assign qsfp0_txd_4 = port_xgmii_txd[QSFP0_4_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp0_txc_4 = port_xgmii_txc[QSFP0_4_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp0_txd_4 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp0_txc_4 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP1_1_IND >= 0 && QSFP1_1_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP1_1_IND] = qsfp1_tx_clk_1; + assign port_xgmii_tx_rst[QSFP1_1_IND] = qsfp1_tx_rst_1; + assign port_xgmii_rx_clk[QSFP1_1_IND] = qsfp1_rx_clk_1; + assign port_xgmii_rx_rst[QSFP1_1_IND] = qsfp1_rx_rst_1; + assign port_xgmii_rxd[QSFP1_1_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp1_rxd_1; + assign port_xgmii_rxc[QSFP1_1_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp1_rxc_1; + + assign qsfp1_txd_1 = port_xgmii_txd[QSFP1_1_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp1_txc_1 = port_xgmii_txc[QSFP1_1_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp1_txd_1 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp1_txc_1 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP1_2_IND >= 0 && QSFP1_2_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP1_2_IND] = qsfp1_tx_clk_2; + assign port_xgmii_tx_rst[QSFP1_2_IND] = qsfp1_tx_rst_2; + assign port_xgmii_rx_clk[QSFP1_2_IND] = qsfp1_rx_clk_2; + assign port_xgmii_rx_rst[QSFP1_2_IND] = qsfp1_rx_rst_2; + assign port_xgmii_rxd[QSFP1_2_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp1_rxd_2; + assign port_xgmii_rxc[QSFP1_2_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp1_rxc_2; + + assign qsfp1_txd_2 = port_xgmii_txd[QSFP1_2_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp1_txc_2 = port_xgmii_txc[QSFP1_2_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp1_txd_2 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp1_txc_2 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP1_3_IND >= 0 && QSFP1_3_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP1_3_IND] = qsfp1_tx_clk_3; + assign port_xgmii_tx_rst[QSFP1_3_IND] = qsfp1_tx_rst_3; + assign port_xgmii_rx_clk[QSFP1_3_IND] = qsfp1_rx_clk_3; + assign port_xgmii_rx_rst[QSFP1_3_IND] = qsfp1_rx_rst_3; + assign port_xgmii_rxd[QSFP1_3_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp1_rxd_3; + assign port_xgmii_rxc[QSFP1_3_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp1_rxc_3; + + assign qsfp1_txd_3 = port_xgmii_txd[QSFP1_3_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp1_txc_3 = port_xgmii_txc[QSFP1_3_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp1_txd_3 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp1_txc_3 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + if (QSFP1_4_IND >= 0 && QSFP1_4_IND < PORT_COUNT) begin + assign port_xgmii_tx_clk[QSFP1_4_IND] = qsfp1_tx_clk_4; + assign port_xgmii_tx_rst[QSFP1_4_IND] = qsfp1_tx_rst_4; + assign port_xgmii_rx_clk[QSFP1_4_IND] = qsfp1_rx_clk_4; + assign port_xgmii_rx_rst[QSFP1_4_IND] = qsfp1_rx_rst_4; + assign port_xgmii_rxd[QSFP1_4_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH] = qsfp1_rxd_4; + assign port_xgmii_rxc[QSFP1_4_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH] = qsfp1_rxc_4; + + assign qsfp1_txd_4 = port_xgmii_txd[QSFP1_4_IND*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]; + assign qsfp1_txc_4 = port_xgmii_txc[QSFP1_4_IND*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]; + end else begin + assign qsfp1_txd_4 = {XGMII_CTRL_WIDTH{8'h07}}; + assign qsfp1_txc_4 = {XGMII_CTRL_WIDTH{1'b1}}; + end + + for (n = 0; n < PORT_COUNT; n = n + 1) begin : mac + + assign eth_tx_clk[n] = port_xgmii_tx_clk[n]; + assign eth_tx_rst[n] = port_xgmii_tx_rst[n]; + assign eth_rx_clk[n] = port_xgmii_rx_clk[n]; + assign eth_rx_rst[n] = port_xgmii_rx_rst[n]; + + eth_mac_10g #( + .DATA_WIDTH(AXIS_ETH_DATA_WIDTH), + .KEEP_WIDTH(AXIS_ETH_KEEP_WIDTH), + .ENABLE_PADDING(ENABLE_PADDING), + .ENABLE_DIC(ENABLE_DIC), + .MIN_FRAME_LENGTH(MIN_FRAME_LENGTH), + .PTP_PERIOD_NS(IF_PTP_PERIOD_NS), + .PTP_PERIOD_FNS(IF_PTP_PERIOD_FNS), + .TX_PTP_TS_ENABLE(PTP_TS_ENABLE), + .TX_PTP_TS_WIDTH(PTP_TS_WIDTH), + .TX_PTP_TAG_ENABLE(PTP_TS_ENABLE), + .TX_PTP_TAG_WIDTH(PTP_TAG_WIDTH), + .RX_PTP_TS_ENABLE(PTP_TS_ENABLE), + .RX_PTP_TS_WIDTH(PTP_TS_WIDTH), + .TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH), + .RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH) + ) + eth_mac_inst ( + .tx_clk(port_xgmii_tx_clk[n]), + .tx_rst(port_xgmii_tx_rst[n]), + .rx_clk(port_xgmii_rx_clk[n]), + .rx_rst(port_xgmii_rx_rst[n]), + + .tx_axis_tdata(axis_eth_tx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]), + .tx_axis_tkeep(axis_eth_tx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]), + .tx_axis_tvalid(axis_eth_tx_tvalid[n +: 1]), + .tx_axis_tready(axis_eth_tx_tready[n +: 1]), + .tx_axis_tlast(axis_eth_tx_tlast[n +: 1]), + .tx_axis_tuser(axis_eth_tx_tuser[n*AXIS_ETH_TX_USER_WIDTH +: AXIS_ETH_TX_USER_WIDTH]), + + .rx_axis_tdata(axis_eth_rx_tdata[n*AXIS_ETH_DATA_WIDTH +: AXIS_ETH_DATA_WIDTH]), + .rx_axis_tkeep(axis_eth_rx_tkeep[n*AXIS_ETH_KEEP_WIDTH +: AXIS_ETH_KEEP_WIDTH]), + .rx_axis_tvalid(axis_eth_rx_tvalid[n +: 1]), + .rx_axis_tlast(axis_eth_rx_tlast[n +: 1]), + .rx_axis_tuser(axis_eth_rx_tuser[n*AXIS_ETH_RX_USER_WIDTH +: AXIS_ETH_RX_USER_WIDTH]), + + .xgmii_rxd(port_xgmii_rxd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]), + .xgmii_rxc(port_xgmii_rxc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]), + .xgmii_txd(port_xgmii_txd[n*XGMII_DATA_WIDTH +: XGMII_DATA_WIDTH]), + .xgmii_txc(port_xgmii_txc[n*XGMII_CTRL_WIDTH +: XGMII_CTRL_WIDTH]), + + .tx_ptp_ts(eth_tx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]), + .rx_ptp_ts(eth_rx_ptp_ts_96[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]), + .tx_axis_ptp_ts(axis_eth_tx_ptp_ts[n*PTP_TS_WIDTH +: PTP_TS_WIDTH]), + .tx_axis_ptp_ts_tag(axis_eth_tx_ptp_ts_tag[n*PTP_TAG_WIDTH +: PTP_TAG_WIDTH]), + .tx_axis_ptp_ts_valid(axis_eth_tx_ptp_ts_valid[n +: 1]), + + .tx_error_underflow(), + .rx_error_bad_frame(), + .rx_error_bad_fcs(), + + .ifg_delay(8'd12) + ); + + end + +endgenerate + +mqnic_core_pcie_s10 #( + // FW and board IDs + .FW_ID(FW_ID), + .FW_VER(FW_VER), + .BOARD_ID(BOARD_ID), + .BOARD_VER(BOARD_VER), + + // Structural configuration + .IF_COUNT(IF_COUNT), + .PORTS_PER_IF(PORTS_PER_IF), + + .PORT_COUNT(PORT_COUNT), + + // PTP configuration + .PTP_TS_WIDTH(PTP_TS_WIDTH), + .PTP_TAG_WIDTH(PTP_TAG_WIDTH), + .PTP_PERIOD_NS_WIDTH(PTP_PERIOD_NS_WIDTH), + .PTP_OFFSET_NS_WIDTH(PTP_OFFSET_NS_WIDTH), + .PTP_FNS_WIDTH(PTP_FNS_WIDTH), + .PTP_PERIOD_NS(PTP_PERIOD_NS), + .PTP_PERIOD_FNS(PTP_PERIOD_FNS), + .PTP_USE_SAMPLE_CLOCK(PTP_USE_SAMPLE_CLOCK), + .PTP_PEROUT_ENABLE(PTP_PEROUT_ENABLE), + .PTP_PEROUT_COUNT(PTP_PEROUT_COUNT), + + // Queue manager configuration (interface) + .EVENT_QUEUE_OP_TABLE_SIZE(EVENT_QUEUE_OP_TABLE_SIZE), + .TX_QUEUE_OP_TABLE_SIZE(TX_QUEUE_OP_TABLE_SIZE), + .RX_QUEUE_OP_TABLE_SIZE(RX_QUEUE_OP_TABLE_SIZE), + .TX_CPL_QUEUE_OP_TABLE_SIZE(TX_CPL_QUEUE_OP_TABLE_SIZE), + .RX_CPL_QUEUE_OP_TABLE_SIZE(RX_CPL_QUEUE_OP_TABLE_SIZE), + .TX_QUEUE_INDEX_WIDTH(TX_QUEUE_INDEX_WIDTH), + .RX_QUEUE_INDEX_WIDTH(RX_QUEUE_INDEX_WIDTH), + .TX_CPL_QUEUE_INDEX_WIDTH(TX_CPL_QUEUE_INDEX_WIDTH), + .RX_CPL_QUEUE_INDEX_WIDTH(RX_CPL_QUEUE_INDEX_WIDTH), + .EVENT_QUEUE_PIPELINE(EVENT_QUEUE_PIPELINE), + .TX_QUEUE_PIPELINE(TX_QUEUE_PIPELINE), + .RX_QUEUE_PIPELINE(RX_QUEUE_PIPELINE), + .TX_CPL_QUEUE_PIPELINE(TX_CPL_QUEUE_PIPELINE), + .RX_CPL_QUEUE_PIPELINE(RX_CPL_QUEUE_PIPELINE), + + // TX and RX engine configuration (port) + .TX_DESC_TABLE_SIZE(TX_DESC_TABLE_SIZE), + .RX_DESC_TABLE_SIZE(RX_DESC_TABLE_SIZE), + + // Scheduler configuration (port) + .TX_SCHEDULER_OP_TABLE_SIZE(TX_SCHEDULER_OP_TABLE_SIZE), + .TX_SCHEDULER_PIPELINE(TX_SCHEDULER_PIPELINE), + .TDMA_INDEX_WIDTH(TDMA_INDEX_WIDTH), + + // Timestamping configuration (port) + .PTP_TS_ENABLE(PTP_TS_ENABLE), + .TX_PTP_TS_FIFO_DEPTH(TX_PTP_TS_FIFO_DEPTH), + .RX_PTP_TS_FIFO_DEPTH(RX_PTP_TS_FIFO_DEPTH), + + // Interface configuration (port) + .TX_CHECKSUM_ENABLE(TX_CHECKSUM_ENABLE), + .RX_RSS_ENABLE(RX_RSS_ENABLE), + .RX_HASH_ENABLE(RX_HASH_ENABLE), + .RX_CHECKSUM_ENABLE(RX_CHECKSUM_ENABLE), + .TX_FIFO_DEPTH(TX_FIFO_DEPTH), + .RX_FIFO_DEPTH(RX_FIFO_DEPTH), + .MAX_TX_SIZE(MAX_TX_SIZE), + .MAX_RX_SIZE(MAX_RX_SIZE), + .TX_RAM_SIZE(TX_RAM_SIZE), + .RX_RAM_SIZE(RX_RAM_SIZE), + + // Application block configuration + .APP_ENABLE(APP_ENABLE), + .APP_CTRL_ENABLE(APP_CTRL_ENABLE), + .APP_DMA_ENABLE(APP_DMA_ENABLE), + .APP_AXIS_DIRECT_ENABLE(APP_AXIS_DIRECT_ENABLE), + .APP_AXIS_SYNC_ENABLE(APP_AXIS_SYNC_ENABLE), + .APP_AXIS_IF_ENABLE(APP_AXIS_IF_ENABLE), + .APP_STAT_ENABLE(APP_STAT_ENABLE), + + // DMA interface configuration + .DMA_LEN_WIDTH(DMA_LEN_WIDTH), + .DMA_TAG_WIDTH(DMA_TAG_WIDTH), + .RAM_PIPELINE(RAM_PIPELINE), + + // PCIe interface configuration + .SEG_COUNT(SEG_COUNT), + .SEG_DATA_WIDTH(SEG_DATA_WIDTH), + .SEG_EMPTY_WIDTH(SEG_EMPTY_WIDTH), + .TX_SEQ_NUM_WIDTH(TX_SEQ_NUM_WIDTH), + .PF_COUNT(PF_COUNT), + .VF_COUNT(VF_COUNT), + .F_COUNT(F_COUNT), + .PCIE_TAG_COUNT(PCIE_TAG_COUNT), + .PCIE_DMA_READ_OP_TABLE_SIZE(PCIE_DMA_READ_OP_TABLE_SIZE), + .PCIE_DMA_READ_TX_LIMIT(PCIE_DMA_READ_TX_LIMIT), + .PCIE_DMA_READ_TX_FC_ENABLE(PCIE_DMA_READ_TX_FC_ENABLE), + .PCIE_DMA_WRITE_OP_TABLE_SIZE(PCIE_DMA_WRITE_OP_TABLE_SIZE), + .PCIE_DMA_WRITE_TX_LIMIT(PCIE_DMA_WRITE_TX_LIMIT), + .PCIE_DMA_WRITE_TX_FC_ENABLE(PCIE_DMA_WRITE_TX_FC_ENABLE), + .MSI_COUNT(MSI_COUNT), + + // AXI lite interface configuration (control) + .AXIL_CTRL_DATA_WIDTH(AXIL_CTRL_DATA_WIDTH), + .AXIL_CTRL_ADDR_WIDTH(AXIL_CTRL_ADDR_WIDTH), + .AXIL_CTRL_STRB_WIDTH(AXIL_CTRL_STRB_WIDTH), + .AXIL_IF_CTRL_ADDR_WIDTH(AXIL_IF_CTRL_ADDR_WIDTH), + .AXIL_CSR_ADDR_WIDTH(AXIL_CSR_ADDR_WIDTH), + .AXIL_CSR_PASSTHROUGH_ENABLE(0), + + // AXI lite interface configuration (application control) + .AXIL_APP_CTRL_DATA_WIDTH(AXIL_APP_CTRL_DATA_WIDTH), + .AXIL_APP_CTRL_ADDR_WIDTH(AXIL_APP_CTRL_ADDR_WIDTH), + + // Ethernet interface configuration + .AXIS_ETH_DATA_WIDTH(AXIS_ETH_DATA_WIDTH), + .AXIS_ETH_KEEP_WIDTH(AXIS_ETH_KEEP_WIDTH), + .AXIS_ETH_SYNC_DATA_WIDTH(AXIS_ETH_SYNC_DATA_WIDTH), + .AXIS_ETH_TX_USER_WIDTH(AXIS_ETH_TX_USER_WIDTH), + .AXIS_ETH_RX_USER_WIDTH(AXIS_ETH_RX_USER_WIDTH), + .AXIS_ETH_RX_USE_READY(0), + .AXIS_ETH_TX_PIPELINE(AXIS_ETH_TX_PIPELINE), + .AXIS_ETH_TX_FIFO_PIPELINE(AXIS_ETH_TX_FIFO_PIPELINE), + .AXIS_ETH_TX_TS_PIPELINE(AXIS_ETH_TX_TS_PIPELINE), + .AXIS_ETH_RX_PIPELINE(AXIS_ETH_RX_PIPELINE), + .AXIS_ETH_RX_FIFO_PIPELINE(AXIS_ETH_RX_FIFO_PIPELINE), + + // Statistics counter subsystem + .STAT_ENABLE(STAT_ENABLE), + .STAT_DMA_ENABLE(STAT_DMA_ENABLE), + .STAT_PCIE_ENABLE(STAT_PCIE_ENABLE), + .STAT_INC_WIDTH(STAT_INC_WIDTH), + .STAT_ID_WIDTH(STAT_ID_WIDTH) +) +core_inst ( + .clk(clk_250mhz), + .rst(rst_250mhz), + + /* + * H-tile RX AVST interface + */ + .rx_st_data(rx_st_data), + .rx_st_empty(rx_st_empty), + .rx_st_sop(rx_st_sop), + .rx_st_eop(rx_st_eop), + .rx_st_valid(rx_st_valid), + .rx_st_ready(rx_st_ready), + .rx_st_vf_active(rx_st_vf_active), + .rx_st_func_num(rx_st_func_num), + .rx_st_vf_num(rx_st_vf_num), + .rx_st_bar_range(rx_st_bar_range), + + .tx_st_data(tx_st_data), + .tx_st_sop(tx_st_sop), + .tx_st_eop(tx_st_eop), + .tx_st_valid(tx_st_valid), + .tx_st_ready(tx_st_ready), + .tx_st_err(tx_st_err), + + .tx_ph_cdts(tx_ph_cdts), + .tx_pd_cdts(tx_pd_cdts), + .tx_nph_cdts(tx_nph_cdts), + .tx_npd_cdts(tx_npd_cdts), + .tx_cplh_cdts(tx_cplh_cdts), + .tx_cpld_cdts(tx_cpld_cdts), + .tx_hdr_cdts_consumed(tx_hdr_cdts_consumed), + .tx_data_cdts_consumed(tx_data_cdts_consumed), + .tx_cdts_type(tx_cdts_type), + .tx_cdts_data_value(tx_cdts_data_value), + + .app_msi_req(app_msi_req), + .app_msi_ack(app_msi_ack), + .app_msi_tc(app_msi_tc), + .app_msi_num(app_msi_num), + .app_msi_func_num(app_msi_func_num), + + .tl_cfg_ctl(tl_cfg_ctl), + .tl_cfg_add(tl_cfg_add), + .tl_cfg_func(tl_cfg_func), + + /* + * AXI-Lite master interface (passthrough for NIC control and status) + */ + .m_axil_csr_awaddr(axil_csr_awaddr), + .m_axil_csr_awprot(axil_csr_awprot), + .m_axil_csr_awvalid(axil_csr_awvalid), + .m_axil_csr_awready(axil_csr_awready), + .m_axil_csr_wdata(axil_csr_wdata), + .m_axil_csr_wstrb(axil_csr_wstrb), + .m_axil_csr_wvalid(axil_csr_wvalid), + .m_axil_csr_wready(axil_csr_wready), + .m_axil_csr_bresp(axil_csr_bresp), + .m_axil_csr_bvalid(axil_csr_bvalid), + .m_axil_csr_bready(axil_csr_bready), + .m_axil_csr_araddr(axil_csr_araddr), + .m_axil_csr_arprot(axil_csr_arprot), + .m_axil_csr_arvalid(axil_csr_arvalid), + .m_axil_csr_arready(axil_csr_arready), + .m_axil_csr_rdata(axil_csr_rdata), + .m_axil_csr_rresp(axil_csr_rresp), + .m_axil_csr_rvalid(axil_csr_rvalid), + .m_axil_csr_rready(axil_csr_rready), + + /* + * Control register interface + */ + .ctrl_reg_wr_addr(ctrl_reg_wr_addr), + .ctrl_reg_wr_data(ctrl_reg_wr_data), + .ctrl_reg_wr_strb(ctrl_reg_wr_strb), + .ctrl_reg_wr_en(ctrl_reg_wr_en), + .ctrl_reg_wr_wait(ctrl_reg_wr_wait), + .ctrl_reg_wr_ack(ctrl_reg_wr_ack), + .ctrl_reg_rd_addr(ctrl_reg_rd_addr), + .ctrl_reg_rd_en(ctrl_reg_rd_en), + .ctrl_reg_rd_data(ctrl_reg_rd_data), + .ctrl_reg_rd_wait(ctrl_reg_rd_wait), + .ctrl_reg_rd_ack(ctrl_reg_rd_ack), + + /* + * PTP clock + */ + .ptp_sample_clk(clk_250mhz), + .ptp_pps(ptp_pps), + .ptp_ts_96(ptp_ts_96), + .ptp_ts_step(ptp_ts_step), + .ptp_perout_locked(ptp_perout_locked), + .ptp_perout_error(ptp_perout_error), + .ptp_perout_pulse(ptp_perout_pulse), + + /* + * Ethernet + */ + .eth_tx_clk(eth_tx_clk), + .eth_tx_rst(eth_tx_rst), + + .eth_tx_ptp_ts_96(eth_tx_ptp_ts_96), + .eth_tx_ptp_ts_step(eth_tx_ptp_ts_step), + + .m_axis_eth_tx_tdata(axis_eth_tx_tdata), + .m_axis_eth_tx_tkeep(axis_eth_tx_tkeep), + .m_axis_eth_tx_tvalid(axis_eth_tx_tvalid), + .m_axis_eth_tx_tready(axis_eth_tx_tready), + .m_axis_eth_tx_tlast(axis_eth_tx_tlast), + .m_axis_eth_tx_tuser(axis_eth_tx_tuser), + + .s_axis_eth_tx_ptp_ts(axis_eth_tx_ptp_ts), + .s_axis_eth_tx_ptp_ts_tag(axis_eth_tx_ptp_ts_tag), + .s_axis_eth_tx_ptp_ts_valid(axis_eth_tx_ptp_ts_valid), + .s_axis_eth_tx_ptp_ts_ready(axis_eth_tx_ptp_ts_ready), + + .eth_rx_clk(eth_rx_clk), + .eth_rx_rst(eth_rx_rst), + + .eth_rx_ptp_ts_96(eth_rx_ptp_ts_96), + .eth_rx_ptp_ts_step(eth_rx_ptp_ts_step), + + .s_axis_eth_rx_tdata(axis_eth_rx_tdata), + .s_axis_eth_rx_tkeep(axis_eth_rx_tkeep), + .s_axis_eth_rx_tvalid(axis_eth_rx_tvalid), + .s_axis_eth_rx_tready(axis_eth_rx_tready), + .s_axis_eth_rx_tlast(axis_eth_rx_tlast), + .s_axis_eth_rx_tuser(axis_eth_rx_tuser), + + /* + * Statistics input + */ + .s_axis_stat_tdata(0), + .s_axis_stat_tid(0), + .s_axis_stat_tvalid(1'b0), + .s_axis_stat_tready() +); + +endmodule + +`resetall diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/rtl/sync_signal.v b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/sync_signal.v new file mode 100644 index 000000000..74b855fa1 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/rtl/sync_signal.v @@ -0,0 +1,62 @@ +/* + +Copyright (c) 2014-2018 Alex Forencich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/ + +// Language: Verilog-2001 + +`resetall +`timescale 1 ns / 1 ps +`default_nettype none + +/* + * Synchronizes an asyncronous signal to a given clock by using a pipeline of + * two registers. + */ +module sync_signal #( + parameter WIDTH=1, // width of the input and output signals + parameter N=2 // depth of synchronizer +)( + input wire clk, + input wire [WIDTH-1:0] in, + output wire [WIDTH-1:0] out +); + +reg [WIDTH-1:0] sync_reg[N-1:0]; + +/* + * The synchronized output is the last register in the pipeline. + */ +assign out = sync_reg[N-1]; + +integer k; + +always @(posedge clk) begin + sync_reg[0] <= in; + for (k = 1; k < N; k = k + 1) begin + sync_reg[k] <= sync_reg[k-1]; + end +end + +endmodule + +`resetall diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/Makefile b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/Makefile new file mode 100644 index 000000000..e0d339bcb --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/Makefile @@ -0,0 +1,401 @@ +# Copyright 2020-2021, The Regents of the University of California. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +# OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of The Regents of the University of California. + +TOPLEVEL_LANG = verilog + +SIM ?= icarus +WAVES ?= 0 + +COCOTB_HDL_TIMEUNIT = 1ns +COCOTB_HDL_TIMEPRECISION = 1ps + +DUT = fpga_core +TOPLEVEL = $(DUT) +MODULE = test_$(DUT) +VERILOG_SOURCES += ../../rtl/$(DUT).v +VERILOG_SOURCES += ../../rtl/common/mqnic_core_pcie_s10.v +VERILOG_SOURCES += ../../rtl/common/mqnic_core_pcie.v +VERILOG_SOURCES += ../../rtl/common/mqnic_core.v +VERILOG_SOURCES += ../../rtl/common/mqnic_interface.v +VERILOG_SOURCES += ../../rtl/common/mqnic_port.v +VERILOG_SOURCES += ../../rtl/common/mqnic_ptp.v +VERILOG_SOURCES += ../../rtl/common/mqnic_ptp_clock.v +VERILOG_SOURCES += ../../rtl/common/mqnic_ptp_perout.v +VERILOG_SOURCES += ../../rtl/common/cpl_write.v +VERILOG_SOURCES += ../../rtl/common/cpl_op_mux.v +VERILOG_SOURCES += ../../rtl/common/desc_fetch.v +VERILOG_SOURCES += ../../rtl/common/desc_op_mux.v +VERILOG_SOURCES += ../../rtl/common/event_mux.v +VERILOG_SOURCES += ../../rtl/common/queue_manager.v +VERILOG_SOURCES += ../../rtl/common/cpl_queue_manager.v +VERILOG_SOURCES += ../../rtl/common/tx_engine.v +VERILOG_SOURCES += ../../rtl/common/rx_engine.v +VERILOG_SOURCES += ../../rtl/common/tx_checksum.v +VERILOG_SOURCES += ../../rtl/common/rx_hash.v +VERILOG_SOURCES += ../../rtl/common/rx_checksum.v +VERILOG_SOURCES += ../../rtl/common/stats_counter.v +VERILOG_SOURCES += ../../rtl/common/stats_collect.v +VERILOG_SOURCES += ../../rtl/common/stats_pcie_if.v +VERILOG_SOURCES += ../../rtl/common/stats_pcie_tlp.v +VERILOG_SOURCES += ../../rtl/common/stats_dma_if_pcie.v +VERILOG_SOURCES += ../../rtl/common/stats_dma_latency.v +VERILOG_SOURCES += ../../rtl/common/mqnic_tx_scheduler_block_rr.v +VERILOG_SOURCES += ../../rtl/common/tx_scheduler_rr.v +VERILOG_SOURCES += ../../rtl/common/tdma_scheduler.v +VERILOG_SOURCES += ../../rtl/common/tdma_ber.v +VERILOG_SOURCES += ../../rtl/common/tdma_ber_ch.v +VERILOG_SOURCES += ../../lib/eth/rtl/eth_mac_10g.v +VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_rx_64.v +VERILOG_SOURCES += ../../lib/eth/rtl/axis_xgmii_tx_64.v +VERILOG_SOURCES += ../../lib/eth/rtl/lfsr.v +VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock.v +VERILOG_SOURCES += ../../lib/eth/rtl/ptp_clock_cdc.v +VERILOG_SOURCES += ../../lib/eth/rtl/ptp_perout.v +VERILOG_SOURCES += ../../lib/eth/rtl/ptp_ts_extract.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_interconnect.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_crossbar.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_crossbar_addr.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_crossbar_rd.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_crossbar_wr.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_reg_if.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_reg_if_rd.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_reg_if_wr.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_register_rd.v +VERILOG_SOURCES += ../../lib/axi/rtl/axil_register_wr.v +VERILOG_SOURCES += ../../lib/axi/rtl/arbiter.v +VERILOG_SOURCES += ../../lib/axi/rtl/priority_encoder.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_adapter.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_arb_mux.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_async_fifo.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_async_fifo_adapter.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_fifo.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_pipeline_fifo.v +VERILOG_SOURCES += ../../lib/axis/rtl/axis_register.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_axil_master.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_tlp_demux.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_tlp_demux_bar.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_tlp_mux.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_pcie.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_pcie_rd.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_pcie_wr.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_mux.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_mux_rd.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_mux_wr.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_if_desc_mux.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_ram_demux_rd.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_ram_demux_wr.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_psdpram.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_client_axis_sink.v +VERILOG_SOURCES += ../../lib/pcie/rtl/dma_client_axis_source.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_s10_if.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_s10_if_rx.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_s10_if_tx.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_s10_cfg.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pcie_s10_msi.v +VERILOG_SOURCES += ../../lib/pcie/rtl/pulse_merge.v + +# module parameters + +# Structural configuration +export PARAM_IF_COUNT ?= 2 +export PARAM_PORTS_PER_IF ?= 1 + +# PTP configuration +export PARAM_PTP_PEROUT_ENABLE ?= 1 +export PARAM_PTP_PEROUT_COUNT ?= 1 + +# Queue manager configuration (interface) +export PARAM_EVENT_QUEUE_OP_TABLE_SIZE ?= 32 +export PARAM_TX_QUEUE_OP_TABLE_SIZE ?= 32 +export PARAM_RX_QUEUE_OP_TABLE_SIZE ?= 32 +export PARAM_TX_CPL_QUEUE_OP_TABLE_SIZE ?= $(PARAM_TX_QUEUE_OP_TABLE_SIZE) +export PARAM_RX_CPL_QUEUE_OP_TABLE_SIZE ?= $(PARAM_RX_QUEUE_OP_TABLE_SIZE) +export PARAM_TX_QUEUE_INDEX_WIDTH ?= 13 +export PARAM_RX_QUEUE_INDEX_WIDTH ?= 8 +export PARAM_TX_CPL_QUEUE_INDEX_WIDTH ?= $(PARAM_TX_QUEUE_INDEX_WIDTH) +export PARAM_RX_CPL_QUEUE_INDEX_WIDTH ?= $(PARAM_RX_QUEUE_INDEX_WIDTH) +export PARAM_EVENT_QUEUE_PIPELINE ?= 3 +export PARAM_TX_QUEUE_PIPELINE ?= $(shell python -c "print(3 + max($(PARAM_TX_QUEUE_INDEX_WIDTH)-12, 0))") +export PARAM_RX_QUEUE_PIPELINE ?= $(shell python -c "print(3 + max($(PARAM_RX_QUEUE_INDEX_WIDTH)-12, 0))") +export PARAM_TX_CPL_QUEUE_PIPELINE ?= $(PARAM_TX_QUEUE_PIPELINE) +export PARAM_RX_CPL_QUEUE_PIPELINE ?= $(PARAM_RX_QUEUE_PIPELINE) + +# TX and RX engine configuration (port) +export PARAM_TX_DESC_TABLE_SIZE ?= 32 +export PARAM_RX_DESC_TABLE_SIZE ?= 32 + +# Scheduler configuration (port) +export PARAM_TX_SCHEDULER_OP_TABLE_SIZE ?= $(PARAM_TX_DESC_TABLE_SIZE) +export PARAM_TX_SCHEDULER_PIPELINE ?= $(PARAM_TX_QUEUE_PIPELINE) +export PARAM_TDMA_INDEX_WIDTH ?= 6 + +# Timestamping configuration (port) +export PARAM_PTP_TS_ENABLE ?= 1 +export PARAM_TX_PTP_TS_FIFO_DEPTH ?= 32 +export PARAM_RX_PTP_TS_FIFO_DEPTH ?= 32 + +# Interface configuration (port) +export PARAM_TX_CHECKSUM_ENABLE ?= 1 +export PARAM_RX_RSS_ENABLE ?= 1 +export PARAM_RX_HASH_ENABLE ?= 1 +export PARAM_RX_CHECKSUM_ENABLE ?= 1 +export PARAM_TX_FIFO_DEPTH ?= 32768 +export PARAM_RX_FIFO_DEPTH ?= 32768 +export PARAM_MAX_TX_SIZE ?= 9214 +export PARAM_MAX_RX_SIZE ?= 9214 +export PARAM_TX_RAM_SIZE ?= 32768 +export PARAM_RX_RAM_SIZE ?= 32768 + +# Application block configuration +export PARAM_APP_ENABLE ?= 0 +export PARAM_APP_CTRL_ENABLE ?= 1 +export PARAM_APP_DMA_ENABLE ?= 1 +export PARAM_APP_AXIS_DIRECT_ENABLE ?= 1 +export PARAM_APP_AXIS_SYNC_ENABLE ?= 1 +export PARAM_APP_AXIS_IF_ENABLE ?= 1 +export PARAM_APP_STAT_ENABLE ?= 1 + +# DMA interface configuration +export PARAM_DMA_LEN_WIDTH ?= 16 +export PARAM_DMA_TAG_WIDTH ?= 16 +export PARAM_RAM_PIPELINE ?= 2 + +# PCIe interface configuration +export PARAM_SEG_COUNT ?= 1 +export PARAM_SEG_DATA_WIDTH ?= 256 +export PARAM_SEG_EMPTY_WIDTH ?= $(shell python -c "print((($(PARAM_SEG_DATA_WIDTH)//32)-1).bit_length())" ) +export PARAM_TX_SEQ_NUM_WIDTH ?= 6 +export PARAM_PF_COUNT ?= 1 +export PARAM_VF_COUNT ?= 0 +export PARAM_PCIE_TAG_COUNT ?= 256 +export PARAM_PCIE_DMA_READ_OP_TABLE_SIZE ?= $(PARAM_PCIE_TAG_COUNT) +export PARAM_PCIE_DMA_READ_TX_LIMIT ?= 16 +export PARAM_PCIE_DMA_READ_TX_FC_ENABLE ?= 1 +export PARAM_PCIE_DMA_WRITE_OP_TABLE_SIZE ?= 16 +export PARAM_PCIE_DMA_WRITE_TX_LIMIT ?= 3 +export PARAM_PCIE_DMA_WRITE_TX_FC_ENABLE ?= 1 + +# AXI lite interface configuration (control) +export PARAM_AXIL_CTRL_DATA_WIDTH ?= 32 +export PARAM_AXIL_CTRL_ADDR_WIDTH ?= 24 + +# AXI lite interface configuration (application control) +export PARAM_AXIL_APP_CTRL_DATA_WIDTH ?= $(PARAM_AXIL_CTRL_DATA_WIDTH) +export PARAM_AXIL_APP_CTRL_ADDR_WIDTH ?= 24 + +# Ethernet interface configuration +export PARAM_AXIS_ETH_TX_PIPELINE ?= 0 +export PARAM_AXIS_ETH_TX_FIFO_PIPELINE ?= 2 +export PARAM_AXIS_ETH_TX_TS_PIPELINE ?= 0 +export PARAM_AXIS_ETH_RX_PIPELINE ?= 0 +export PARAM_AXIS_ETH_RX_FIFO_PIPELINE ?= 2 + +# Statistics counter subsystem +export PARAM_STAT_ENABLE ?= 1 +export PARAM_STAT_DMA_ENABLE ?= 1 +export PARAM_STAT_PCIE_ENABLE ?= 1 +export PARAM_STAT_INC_WIDTH ?= 24 +export PARAM_STAT_ID_WIDTH ?= 12 + +ifeq ($(SIM), icarus) + PLUSARGS += -fst + + COMPILE_ARGS += -P $(TOPLEVEL).IF_COUNT=$(PARAM_IF_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).PORTS_PER_IF=$(PARAM_PORTS_PER_IF) + COMPILE_ARGS += -P $(TOPLEVEL).PTP_PEROUT_ENABLE=$(PARAM_PTP_PEROUT_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).PTP_PEROUT_COUNT=$(PARAM_PTP_PEROUT_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).EVENT_QUEUE_OP_TABLE_SIZE=$(PARAM_EVENT_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_QUEUE_OP_TABLE_SIZE=$(PARAM_TX_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_QUEUE_OP_TABLE_SIZE=$(PARAM_RX_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_CPL_QUEUE_OP_TABLE_SIZE=$(PARAM_TX_CPL_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_CPL_QUEUE_OP_TABLE_SIZE=$(PARAM_RX_CPL_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_QUEUE_INDEX_WIDTH=$(PARAM_TX_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).RX_QUEUE_INDEX_WIDTH=$(PARAM_RX_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).TX_CPL_QUEUE_INDEX_WIDTH=$(PARAM_TX_CPL_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).RX_CPL_QUEUE_INDEX_WIDTH=$(PARAM_RX_CPL_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).EVENT_QUEUE_PIPELINE=$(PARAM_EVENT_QUEUE_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_QUEUE_PIPELINE=$(PARAM_TX_QUEUE_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_QUEUE_PIPELINE=$(PARAM_RX_QUEUE_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_CPL_QUEUE_PIPELINE=$(PARAM_TX_CPL_QUEUE_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_CPL_QUEUE_PIPELINE=$(PARAM_RX_CPL_QUEUE_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_DESC_TABLE_SIZE=$(PARAM_TX_DESC_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_DESC_TABLE_SIZE=$(PARAM_RX_DESC_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_SCHEDULER_OP_TABLE_SIZE=$(PARAM_TX_SCHEDULER_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_SCHEDULER_PIPELINE=$(PARAM_TX_SCHEDULER_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).TDMA_INDEX_WIDTH=$(PARAM_TDMA_INDEX_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).PTP_TS_ENABLE=$(PARAM_PTP_TS_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_PTP_TS_FIFO_DEPTH=$(PARAM_TX_PTP_TS_FIFO_DEPTH) + COMPILE_ARGS += -P $(TOPLEVEL).RX_PTP_TS_FIFO_DEPTH=$(PARAM_RX_PTP_TS_FIFO_DEPTH) + COMPILE_ARGS += -P $(TOPLEVEL).TX_CHECKSUM_ENABLE=$(PARAM_TX_CHECKSUM_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_RSS_ENABLE=$(PARAM_RX_RSS_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_HASH_ENABLE=$(PARAM_RX_HASH_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_CHECKSUM_ENABLE=$(PARAM_RX_CHECKSUM_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_FIFO_DEPTH=$(PARAM_TX_FIFO_DEPTH) + COMPILE_ARGS += -P $(TOPLEVEL).RX_FIFO_DEPTH=$(PARAM_RX_FIFO_DEPTH) + COMPILE_ARGS += -P $(TOPLEVEL).MAX_TX_SIZE=$(PARAM_MAX_TX_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).MAX_RX_SIZE=$(PARAM_MAX_RX_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).TX_RAM_SIZE=$(PARAM_TX_RAM_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).RX_RAM_SIZE=$(PARAM_RX_RAM_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_ENABLE=$(PARAM_APP_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_CTRL_ENABLE=$(PARAM_APP_CTRL_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_DMA_ENABLE=$(PARAM_APP_DMA_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_AXIS_DIRECT_ENABLE=$(PARAM_APP_AXIS_DIRECT_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_AXIS_SYNC_ENABLE=$(PARAM_APP_AXIS_SYNC_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_AXIS_IF_ENABLE=$(PARAM_APP_AXIS_IF_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).APP_STAT_ENABLE=$(PARAM_APP_STAT_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).DMA_LEN_WIDTH=$(PARAM_DMA_LEN_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).DMA_TAG_WIDTH=$(PARAM_DMA_TAG_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).RAM_PIPELINE=$(PARAM_RAM_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).SEG_COUNT=$(PARAM_SEG_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).SEG_DATA_WIDTH=$(PARAM_SEG_DATA_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).SEG_EMPTY_WIDTH=$(PARAM_SEG_EMPTY_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).TX_SEQ_NUM_WIDTH=$(PARAM_TX_SEQ_NUM_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).PF_COUNT=$(PARAM_PF_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).VF_COUNT=$(PARAM_VF_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_TAG_COUNT=$(PARAM_PCIE_TAG_COUNT) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_READ_OP_TABLE_SIZE=$(PARAM_PCIE_DMA_READ_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_READ_TX_LIMIT=$(PARAM_PCIE_DMA_READ_TX_LIMIT) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_READ_TX_FC_ENABLE=$(PARAM_PCIE_DMA_READ_TX_FC_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_WRITE_OP_TABLE_SIZE=$(PARAM_PCIE_DMA_WRITE_OP_TABLE_SIZE) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_WRITE_TX_LIMIT=$(PARAM_PCIE_DMA_WRITE_TX_LIMIT) + COMPILE_ARGS += -P $(TOPLEVEL).PCIE_DMA_WRITE_TX_FC_ENABLE=$(PARAM_PCIE_DMA_WRITE_TX_FC_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).AXIL_CTRL_DATA_WIDTH=$(PARAM_AXIL_CTRL_DATA_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).AXIL_CTRL_ADDR_WIDTH=$(PARAM_AXIL_CTRL_ADDR_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).AXIL_APP_CTRL_DATA_WIDTH=$(PARAM_AXIL_APP_CTRL_DATA_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).AXIL_APP_CTRL_ADDR_WIDTH=$(PARAM_AXIL_APP_CTRL_ADDR_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).AXIS_ETH_TX_PIPELINE=$(PARAM_AXIS_ETH_TX_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).AXIS_ETH_TX_FIFO_PIPELINE=$(PARAM_AXIS_ETH_TX_FIFO_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).AXIS_ETH_TX_TS_PIPELINE=$(PARAM_AXIS_ETH_TX_TS_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).AXIS_ETH_RX_PIPELINE=$(PARAM_AXIS_ETH_RX_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).AXIS_ETH_RX_FIFO_PIPELINE=$(PARAM_AXIS_ETH_RX_FIFO_PIPELINE) + COMPILE_ARGS += -P $(TOPLEVEL).STAT_ENABLE=$(PARAM_STAT_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).STAT_DMA_ENABLE=$(PARAM_STAT_DMA_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).STAT_PCIE_ENABLE=$(PARAM_STAT_PCIE_ENABLE) + COMPILE_ARGS += -P $(TOPLEVEL).STAT_INC_WIDTH=$(PARAM_STAT_INC_WIDTH) + COMPILE_ARGS += -P $(TOPLEVEL).STAT_ID_WIDTH=$(PARAM_STAT_ID_WIDTH) + + ifeq ($(WAVES), 1) + VERILOG_SOURCES += iverilog_dump.v + COMPILE_ARGS += -s iverilog_dump + endif +else ifeq ($(SIM), verilator) + COMPILE_ARGS += -Wno-SELRANGE -Wno-WIDTH + + COMPILE_ARGS += -GIF_COUNT=$(PARAM_IF_COUNT) + COMPILE_ARGS += -GPORTS_PER_IF=$(PARAM_PORTS_PER_IF) + COMPILE_ARGS += -GPTP_PEROUT_ENABLE=$(PARAM_PTP_PEROUT_ENABLE) + COMPILE_ARGS += -GPTP_PEROUT_COUNT=$(PARAM_PTP_PEROUT_COUNT) + COMPILE_ARGS += -GEVENT_QUEUE_OP_TABLE_SIZE=$(PARAM_EVENT_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -GTX_QUEUE_OP_TABLE_SIZE=$(PARAM_TX_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -GRX_QUEUE_OP_TABLE_SIZE=$(PARAM_RX_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -GTX_CPL_QUEUE_OP_TABLE_SIZE=$(PARAM_TX_CPL_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -GRX_CPL_QUEUE_OP_TABLE_SIZE=$(PARAM_RX_CPL_QUEUE_OP_TABLE_SIZE) + COMPILE_ARGS += -GTX_QUEUE_INDEX_WIDTH=$(PARAM_TX_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -GRX_QUEUE_INDEX_WIDTH=$(PARAM_RX_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -GTX_CPL_QUEUE_INDEX_WIDTH=$(PARAM_TX_CPL_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -GRX_CPL_QUEUE_INDEX_WIDTH=$(PARAM_RX_CPL_QUEUE_INDEX_WIDTH) + COMPILE_ARGS += -GEVENT_QUEUE_PIPELINE=$(PARAM_EVENT_QUEUE_PIPELINE) + COMPILE_ARGS += -GTX_QUEUE_PIPELINE=$(PARAM_TX_QUEUE_PIPELINE) + COMPILE_ARGS += -GRX_QUEUE_PIPELINE=$(PARAM_RX_QUEUE_PIPELINE) + COMPILE_ARGS += -GTX_CPL_QUEUE_PIPELINE=$(PARAM_TX_CPL_QUEUE_PIPELINE) + COMPILE_ARGS += -GRX_CPL_QUEUE_PIPELINE=$(PARAM_RX_CPL_QUEUE_PIPELINE) + COMPILE_ARGS += -GTX_DESC_TABLE_SIZE=$(PARAM_TX_DESC_TABLE_SIZE) + COMPILE_ARGS += -GRX_DESC_TABLE_SIZE=$(PARAM_RX_DESC_TABLE_SIZE) + COMPILE_ARGS += -GTX_SCHEDULER_OP_TABLE_SIZE=$(PARAM_TX_SCHEDULER_OP_TABLE_SIZE) + COMPILE_ARGS += -GTX_SCHEDULER_PIPELINE=$(PARAM_TX_SCHEDULER_PIPELINE) + COMPILE_ARGS += -GTDMA_INDEX_WIDTH=$(PARAM_TDMA_INDEX_WIDTH) + COMPILE_ARGS += -GPTP_TS_ENABLE=$(PARAM_PTP_TS_ENABLE) + COMPILE_ARGS += -GTX_PTP_TS_FIFO_DEPTH=$(PARAM_TX_PTP_TS_FIFO_DEPTH) + COMPILE_ARGS += -GRX_PTP_TS_FIFO_DEPTH=$(PARAM_RX_PTP_TS_FIFO_DEPTH) + COMPILE_ARGS += -GTX_CHECKSUM_ENABLE=$(PARAM_TX_CHECKSUM_ENABLE) + COMPILE_ARGS += -GRX_RSS_ENABLE=$(PARAM_RX_RSS_ENABLE) + COMPILE_ARGS += -GRX_HASH_ENABLE=$(PARAM_RX_HASH_ENABLE) + COMPILE_ARGS += -GRX_CHECKSUM_ENABLE=$(PARAM_RX_CHECKSUM_ENABLE) + COMPILE_ARGS += -GTX_FIFO_DEPTH=$(PARAM_TX_FIFO_DEPTH) + COMPILE_ARGS += -GRX_FIFO_DEPTH=$(PARAM_RX_FIFO_DEPTH) + COMPILE_ARGS += -GMAX_TX_SIZE=$(PARAM_MAX_TX_SIZE) + COMPILE_ARGS += -GMAX_RX_SIZE=$(PARAM_MAX_RX_SIZE) + COMPILE_ARGS += -GTX_RAM_SIZE=$(PARAM_TX_RAM_SIZE) + COMPILE_ARGS += -GRX_RAM_SIZE=$(PARAM_RX_RAM_SIZE) + COMPILE_ARGS += -GAPP_ENABLE=$(PARAM_APP_ENABLE) + COMPILE_ARGS += -GAPP_CTRL_ENABLE=$(PARAM_APP_CTRL_ENABLE) + COMPILE_ARGS += -GAPP_DMA_ENABLE=$(PARAM_APP_DMA_ENABLE) + COMPILE_ARGS += -GAPP_AXIS_DIRECT_ENABLE=$(PARAM_APP_AXIS_DIRECT_ENABLE) + COMPILE_ARGS += -GAPP_AXIS_SYNC_ENABLE=$(PARAM_APP_AXIS_SYNC_ENABLE) + COMPILE_ARGS += -GAPP_AXIS_IF_ENABLE=$(PARAM_APP_AXIS_IF_ENABLE) + COMPILE_ARGS += -GAPP_STAT_ENABLE=$(PARAM_APP_STAT_ENABLE) + COMPILE_ARGS += -GDMA_LEN_WIDTH=$(PARAM_DMA_LEN_WIDTH) + COMPILE_ARGS += -GDMA_TAG_WIDTH=$(PARAM_DMA_TAG_WIDTH) + COMPILE_ARGS += -GRAM_PIPELINE=$(PARAM_RAM_PIPELINE) + COMPILE_ARGS += -GSEG_COUNT=$(PARAM_SEG_COUNT) + COMPILE_ARGS += -GSEG_DATA_WIDTH=$(PARAM_SEG_DATA_WIDTH) + COMPILE_ARGS += -GSEG_EMPTY_WIDTH=$(PARAM_SEG_EMPTY_WIDTH) + COMPILE_ARGS += -GTX_SEQ_NUM_WIDTH=$(PARAM_TX_SEQ_NUM_WIDTH) + COMPILE_ARGS += -GPF_COUNT=$(PARAM_PF_COUNT) + COMPILE_ARGS += -GVF_COUNT=$(PARAM_VF_COUNT) + COMPILE_ARGS += -GPCIE_TAG_COUNT=$(PARAM_PCIE_TAG_COUNT) + COMPILE_ARGS += -GPCIE_DMA_READ_OP_TABLE_SIZE=$(PARAM_PCIE_DMA_READ_OP_TABLE_SIZE) + COMPILE_ARGS += -GPCIE_DMA_READ_TX_LIMIT=$(PARAM_PCIE_DMA_READ_TX_LIMIT) + COMPILE_ARGS += -GPCIE_DMA_READ_TX_FC_ENABLE=$(PARAM_PCIE_DMA_READ_TX_FC_ENABLE) + COMPILE_ARGS += -GPCIE_DMA_WRITE_OP_TABLE_SIZE=$(PARAM_PCIE_DMA_WRITE_OP_TABLE_SIZE) + COMPILE_ARGS += -GPCIE_DMA_WRITE_TX_LIMIT=$(PARAM_PCIE_DMA_WRITE_TX_LIMIT) + COMPILE_ARGS += -GPCIE_DMA_WRITE_TX_FC_ENABLE=$(PARAM_PCIE_DMA_WRITE_TX_FC_ENABLE) + COMPILE_ARGS += -GAXIL_CTRL_DATA_WIDTH=$(PARAM_AXIL_CTRL_DATA_WIDTH) + COMPILE_ARGS += -GAXIL_CTRL_ADDR_WIDTH=$(PARAM_AXIL_CTRL_ADDR_WIDTH) + COMPILE_ARGS += -GAXIL_APP_CTRL_DATA_WIDTH=$(PARAM_AXIL_APP_CTRL_DATA_WIDTH) + COMPILE_ARGS += -GAXIL_APP_CTRL_ADDR_WIDTH=$(PARAM_AXIL_APP_CTRL_ADDR_WIDTH) + COMPILE_ARGS += -GAXIS_ETH_TX_PIPELINE=$(PARAM_AXIS_ETH_TX_PIPELINE) + COMPILE_ARGS += -GAXIS_ETH_TX_FIFO_PIPELINE=$(PARAM_AXIS_ETH_TX_FIFO_PIPELINE) + COMPILE_ARGS += -GAXIS_ETH_TX_TS_PIPELINE=$(PARAM_AXIS_ETH_TX_TS_PIPELINE) + COMPILE_ARGS += -GAXIS_ETH_RX_PIPELINE=$(PARAM_AXIS_ETH_RX_PIPELINE) + COMPILE_ARGS += -GAXIS_ETH_RX_FIFO_PIPELINE=$(PARAM_AXIS_ETH_RX_FIFO_PIPELINE) + COMPILE_ARGS += -GSTAT_ENABLE=$(PARAM_STAT_ENABLE) + COMPILE_ARGS += -GSTAT_DMA_ENABLE=$(PARAM_STAT_DMA_ENABLE) + COMPILE_ARGS += -GSTAT_PCIE_ENABLE=$(PARAM_STAT_PCIE_ENABLE) + COMPILE_ARGS += -GSTAT_INC_WIDTH=$(PARAM_STAT_INC_WIDTH) + COMPILE_ARGS += -GSTAT_ID_WIDTH=$(PARAM_STAT_ID_WIDTH) + + ifeq ($(WAVES), 1) + COMPILE_ARGS += --trace-fst + endif +endif + +include $(shell cocotb-config --makefiles)/Makefile.sim + +iverilog_dump.v: + echo 'module iverilog_dump();' > $@ + echo 'initial begin' >> $@ + echo ' $$dumpfile("$(TOPLEVEL).fst");' >> $@ + echo ' $$dumpvars(0, $(TOPLEVEL));' >> $@ + echo 'end' >> $@ + echo 'endmodule' >> $@ + +clean:: + @rm -rf iverilog_dump.v + @rm -rf dump.fst $(TOPLEVEL).fst diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/mqnic.py b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/mqnic.py new file mode 120000 index 000000000..dfa8522e7 --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/mqnic.py @@ -0,0 +1 @@ +../../../../../common/tb/mqnic.py \ No newline at end of file diff --git a/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/test_fpga_core.py b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/test_fpga_core.py new file mode 100644 index 000000000..6b8bb17ca --- /dev/null +++ b/fpga/mqnic/S10MX_DK/fpga_10g/tb/fpga_core/test_fpga_core.py @@ -0,0 +1,681 @@ +""" + +Copyright 2020-2021, The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS OF THE UNIVERSITY OF CALIFORNIA ''AS +IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of The Regents of the University of California. + +""" + +import logging +import os +import sys + +import scapy.utils +from scapy.layers.l2 import Ether +from scapy.layers.inet import IP, UDP + +import cocotb_test.simulator + +import cocotb +from cocotb.log import SimLog +from cocotb.clock import Clock +from cocotb.triggers import RisingEdge, FallingEdge, Timer + +from cocotbext.eth import XgmiiSource, XgmiiSink +from cocotbext.pcie.core import RootComplex +from cocotbext.pcie.intel.s10 import S10PcieDevice, S10RxBus, S10TxBus + +try: + import mqnic +except ImportError: + # attempt import from current directory + sys.path.insert(0, os.path.join(os.path.dirname(__file__))) + try: + import mqnic + finally: + del sys.path[0] + + +class TB(object): + def __init__(self, dut): + self.dut = dut + + self.log = SimLog("cocotb.tb") + self.log.setLevel(logging.DEBUG) + + # PCIe + self.rc = RootComplex() + + self.rc.max_payload_size = 0x1 # 256 bytes + self.rc.max_read_request_size = 0x2 # 512 bytes + + self.dev = S10PcieDevice( + # configuration options + pcie_generation=3, + # pcie_link_width=8, + # pld_clk_frequency=250e6, + l_tile=False, + + # signals + # Clock and reset + # npor=dut.npor, + # pin_perst=dut.pin_perst, + # ninit_done=dut.ninit_done, + # pld_clk_inuse=dut.pld_clk_inuse, + # pld_core_ready=dut.pld_core_ready, + reset_status=dut.rst_250mhz, + # clr_st=dut.clr_st, + # refclk=dut.refclk, + coreclkout_hip=dut.clk_250mhz, + + # RX interface + rx_bus=S10RxBus.from_prefix(dut, "rx_st"), + + # TX interface + tx_bus=S10TxBus.from_prefix(dut, "tx_st"), + + # TX flow control + tx_ph_cdts=dut.tx_ph_cdts, + tx_pd_cdts=dut.tx_pd_cdts, + tx_nph_cdts=dut.tx_nph_cdts, + tx_npd_cdts=dut.tx_npd_cdts, + tx_cplh_cdts=dut.tx_cplh_cdts, + tx_cpld_cdts=dut.tx_cpld_cdts, + tx_hdr_cdts_consumed=dut.tx_hdr_cdts_consumed, + tx_data_cdts_consumed=dut.tx_data_cdts_consumed, + tx_cdts_type=dut.tx_cdts_type, + tx_cdts_data_value=dut.tx_cdts_data_value, + + # Hard IP status + # int_status=dut.int_status, + # int_status_common=dut.int_status_common, + # derr_cor_ext_rpl=dut.derr_cor_ext_rpl, + # derr_rpl=dut.derr_rpl, + # derr_cor_ext_rcv=dut.derr_cor_ext_rcv, + # derr_uncor_ext_rcv=dut.derr_uncor_ext_rcv, + # rx_par_err=dut.rx_par_err, + # tx_par_err=dut.tx_par_err, + # ltssmstate=dut.ltssmstate, + # link_up=dut.link_up, + # lane_act=dut.lane_act, + # currentspeed=dut.currentspeed, + + # Power management + # pm_linkst_in_l1=dut.pm_linkst_in_l1, + # pm_linkst_in_l0s=dut.pm_linkst_in_l0s, + # pm_state=dut.pm_state, + # pm_dstate=dut.pm_dstate, + # apps_pm_xmt_pme=dut.apps_pm_xmt_pme, + # apps_ready_entr_l23=dut.apps_ready_entr_l23, + # apps_pm_xmt_turnoff=dut.apps_pm_xmt_turnoff, + # app_init_rst=dut.app_init_rst, + # app_xfer_pending=dut.app_xfer_pending, + + # Interrupt interface + app_msi_req=dut.app_msi_req, + app_msi_ack=dut.app_msi_ack, + app_msi_tc=dut.app_msi_tc, + app_msi_num=dut.app_msi_num, + app_msi_func_num=dut.app_msi_func_num, + # app_int_sts=dut.app_int_sts, + + # Error interface + # app_err_valid=dut.app_err_valid, + # app_err_hdr=dut.app_err_hdr, + # app_err_info=dut.app_err_info, + # app_err_func_num=dut.app_err_func_num, + + # Configuration output + tl_cfg_func=dut.tl_cfg_func, + tl_cfg_add=dut.tl_cfg_add, + tl_cfg_ctl=dut.tl_cfg_ctl, + + # Configuration extension bus + # ceb_req=dut.ceb_req, + # ceb_ack=dut.ceb_ack, + # ceb_addr=dut.ceb_addr, + # ceb_din=dut.ceb_din, + # ceb_dout=dut.ceb_dout, + # ceb_wr=dut.ceb_wr, + # ceb_cdm_convert_data=dut.ceb_cdm_convert_data, + # ceb_func_num=dut.ceb_func_num, + # ceb_vf_num=dut.ceb_vf_num, + # ceb_vf_active=dut.ceb_vf_active, + + # Hard IP reconfiguration interface + # hip_reconfig_clk=dut.hip_reconfig_clk, + # hip_reconfig_address=dut.hip_reconfig_address, + # hip_reconfig_read=dut.hip_reconfig_read, + # hip_reconfig_readdata=dut.hip_reconfig_readdata, + # hip_reconfig_readdatavalid=dut.hip_reconfig_readdatavalid, + # hip_reconfig_write=dut.hip_reconfig_write, + # hip_reconfig_writedata=dut.hip_reconfig_writedata, + # hip_reconfig_waitrequest=dut.hip_reconfig_waitrequest, + ) + + # self.dev.log.setLevel(logging.DEBUG) + + self.rc.make_port().connect(self.dev) + + self.driver = mqnic.Driver(self.rc) + + self.dev.functions[0].msi_cap.msi_multiple_message_capable = 5 + + self.dev.functions[0].configure_bar(0, 2**len(dut.core_inst.core_pcie_inst.axil_ctrl_araddr), ext=True, prefetch=True) + if hasattr(dut.core_inst.core_pcie_inst, 'pcie_app_ctrl'): + self.dev.functions[0].configure_bar(2, 2**len(dut.core_inst.core_pcie_inst.axil_app_ctrl_araddr), ext=True, prefetch=True) + + # Ethernet + cocotb.fork(Clock(dut.qsfp0_rx_clk_1, 6.4, units="ns").start()) + self.qsfp0_1_source = XgmiiSource(dut.qsfp0_rxd_1, dut.qsfp0_rxc_1, dut.qsfp0_rx_clk_1, dut.qsfp0_rx_rst_1) + cocotb.fork(Clock(dut.qsfp0_tx_clk_1, 6.4, units="ns").start()) + self.qsfp0_1_sink = XgmiiSink(dut.qsfp0_txd_1, dut.qsfp0_txc_1, dut.qsfp0_tx_clk_1, dut.qsfp0_tx_rst_1) + + cocotb.fork(Clock(dut.qsfp0_rx_clk_2, 6.4, units="ns").start()) + self.qsfp0_2_source = XgmiiSource(dut.qsfp0_rxd_2, dut.qsfp0_rxc_2, dut.qsfp0_rx_clk_2, dut.qsfp0_rx_rst_2) + cocotb.fork(Clock(dut.qsfp0_tx_clk_2, 6.4, units="ns").start()) + self.qsfp0_2_sink = XgmiiSink(dut.qsfp0_txd_2, dut.qsfp0_txc_2, dut.qsfp0_tx_clk_2, dut.qsfp0_tx_rst_2) + + cocotb.fork(Clock(dut.qsfp0_rx_clk_3, 6.4, units="ns").start()) + self.qsfp0_3_source = XgmiiSource(dut.qsfp0_rxd_3, dut.qsfp0_rxc_3, dut.qsfp0_rx_clk_3, dut.qsfp0_rx_rst_3) + cocotb.fork(Clock(dut.qsfp0_tx_clk_3, 6.4, units="ns").start()) + self.qsfp0_3_sink = XgmiiSink(dut.qsfp0_txd_3, dut.qsfp0_txc_3, dut.qsfp0_tx_clk_3, dut.qsfp0_tx_rst_3) + + cocotb.fork(Clock(dut.qsfp0_rx_clk_4, 6.4, units="ns").start()) + self.qsfp0_4_source = XgmiiSource(dut.qsfp0_rxd_4, dut.qsfp0_rxc_4, dut.qsfp0_rx_clk_4, dut.qsfp0_rx_rst_4) + cocotb.fork(Clock(dut.qsfp0_tx_clk_4, 6.4, units="ns").start()) + self.qsfp0_4_sink = XgmiiSink(dut.qsfp0_txd_4, dut.qsfp0_txc_4, dut.qsfp0_tx_clk_4, dut.qsfp0_tx_rst_4) + + cocotb.fork(Clock(dut.qsfp1_rx_clk_1, 6.4, units="ns").start()) + self.qsfp1_1_source = XgmiiSource(dut.qsfp1_rxd_1, dut.qsfp1_rxc_1, dut.qsfp1_rx_clk_1, dut.qsfp1_rx_rst_1) + cocotb.fork(Clock(dut.qsfp1_tx_clk_1, 6.4, units="ns").start()) + self.qsfp1_1_sink = XgmiiSink(dut.qsfp1_txd_1, dut.qsfp1_txc_1, dut.qsfp1_tx_clk_1, dut.qsfp1_tx_rst_1) + + cocotb.fork(Clock(dut.qsfp1_rx_clk_2, 6.4, units="ns").start()) + self.qsfp1_2_source = XgmiiSource(dut.qsfp1_rxd_2, dut.qsfp1_rxc_2, dut.qsfp1_rx_clk_2, dut.qsfp1_rx_rst_2) + cocotb.fork(Clock(dut.qsfp1_tx_clk_2, 6.4, units="ns").start()) + self.qsfp1_2_sink = XgmiiSink(dut.qsfp1_txd_2, dut.qsfp1_txc_2, dut.qsfp1_tx_clk_2, dut.qsfp1_tx_rst_2) + + cocotb.fork(Clock(dut.qsfp1_rx_clk_3, 6.4, units="ns").start()) + self.qsfp1_3_source = XgmiiSource(dut.qsfp1_rxd_3, dut.qsfp1_rxc_3, dut.qsfp1_rx_clk_3, dut.qsfp1_rx_rst_3) + cocotb.fork(Clock(dut.qsfp1_tx_clk_3, 6.4, units="ns").start()) + self.qsfp1_3_sink = XgmiiSink(dut.qsfp1_txd_3, dut.qsfp1_txc_3, dut.qsfp1_tx_clk_3, dut.qsfp1_tx_rst_3) + + cocotb.fork(Clock(dut.qsfp1_rx_clk_4, 6.4, units="ns").start()) + self.qsfp1_4_source = XgmiiSource(dut.qsfp1_rxd_4, dut.qsfp1_rxc_4, dut.qsfp1_rx_clk_4, dut.qsfp1_rx_rst_4) + cocotb.fork(Clock(dut.qsfp1_tx_clk_4, 6.4, units="ns").start()) + self.qsfp1_4_sink = XgmiiSink(dut.qsfp1_txd_4, dut.qsfp1_txc_4, dut.qsfp1_tx_clk_4, dut.qsfp1_tx_rst_4) + + # dut.qsfp0_i2c_scl_i.setimmediatevalue(1) + # dut.qsfp0_i2c_sda_i.setimmediatevalue(1) + # dut.qsfp0_intr_n.setimmediatevalue(1) + # dut.qsfp0_mod_prsnt_n.setimmediatevalue(0) + + # dut.qsfp0_rx_error_count_0.setimmediatevalue(0) + # dut.qsfp0_rx_error_count_1.setimmediatevalue(0) + # dut.qsfp0_rx_error_count_2.setimmediatevalue(0) + # dut.qsfp0_rx_error_count_3.setimmediatevalue(0) + + # dut.qsfp1_i2c_scl_i.setimmediatevalue(1) + # dut.qsfp1_i2c_sda_i.setimmediatevalue(1) + # dut.qsfp1_intr_n.setimmediatevalue(1) + # dut.qsfp1_mod_prsnt_n.setimmediatevalue(0) + + # dut.qsfp1_rx_error_count_0.setimmediatevalue(0) + # dut.qsfp1_rx_error_count_1.setimmediatevalue(0) + # dut.qsfp1_rx_error_count_2.setimmediatevalue(0) + # dut.qsfp1_rx_error_count_3.setimmediatevalue(0) + + # dut.qspi_dq_i.setimmediatevalue(0) + + self.loopback_enable = False + cocotb.fork(self._run_loopback()) + + async def init(self): + + self.dut.qsfp0_rx_rst_1.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_1.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_2.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_2.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_3.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_3.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_4.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_4.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_1.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_1.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_2.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_2.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_3.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_3.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_4.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_4.setimmediatevalue(0) + + await RisingEdge(self.dut.clk_250mhz) + await RisingEdge(self.dut.clk_250mhz) + + self.dut.qsfp0_rx_rst_1.setimmediatevalue(1) + self.dut.qsfp0_tx_rst_1.setimmediatevalue(1) + self.dut.qsfp0_rx_rst_2.setimmediatevalue(1) + self.dut.qsfp0_tx_rst_2.setimmediatevalue(1) + self.dut.qsfp0_rx_rst_3.setimmediatevalue(1) + self.dut.qsfp0_tx_rst_3.setimmediatevalue(1) + self.dut.qsfp0_rx_rst_4.setimmediatevalue(1) + self.dut.qsfp0_tx_rst_4.setimmediatevalue(1) + self.dut.qsfp1_rx_rst_1.setimmediatevalue(1) + self.dut.qsfp1_tx_rst_1.setimmediatevalue(1) + self.dut.qsfp1_rx_rst_2.setimmediatevalue(1) + self.dut.qsfp1_tx_rst_2.setimmediatevalue(1) + self.dut.qsfp1_rx_rst_3.setimmediatevalue(1) + self.dut.qsfp1_tx_rst_3.setimmediatevalue(1) + self.dut.qsfp1_rx_rst_4.setimmediatevalue(1) + self.dut.qsfp1_tx_rst_4.setimmediatevalue(1) + + await FallingEdge(self.dut.rst_250mhz) + await Timer(100, 'ns') + + await RisingEdge(self.dut.clk_250mhz) + await RisingEdge(self.dut.clk_250mhz) + + self.dut.qsfp0_rx_rst_1.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_1.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_2.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_2.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_3.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_3.setimmediatevalue(0) + self.dut.qsfp0_rx_rst_4.setimmediatevalue(0) + self.dut.qsfp0_tx_rst_4.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_1.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_1.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_2.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_2.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_3.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_3.setimmediatevalue(0) + self.dut.qsfp1_rx_rst_4.setimmediatevalue(0) + self.dut.qsfp1_tx_rst_4.setimmediatevalue(0) + + await self.rc.enumerate(enable_bus_mastering=True, configure_msi=True) + + async def _run_loopback(self): + while True: + await RisingEdge(self.dut.clk_250mhz) + + if self.loopback_enable: + if not self.qsfp0_1_sink.empty(): + await self.qsfp0_1_source.send(await self.qsfp0_1_sink.recv()) + if not self.qsfp0_2_sink.empty(): + await self.qsfp0_2_source.send(await self.qsfp0_2_sink.recv()) + if not self.qsfp0_3_sink.empty(): + await self.qsfp0_3_source.send(await self.qsfp0_3_sink.recv()) + if not self.qsfp0_4_sink.empty(): + await self.qsfp0_4_source.send(await self.qsfp0_4_sink.recv()) + if not self.qsfp1_1_sink.empty(): + await self.qsfp1_1_source.send(await self.qsfp1_1_sink.recv()) + if not self.qsfp1_2_sink.empty(): + await self.qsfp1_2_source.send(await self.qsfp1_2_sink.recv()) + if not self.qsfp1_3_sink.empty(): + await self.qsfp1_3_source.send(await self.qsfp1_3_sink.recv()) + if not self.qsfp1_4_sink.empty(): + await self.qsfp1_4_source.send(await self.qsfp1_4_sink.recv()) + + +@cocotb.test() +async def run_test_nic(dut): + + tb = TB(dut) + + await tb.init() + + tb.log.info("Init driver") + await tb.driver.init_dev(tb.dev.functions[0].pcie_id) + await tb.driver.interfaces[0].open() + # await driver.interfaces[1].open() + + # enable queues + tb.log.info("Enable queues") + await tb.rc.mem_write_dword(tb.driver.interfaces[0].ports[0].hw_addr+mqnic.MQNIC_PORT_REG_SCHED_ENABLE, 0x00000001) + for k in range(tb.driver.interfaces[0].tx_queue_count): + await tb.rc.mem_write_dword(tb.driver.interfaces[0].ports[0].schedulers[0].hw_addr+4*k, 0x00000003) + + # wait for all writes to complete + await tb.rc.mem_read(tb.driver.hw_addr, 4) + tb.log.info("Init complete") + + tb.log.info("Send and receive single packet") + + data = bytearray([x % 256 for x in range(1024)]) + + await tb.driver.interfaces[0].start_xmit(data, 0) + + pkt = await tb.qsfp0_1_sink.recv() + tb.log.info("Packet: %s", pkt) + + await tb.qsfp0_1_source.send(pkt) + + pkt = await tb.driver.interfaces[0].recv() + + tb.log.info("Packet: %s", pkt) + assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff + + # await tb.driver.interfaces[1].start_xmit(data, 0) + + # pkt = await tb.qsfp1_1_sink.recv() + # tb.log.info("Packet: %s", pkt) + + # await tb.qsfp1_1_source.send(pkt) + + # pkt = await tb.driver.interfaces[1].recv() + + # tb.log.info("Packet: %s", pkt) + # assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff + + tb.log.info("RX and TX checksum tests") + + payload = bytes([x % 256 for x in range(256)]) + eth = Ether(src='5A:51:52:53:54:55', dst='DA:D1:D2:D3:D4:D5') + ip = IP(src='192.168.1.100', dst='192.168.1.101') + udp = UDP(sport=1, dport=2) + test_pkt = eth / ip / udp / payload + + test_pkt2 = test_pkt.copy() + test_pkt2[UDP].chksum = scapy.utils.checksum(bytes(test_pkt2[UDP])) + + await tb.driver.interfaces[0].start_xmit(test_pkt2.build(), 0, 34, 6) + + pkt = await tb.qsfp0_1_sink.recv() + tb.log.info("Packet: %s", pkt) + + await tb.qsfp0_1_source.send(pkt) + + pkt = await tb.driver.interfaces[0].recv() + + tb.log.info("Packet: %s", pkt) + assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff + assert Ether(pkt.data).build() == test_pkt.build() + + tb.log.info("Multiple small packets") + + count = 64 + + pkts = [bytearray([(x+k) % 256 for x in range(60)]) for k in range(count)] + + tb.loopback_enable = True + + for p in pkts: + await tb.driver.interfaces[0].start_xmit(p, 0) + + for k in range(count): + pkt = await tb.driver.interfaces[0].recv() + + tb.log.info("Packet: %s", pkt) + assert pkt.data == pkts[k] + assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff + + tb.loopback_enable = False + + tb.log.info("Multiple large packets") + + count = 64 + + pkts = [bytearray([(x+k) % 256 for x in range(1514)]) for k in range(count)] + + tb.loopback_enable = True + + for p in pkts: + await tb.driver.interfaces[0].start_xmit(p, 0) + + for k in range(count): + pkt = await tb.driver.interfaces[0].recv() + + tb.log.info("Packet: %s", pkt) + assert pkt.data == pkts[k] + assert pkt.rx_checksum == ~scapy.utils.checksum(bytes(pkt.data[14:])) & 0xffff + + tb.loopback_enable = False + + await RisingEdge(dut.clk_250mhz) + await RisingEdge(dut.clk_250mhz) + + +# cocotb-test + +tests_dir = os.path.dirname(__file__) +rtl_dir = os.path.abspath(os.path.join(tests_dir, '..', '..', 'rtl')) +lib_dir = os.path.abspath(os.path.join(rtl_dir, '..', 'lib')) +app_dir = os.path.abspath(os.path.join(rtl_dir, '..', 'app')) +axi_rtl_dir = os.path.abspath(os.path.join(lib_dir, 'axi', 'rtl')) +axis_rtl_dir = os.path.abspath(os.path.join(lib_dir, 'axis', 'rtl')) +eth_rtl_dir = os.path.abspath(os.path.join(lib_dir, 'eth', 'rtl')) +pcie_rtl_dir = os.path.abspath(os.path.join(lib_dir, 'pcie', 'rtl')) + + +def test_fpga_core(request): + dut = "fpga_core" + module = os.path.splitext(os.path.basename(__file__))[0] + toplevel = dut + + verilog_sources = [ + os.path.join(rtl_dir, f"{dut}.v"), + os.path.join(rtl_dir, "common", "mqnic_core_pcie_s10.v"), + os.path.join(rtl_dir, "common", "mqnic_core_pcie.v"), + os.path.join(rtl_dir, "common", "mqnic_core.v"), + os.path.join(rtl_dir, "common", "mqnic_interface.v"), + os.path.join(rtl_dir, "common", "mqnic_port.v"), + os.path.join(rtl_dir, "common", "mqnic_ptp.v"), + os.path.join(rtl_dir, "common", "mqnic_ptp_clock.v"), + os.path.join(rtl_dir, "common", "mqnic_ptp_perout.v"), + os.path.join(rtl_dir, "common", "cpl_write.v"), + os.path.join(rtl_dir, "common", "cpl_op_mux.v"), + os.path.join(rtl_dir, "common", "desc_fetch.v"), + os.path.join(rtl_dir, "common", "desc_op_mux.v"), + os.path.join(rtl_dir, "common", "event_mux.v"), + os.path.join(rtl_dir, "common", "queue_manager.v"), + os.path.join(rtl_dir, "common", "cpl_queue_manager.v"), + os.path.join(rtl_dir, "common", "tx_engine.v"), + os.path.join(rtl_dir, "common", "rx_engine.v"), + os.path.join(rtl_dir, "common", "tx_checksum.v"), + os.path.join(rtl_dir, "common", "rx_hash.v"), + os.path.join(rtl_dir, "common", "rx_checksum.v"), + os.path.join(rtl_dir, "common", "stats_counter.v"), + os.path.join(rtl_dir, "common", "stats_collect.v"), + os.path.join(rtl_dir, "common", "stats_pcie_if.v"), + os.path.join(rtl_dir, "common", "stats_pcie_tlp.v"), + os.path.join(rtl_dir, "common", "stats_dma_if_pcie.v"), + os.path.join(rtl_dir, "common", "stats_dma_latency.v"), + os.path.join(rtl_dir, "common", "mqnic_tx_scheduler_block_rr.v"), + os.path.join(rtl_dir, "common", "tx_scheduler_rr.v"), + os.path.join(rtl_dir, "common", "tdma_scheduler.v"), + os.path.join(rtl_dir, "common", "tdma_ber.v"), + os.path.join(rtl_dir, "common", "tdma_ber_ch.v"), + os.path.join(eth_rtl_dir, "eth_mac_10g.v"), + os.path.join(eth_rtl_dir, "axis_xgmii_rx_64.v"), + os.path.join(eth_rtl_dir, "axis_xgmii_tx_64.v"), + os.path.join(eth_rtl_dir, "lfsr.v"), + os.path.join(eth_rtl_dir, "ptp_clock.v"), + os.path.join(eth_rtl_dir, "ptp_clock_cdc.v"), + os.path.join(eth_rtl_dir, "ptp_perout.v"), + os.path.join(eth_rtl_dir, "ptp_ts_extract.v"), + os.path.join(axi_rtl_dir, "axil_interconnect.v"), + os.path.join(axi_rtl_dir, "axil_crossbar.v"), + os.path.join(axi_rtl_dir, "axil_crossbar_addr.v"), + os.path.join(axi_rtl_dir, "axil_crossbar_rd.v"), + os.path.join(axi_rtl_dir, "axil_crossbar_wr.v"), + os.path.join(axi_rtl_dir, "axil_reg_if.v"), + os.path.join(axi_rtl_dir, "axil_reg_if_rd.v"), + os.path.join(axi_rtl_dir, "axil_reg_if_wr.v"), + os.path.join(axi_rtl_dir, "axil_register_rd.v"), + os.path.join(axi_rtl_dir, "axil_register_wr.v"), + os.path.join(axi_rtl_dir, "arbiter.v"), + os.path.join(axi_rtl_dir, "priority_encoder.v"), + os.path.join(axis_rtl_dir, "axis_adapter.v"), + os.path.join(axis_rtl_dir, "axis_arb_mux.v"), + os.path.join(axis_rtl_dir, "axis_async_fifo.v"), + os.path.join(axis_rtl_dir, "axis_async_fifo_adapter.v"), + os.path.join(axis_rtl_dir, "axis_fifo.v"), + os.path.join(axis_rtl_dir, "axis_pipeline_fifo.v"), + os.path.join(axis_rtl_dir, "axis_register.v"), + os.path.join(pcie_rtl_dir, "pcie_axil_master.v"), + os.path.join(pcie_rtl_dir, "pcie_tlp_demux.v"), + os.path.join(pcie_rtl_dir, "pcie_tlp_demux_bar.v"), + os.path.join(pcie_rtl_dir, "pcie_tlp_mux.v"), + os.path.join(pcie_rtl_dir, "dma_if_pcie.v"), + os.path.join(pcie_rtl_dir, "dma_if_pcie_rd.v"), + os.path.join(pcie_rtl_dir, "dma_if_pcie_wr.v"), + os.path.join(pcie_rtl_dir, "dma_if_mux.v"), + os.path.join(pcie_rtl_dir, "dma_if_mux_rd.v"), + os.path.join(pcie_rtl_dir, "dma_if_mux_wr.v"), + os.path.join(pcie_rtl_dir, "dma_if_desc_mux.v"), + os.path.join(pcie_rtl_dir, "dma_ram_demux_rd.v"), + os.path.join(pcie_rtl_dir, "dma_ram_demux_wr.v"), + os.path.join(pcie_rtl_dir, "dma_psdpram.v"), + os.path.join(pcie_rtl_dir, "dma_client_axis_sink.v"), + os.path.join(pcie_rtl_dir, "dma_client_axis_source.v"), + os.path.join(pcie_rtl_dir, "pcie_s10_if.v"), + os.path.join(pcie_rtl_dir, "pcie_s10_if_rx.v"), + os.path.join(pcie_rtl_dir, "pcie_s10_if_tx.v"), + os.path.join(pcie_rtl_dir, "pcie_s10_cfg.v"), + os.path.join(pcie_rtl_dir, "pcie_s10_msi.v"), + os.path.join(pcie_rtl_dir, "pulse_merge.v"), + ] + + parameters = {} + + # Structural configuration + parameters['IF_COUNT'] = 2 + parameters['PORTS_PER_IF'] = 1 + + # PTP configuration + parameters['PTP_PEROUT_ENABLE'] = 1 + parameters['PTP_PEROUT_COUNT'] = 1 + + # Queue manager configuration (interface) + parameters['EVENT_QUEUE_OP_TABLE_SIZE'] = 32 + parameters['TX_QUEUE_OP_TABLE_SIZE'] = 32 + parameters['RX_QUEUE_OP_TABLE_SIZE'] = 32 + parameters['TX_CPL_QUEUE_OP_TABLE_SIZE'] = parameters['TX_QUEUE_OP_TABLE_SIZE'] + parameters['RX_CPL_QUEUE_OP_TABLE_SIZE'] = parameters['RX_QUEUE_OP_TABLE_SIZE'] + parameters['TX_QUEUE_INDEX_WIDTH'] = 13 + parameters['RX_QUEUE_INDEX_WIDTH'] = 8 + parameters['TX_CPL_QUEUE_INDEX_WIDTH'] = parameters['TX_QUEUE_INDEX_WIDTH'] + parameters['RX_CPL_QUEUE_INDEX_WIDTH'] = parameters['RX_QUEUE_INDEX_WIDTH'] + parameters['EVENT_QUEUE_PIPELINE'] = 3 + parameters['TX_QUEUE_PIPELINE'] = 3 + max(parameters['TX_QUEUE_INDEX_WIDTH']-12, 0) + parameters['RX_QUEUE_PIPELINE'] = 3 + max(parameters['RX_QUEUE_INDEX_WIDTH']-12, 0) + parameters['TX_CPL_QUEUE_PIPELINE'] = parameters['TX_QUEUE_PIPELINE'] + parameters['RX_CPL_QUEUE_PIPELINE'] = parameters['RX_QUEUE_PIPELINE'] + + # TX and RX engine configuration (port) + parameters['TX_DESC_TABLE_SIZE'] = 32 + parameters['RX_DESC_TABLE_SIZE'] = 32 + + # Scheduler configuration (port) + parameters['TX_SCHEDULER_OP_TABLE_SIZE'] = parameters['TX_DESC_TABLE_SIZE'] + parameters['TX_SCHEDULER_PIPELINE'] = parameters['TX_QUEUE_PIPELINE'] + parameters['TDMA_INDEX_WIDTH'] = 6 + + # Timestamping configuration (port) + parameters['PTP_TS_ENABLE'] = 1 + parameters['TX_PTP_TS_FIFO_DEPTH'] = 32 + parameters['RX_PTP_TS_FIFO_DEPTH'] = 32 + + # Interface configuration (port) + parameters['TX_CHECKSUM_ENABLE'] = 1 + parameters['RX_RSS_ENABLE'] = 1 + parameters['RX_HASH_ENABLE'] = 1 + parameters['RX_CHECKSUM_ENABLE'] = 1 + parameters['TX_FIFO_DEPTH'] = 32768 + parameters['RX_FIFO_DEPTH'] = 32768 + parameters['MAX_TX_SIZE'] = 9214 + parameters['MAX_RX_SIZE'] = 9214 + parameters['TX_RAM_SIZE'] = 32768 + parameters['RX_RAM_SIZE'] = 32768 + + # Application block configuration + parameters['APP_ENABLE'] = 0 + parameters['APP_CTRL_ENABLE'] = 1 + parameters['APP_DMA_ENABLE'] = 1 + parameters['APP_AXIS_DIRECT_ENABLE'] = 1 + parameters['APP_AXIS_SYNC_ENABLE'] = 1 + parameters['APP_AXIS_IF_ENABLE'] = 1 + parameters['APP_STAT_ENABLE'] = 1 + + # DMA interface configuration + parameters['DMA_LEN_WIDTH'] = 16 + parameters['DMA_TAG_WIDTH'] = 16 + parameters['RAM_PIPELINE'] = 2 + + # PCIe interface configuration + parameters['SEG_COUNT'] = 1 + parameters['SEG_DATA_WIDTH'] = 256 + parameters['SEG_EMPTY_WIDTH'] = ((parameters['SEG_DATA_WIDTH'] // 32) - 1).bit_length() + parameters['TX_SEQ_NUM_WIDTH'] = 6 + parameters['PF_COUNT'] = 1 + parameters['VF_COUNT'] = 0 + parameters['PCIE_TAG_COUNT'] = 256 + parameters['PCIE_DMA_READ_OP_TABLE_SIZE'] = parameters['PCIE_TAG_COUNT'] + parameters['PCIE_DMA_READ_TX_LIMIT'] = 16 + parameters['PCIE_DMA_READ_TX_FC_ENABLE'] = 1 + parameters['PCIE_DMA_WRITE_OP_TABLE_SIZE'] = 16 + parameters['PCIE_DMA_WRITE_TX_LIMIT'] = 3 + parameters['PCIE_DMA_WRITE_TX_FC_ENABLE'] = 1 + + # AXI lite interface configuration (control) + parameters['AXIL_CTRL_DATA_WIDTH'] = 32 + parameters['AXIL_CTRL_ADDR_WIDTH'] = 24 + + # AXI lite interface configuration (application control) + parameters['AXIL_APP_CTRL_DATA_WIDTH'] = parameters['AXIL_CTRL_DATA_WIDTH'] + parameters['AXIL_APP_CTRL_ADDR_WIDTH'] = 24 + + # Ethernet interface configuration + parameters['AXIS_ETH_TX_PIPELINE'] = 0 + parameters['AXIS_ETH_TX_FIFO_PIPELINE'] = 2 + parameters['AXIS_ETH_TX_TS_PIPELINE'] = 0 + parameters['AXIS_ETH_RX_PIPELINE'] = 0 + parameters['AXIS_ETH_RX_FIFO_PIPELINE'] = 2 + + # Statistics counter subsystem + parameters['STAT_ENABLE'] = 1 + parameters['STAT_DMA_ENABLE'] = 1 + parameters['STAT_PCIE_ENABLE'] = 1 + parameters['STAT_INC_WIDTH'] = 24 + parameters['STAT_ID_WIDTH'] = 12 + + extra_env = {f'PARAM_{k}': str(v) for k, v in parameters.items()} + + sim_build = os.path.join(tests_dir, "sim_build", + request.node.name.replace('[', '-').replace(']', '')) + + cocotb_test.simulator.run( + python_search=[tests_dir], + verilog_sources=verilog_sources, + toplevel=toplevel, + module=module, + parameters=parameters, + sim_build=sim_build, + extra_env=extra_env, + )