mpm/fpga: x4xx: Major updates in preparation for future devices
FPGA: - Split up MB registers that control daughterboard specific settings so that daughterboards 0 and 1 could have different setings, in preparation for future devices that require different settings. This requires a compat number bump to 8.0. - Add registers for additional RFDC information, including the block/tile mapping of the individual channels, and information about resampling capabilities - Identify sections of code that would be specific to X410/ZBX and move them to their own headers, so it's trivial to add device-specific sections of code instead for other devices in the future. - This includes constraints for clocks and I/O pins. - Remove ability to do timed ctrlport transactions to the MB CPLD, this was unused and possibly broken. - Move daughterboard-specific code into its own code location (dboards/zbx) - Move X410-specific register documentation to its own location (doc/X410) - Refactor Makefiles to split out X410/ZBX specific components and allow switching between device types - Add 512-bit AXI interconnects - Make number of timekeepers configurable (X410 keeps the single timekeeper) MPM: - Required compat is bumped to 8.0 - Now supports new registers for detecting DSP capabilities and multi-rate settings for the daughterboards - Adds MMCM controls (currently unused) Co-authored-by: Wade Fife <wade.fife@ni.com> Co-authored-by: Ryan Marlow <ryan@lmarlow.com> Co-authored-by: Martin Braun <martin.braun@ettus.com> Co-authored-by: Humberto Jimenez <humberto.jimenez@ni.com> Original-commit: c1d268917ea65dd9c5a42366014cb96d3c025223
This commit is contained in:
committed by
Martin Braun
co-authored by
Wade Fife
Ryan Marlow
Martin Braun
Humberto Jimenez
parent
ffdcc016cc
commit
adf6f576c6
@@ -60,57 +60,9 @@ set_property IOSTANDARD DIFF_SSTL12 [get_ports {FABRIC_CLK_OUT_*}]
|
||||
# Pin constraints for the other PL pins (1.8 V)
|
||||
###############################################################################
|
||||
|
||||
set_property PACKAGE_PIN F6 [get_ports {DB1_GPIO[0]}]
|
||||
set_property PACKAGE_PIN E6 [get_ports {DB1_GPIO[1]}]
|
||||
set_property PACKAGE_PIN E9 [get_ports {DB1_GPIO[2]}]
|
||||
set_property PACKAGE_PIN E8 [get_ports {DB1_GPIO[3]}]
|
||||
set_property PACKAGE_PIN E7 [get_ports {DB1_GPIO[4]}]
|
||||
set_property PACKAGE_PIN D6 [get_ports {DB1_GPIO[5]}]
|
||||
set_property PACKAGE_PIN D10 [get_ports {DB1_GPIO[6]}]
|
||||
set_property PACKAGE_PIN C10 [get_ports {DB1_GPIO[7]}]
|
||||
set_property PACKAGE_PIN C8 [get_ports {DB1_GPIO[8]}]
|
||||
set_property PACKAGE_PIN C7 [get_ports {DB1_GPIO[9]}]
|
||||
set_property PACKAGE_PIN D9 [get_ports {DB1_GPIO[10]}]
|
||||
set_property PACKAGE_PIN D8 [get_ports {DB1_GPIO[11]}]
|
||||
set_property PACKAGE_PIN B8 [get_ports {DB1_GPIO[12]}]
|
||||
set_property PACKAGE_PIN B7 [get_ports {DB1_GPIO[13]}]
|
||||
set_property PACKAGE_PIN B10 [get_ports {DB1_GPIO[14]}]
|
||||
set_property PACKAGE_PIN B9 [get_ports {DB1_GPIO[15]}]
|
||||
set_property PACKAGE_PIN C6 [get_ports {DB1_GPIO[16]}]
|
||||
set_property PACKAGE_PIN C5 [get_ports {DB1_GPIO[17]}]
|
||||
set_property PACKAGE_PIN B5 [get_ports {DB1_GPIO[18]}]
|
||||
set_property PACKAGE_PIN A5 [get_ports {DB1_GPIO[19]}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB1_GPIO[*]}]
|
||||
set_property PULLDOWN TRUE [get_ports {DB1_GPIO[*]}]
|
||||
set_property IOB TRUE [get_ports {DB1_GPIO[*]}]
|
||||
|
||||
set_property PACKAGE_PIN A7 [get_ports {DB1_SYNTH_SYNC}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB1_SYNTH_SYNC}]
|
||||
|
||||
set_property PACKAGE_PIN AW6 [get_ports {DB0_GPIO[0]}]
|
||||
set_property PACKAGE_PIN AW5 [get_ports {DB0_GPIO[1]}]
|
||||
set_property PACKAGE_PIN AW4 [get_ports {DB0_GPIO[2]}]
|
||||
set_property PACKAGE_PIN AW3 [get_ports {DB0_GPIO[3]}]
|
||||
set_property PACKAGE_PIN AV3 [get_ports {DB0_GPIO[4]}]
|
||||
set_property PACKAGE_PIN AV2 [get_ports {DB0_GPIO[5]}]
|
||||
set_property PACKAGE_PIN AU2 [get_ports {DB0_GPIO[6]}]
|
||||
set_property PACKAGE_PIN AU1 [get_ports {DB0_GPIO[7]}]
|
||||
set_property PACKAGE_PIN AV6 [get_ports {DB0_GPIO[8]}]
|
||||
set_property PACKAGE_PIN AV5 [get_ports {DB0_GPIO[9]}]
|
||||
set_property PACKAGE_PIN AU4 [get_ports {DB0_GPIO[10]}]
|
||||
set_property PACKAGE_PIN AU3 [get_ports {DB0_GPIO[11]}]
|
||||
set_property PACKAGE_PIN AT5 [get_ports {DB0_GPIO[12]}]
|
||||
set_property PACKAGE_PIN AU5 [get_ports {DB0_GPIO[13]}]
|
||||
set_property PACKAGE_PIN AT7 [get_ports {DB0_GPIO[14]}]
|
||||
set_property PACKAGE_PIN AT6 [get_ports {DB0_GPIO[15]}]
|
||||
set_property PACKAGE_PIN AU8 [get_ports {DB0_GPIO[16]}]
|
||||
set_property PACKAGE_PIN AV8 [get_ports {DB0_GPIO[17]}]
|
||||
set_property PACKAGE_PIN AU7 [get_ports {DB0_GPIO[18]}]
|
||||
set_property PACKAGE_PIN AV7 [get_ports {DB0_GPIO[19]}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB0_GPIO[*]}]
|
||||
set_property PULLDOWN TRUE [get_ports {DB0_GPIO[*]}]
|
||||
set_property IOB TRUE [get_ports {DB0_GPIO[*]}]
|
||||
|
||||
set_property PACKAGE_PIN AP5 [get_ports {DB0_SYNTH_SYNC}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB0_SYNTH_SYNC}]
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
#
|
||||
# Copyright 2022 Ettus Research, a National Instruments Brand
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
#
|
||||
# Description:
|
||||
# DB GPIO pin constraints for X410.
|
||||
#
|
||||
|
||||
###############################################################################
|
||||
# Pin constraints for the other PL pins (1.8 V)
|
||||
###############################################################################
|
||||
set_property PACKAGE_PIN F6 [get_ports {DB1_GPIO[0]}]
|
||||
set_property PACKAGE_PIN E6 [get_ports {DB1_GPIO[1]}]
|
||||
set_property PACKAGE_PIN E9 [get_ports {DB1_GPIO[2]}]
|
||||
set_property PACKAGE_PIN E8 [get_ports {DB1_GPIO[3]}]
|
||||
set_property PACKAGE_PIN E7 [get_ports {DB1_GPIO[4]}]
|
||||
set_property PACKAGE_PIN D6 [get_ports {DB1_GPIO[5]}]
|
||||
set_property PACKAGE_PIN D10 [get_ports {DB1_GPIO[6]}]
|
||||
set_property PACKAGE_PIN C10 [get_ports {DB1_GPIO[7]}]
|
||||
set_property PACKAGE_PIN C8 [get_ports {DB1_GPIO[8]}]
|
||||
set_property PACKAGE_PIN C7 [get_ports {DB1_GPIO[9]}]
|
||||
set_property PACKAGE_PIN D9 [get_ports {DB1_GPIO[10]}]
|
||||
set_property PACKAGE_PIN D8 [get_ports {DB1_GPIO[11]}]
|
||||
set_property PACKAGE_PIN B8 [get_ports {DB1_GPIO[12]}]
|
||||
set_property PACKAGE_PIN B7 [get_ports {DB1_GPIO[13]}]
|
||||
set_property PACKAGE_PIN B10 [get_ports {DB1_GPIO[14]}]
|
||||
set_property PACKAGE_PIN B9 [get_ports {DB1_GPIO[15]}]
|
||||
set_property PACKAGE_PIN C6 [get_ports {DB1_GPIO[16]}]
|
||||
set_property PACKAGE_PIN C5 [get_ports {DB1_GPIO[17]}]
|
||||
set_property PACKAGE_PIN B5 [get_ports {DB1_GPIO[18]}]
|
||||
set_property PACKAGE_PIN A5 [get_ports {DB1_GPIO[19]}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB1_GPIO[*]}]
|
||||
set_property PULLDOWN TRUE [get_ports {DB1_GPIO[*]}]
|
||||
set_property IOB TRUE [get_ports {DB1_GPIO[*]}]
|
||||
|
||||
set_property PACKAGE_PIN AW6 [get_ports {DB0_GPIO[0]}]
|
||||
set_property PACKAGE_PIN AW5 [get_ports {DB0_GPIO[1]}]
|
||||
set_property PACKAGE_PIN AW4 [get_ports {DB0_GPIO[2]}]
|
||||
set_property PACKAGE_PIN AW3 [get_ports {DB0_GPIO[3]}]
|
||||
set_property PACKAGE_PIN AV3 [get_ports {DB0_GPIO[4]}]
|
||||
set_property PACKAGE_PIN AV2 [get_ports {DB0_GPIO[5]}]
|
||||
set_property PACKAGE_PIN AU2 [get_ports {DB0_GPIO[6]}]
|
||||
set_property PACKAGE_PIN AU1 [get_ports {DB0_GPIO[7]}]
|
||||
set_property PACKAGE_PIN AV6 [get_ports {DB0_GPIO[8]}]
|
||||
set_property PACKAGE_PIN AV5 [get_ports {DB0_GPIO[9]}]
|
||||
set_property PACKAGE_PIN AU4 [get_ports {DB0_GPIO[10]}]
|
||||
set_property PACKAGE_PIN AU3 [get_ports {DB0_GPIO[11]}]
|
||||
set_property PACKAGE_PIN AT5 [get_ports {DB0_GPIO[12]}]
|
||||
set_property PACKAGE_PIN AU5 [get_ports {DB0_GPIO[13]}]
|
||||
set_property PACKAGE_PIN AT7 [get_ports {DB0_GPIO[14]}]
|
||||
set_property PACKAGE_PIN AT6 [get_ports {DB0_GPIO[15]}]
|
||||
set_property PACKAGE_PIN AU8 [get_ports {DB0_GPIO[16]}]
|
||||
set_property PACKAGE_PIN AV8 [get_ports {DB0_GPIO[17]}]
|
||||
set_property PACKAGE_PIN AU7 [get_ports {DB0_GPIO[18]}]
|
||||
set_property PACKAGE_PIN AV7 [get_ports {DB0_GPIO[19]}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {DB0_GPIO[*]}]
|
||||
set_property PULLDOWN TRUE [get_ports {DB0_GPIO[*]}]
|
||||
set_property IOB TRUE [get_ports {DB0_GPIO[*]}]
|
||||
@@ -16,12 +16,6 @@
|
||||
set ref_clk_period 40.00
|
||||
create_clock -name ref_clk -period $ref_clk_period [get_ports BASE_REFCLK_FPGA_P]
|
||||
|
||||
# PLL Reference Clock. Used to derive data clocks.
|
||||
# Constrain to the fastest possible clock rate supported in the driver.
|
||||
# MPM supports 61.44 / 62.5 / 64.0 MHz.
|
||||
set pll_ref_clk_period 15.625
|
||||
create_clock -name pll_ref_clk -period $pll_ref_clk_period [get_ports PLL_REFCLK_FPGA_P]
|
||||
|
||||
# MGT Clocks
|
||||
# Clock Reference | Frequency | Purpose
|
||||
# MGT_REFCLK_LMK0 | 156.25/125 MHz | 10 GbE
|
||||
@@ -69,22 +63,11 @@ set synth_sync_ports [get_ports {DB0_SYNTH_SYNC DB1_SYNTH_SYNC}]
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -min -$synth_sync_hold_requirement $synth_sync_ports
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -max $synth_sync_setup_requirement $synth_sync_ports
|
||||
|
||||
|
||||
###############################################################################
|
||||
# SPI to MB CPLD (PL)
|
||||
# This interface is defined as system synchronous to pll_ref_clk.
|
||||
###############################################################################
|
||||
|
||||
# The output delays are chosen to allow a large time window of valid data for
|
||||
# the MB CPLD logic.
|
||||
set spi_min_out_delay 0.000
|
||||
set spi_max_out_delay 11.000
|
||||
|
||||
# Set output constraints for all ports.
|
||||
set spi_out_ports [get_ports {PL_CPLD_SCLK PL_CPLD_MOSI PL_CPLD_CS0_n PL_CPLD_CS1_n}]
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -min $spi_min_out_delay $spi_out_ports
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -max $spi_max_out_delay $spi_out_ports
|
||||
|
||||
# Both CPLD and FPGA use PLL reference clock from a common clock chip.
|
||||
# The traces from that clock chip to the ICs are not length matched. Assume a
|
||||
# worst case clock difference of 0.5 ns at the IC inputs. There is no direction
|
||||
@@ -249,93 +232,6 @@ set_output_delay -clock ref_clk -max $lmk_sync_output_max_delay [get_ports {LMK_
|
||||
set_output_delay -clock ref_clk -min $lmk_sync_output_min_delay [get_ports {LMK_SYNC}]
|
||||
|
||||
|
||||
###############################################################################
|
||||
# SPLL SYSREF Capture
|
||||
###############################################################################
|
||||
|
||||
# SYSREF is generated by the LMK04832 clocking chip (SPLL), which also produces
|
||||
# the PLL reference clock (PRC) used to generate data clocks with a MMCM. Both
|
||||
# SYSREF and PLL reference clock are directly fed into the RFSoC.
|
||||
# SYSREF is captured by the FPGA fabric in the PRC clock domain (MMCM's PRC
|
||||
# output) with a double synchronizer and then transfered to the RFDC clock
|
||||
# domain. Both SYSREF versions (PRC and RFDC) are used by downstream logic for
|
||||
# sync. purposes.
|
||||
# SYSREF is a continuous signal running at PRC freq. / 25, and it is
|
||||
# intentionally shifted in the LMK chip to align it closer to the
|
||||
# PRC's falling edge.
|
||||
# The added delay follows the formula:
|
||||
# SYSREF LMK delay = 22 * sample clock period
|
||||
# The highest sampling frequency supported in MPM (3.072 GHz) is used for
|
||||
# timing constrains. Therefore, SYSREF LMK's delay = 22 * (1 / 3.072e9).
|
||||
set sysref_lmk_delay 7.161
|
||||
#
|
||||
# These are the signals' lengths and corresponding delays (assuming 170 ps/in):
|
||||
# - SYSREF --> 5794 mils (5.794 inches) = 0.985 ns
|
||||
# - PRC --> 5668 mils (5.668 inches) = 0.964 ns
|
||||
#
|
||||
# For min/max input delay calculations, it is assumed min prop. delay of 0 ns,
|
||||
# which essentially over-constrains SYSREF.
|
||||
#
|
||||
# The max input delay is the latest that SYSREF may arrive w.r.t PRC, and it is
|
||||
# calculated as follows:
|
||||
# Input delay (max) = SYSREF's LMK delay + SYSREF prop. delay (max)
|
||||
# - PRC prop. delay (min)
|
||||
set sysref_max_input_delay [expr {$sysref_lmk_delay + 0.985 - 0}]
|
||||
#
|
||||
# The min input delay is the earliest that SYSREF may arrive w.r.t PRC, and it
|
||||
# is calculated as follows:
|
||||
# Input delay (min) = SYSREF's LMK delay + SYSREF prop. delay (min)
|
||||
# - PRC prop. delay (min)
|
||||
set sysref_min_input_delay [expr {$sysref_lmk_delay + 0 - 0.964}]
|
||||
|
||||
set_input_delay -clock pll_ref_clk -max $sysref_max_input_delay [get_ports {SYSREF_FABRIC_P}]
|
||||
set_input_delay -clock pll_ref_clk -min $sysref_min_input_delay [get_ports {SYSREF_FABRIC_P}]
|
||||
|
||||
|
||||
###############################################################################
|
||||
# DB GPIO
|
||||
# This interface is defined as system synchronous to pll_ref_clk.
|
||||
# Some timing constants in this section are declared in
|
||||
# <repo>/fpga/usrp3/top/x400/constraints/timing/shared_constants.sdc
|
||||
###############################################################################
|
||||
|
||||
# Set output constraints for all ports.
|
||||
set db_gpio_ports [get_ports {DB0_GPIO[*] DB1_GPIO[*]}]
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -min $db_gpio_fpga_min_out $db_gpio_ports
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -max $db_gpio_fpga_max_out $db_gpio_ports
|
||||
|
||||
# Output enable signal is available one clock cycle ahead of valid data, this
|
||||
# enables the use of multi-cycle paths.
|
||||
set db_gpio_out_en_regs [get_cells -hierarchical -filter \
|
||||
{PRIMITIVE_TYPE =~ REGISTER.*.* && NAME =~ "*bytestream_output_enable*"}]
|
||||
set_multicycle_path 2 -setup -from $db_gpio_out_en_regs -to $db_gpio_ports
|
||||
set_multicycle_path 1 -hold -from $db_gpio_out_en_regs -to $db_gpio_ports
|
||||
|
||||
# Calculate output delays back from capturing edge, add board delay and clock
|
||||
# difference.
|
||||
# Assume worst case as data being generated late and receiving an early clock:
|
||||
# - Max CPLD TCO
|
||||
# - Max data propagation delay
|
||||
# - Max CPLD clock propagation delay and minimum FPGA clock propagation delay
|
||||
# - Maximum delay from MC100EPT23 clock buffer
|
||||
set_input_delay -clock pll_ref_clk \
|
||||
-max [expr {$pll_ref_clk_period - $db_gpio_cpld_max_out + $db_gpio_board_max_delay \
|
||||
+ $db_cpld_prc_clock_prop_max - $fpga_prc_clock_prop_min + $clock_translate_max}] \
|
||||
$db_gpio_ports
|
||||
|
||||
# Negate minimum output delay as it is defined from the change to the start
|
||||
# clock edge.
|
||||
# Assume worst case as data being generated early and receiving an late clock:
|
||||
# - Min CPLD TCO
|
||||
# - Min data propagation delay (0)
|
||||
# - Min CPLD clock propagation delay and max FPGA clock propagation delay
|
||||
set_input_delay -clock pll_ref_clk \
|
||||
-min [expr {- $db_gpio_cpld_min_out \
|
||||
- $db_gpio_board_min_delay \
|
||||
- $db_cpld_prc_clock_prop_min + $fpga_prc_clock_prop_max}] \
|
||||
$db_gpio_ports
|
||||
|
||||
|
||||
###############################################################################
|
||||
# x4xx_ps_rfdc_bd
|
||||
###############################################################################
|
||||
@@ -350,32 +246,6 @@ set gpio_regs [get_pins -of [get_cells -filter {IS_SEQUENTIAL && NAME =~ *rfdc/c
|
||||
set mux_regs [get_cells -hier -filter {IS_SEQUENTIAL && NAME =~ *rfdc/calibration_muxes/gpio_to_axis_mux*}]
|
||||
set_false_path -from $gpio_regs -to $mux_regs
|
||||
|
||||
# This property tells Vivado that we require these clocks to be well aligned.
|
||||
# We have synchronous clock domain crossings between these clocks that can have
|
||||
# large hold violations after placement due to uneven clock loading.
|
||||
set_property CLOCK_DELAY_GROUP DataClkGroup [get_nets -hier -filter {\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/data_clk ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/data_clk_2x ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/pll_ref_clk_out ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/rfdc_clk_2x ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/rfdc_clk \
|
||||
}]
|
||||
|
||||
# We treat rfdc_clk and data_clk buffers as asynchronous, with knowledge that
|
||||
# code clocked in this domain will be reset after this clocked is enabled. This
|
||||
# will make timing easier to meet on these clock domains.
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableRfdcBufg1x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/rf_clock_buffers/rfdc_clk_1x_buf/*BUFGCE*/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableRfdcBufg2x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/rf_clock_buffers/rfdc_clk_2x_buf/*BUFGCE*/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableDataBufg1x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*DataClk1xSafeBufg/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableDataBufg2x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*DataClk2xSafeBufg/CE}]
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Misc Constraints
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
#
|
||||
# Copyright 2022 Ettus Research, a National Instruments Brand
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
#
|
||||
# Description:
|
||||
# Timing constraints exclusive to X410. These should be used
|
||||
# in conjunction with ./common.xdc
|
||||
#
|
||||
|
||||
###############################################################################
|
||||
# DB GPIO
|
||||
# This interface is defined as system synchronous to pll_ref_clk.
|
||||
# Some timing constants in this section are declared in
|
||||
# <repo>/fpga/usrp3/top/x400/constraints/timing/shared_constants.sdc
|
||||
###############################################################################
|
||||
|
||||
# Set output constraints for all ports.
|
||||
set db_gpio_ports [get_ports {DB0_GPIO[*] DB1_GPIO[*]}]
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -min $db_gpio_fpga_min_out $db_gpio_ports
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -max $db_gpio_fpga_max_out $db_gpio_ports
|
||||
|
||||
# Output enable signal is available one clock cycle ahead of valid data, this
|
||||
# enables the use of multi-cycle paths.
|
||||
set db_gpio_out_en_regs [get_cells -hierarchical -filter \
|
||||
{PRIMITIVE_TYPE =~ REGISTER.*.* && NAME =~ "*bytestream_output_enable*"}]
|
||||
set_multicycle_path 2 -setup -from $db_gpio_out_en_regs -to $db_gpio_ports
|
||||
set_multicycle_path 1 -hold -from $db_gpio_out_en_regs -to $db_gpio_ports
|
||||
|
||||
# Calculate output delays back from capturing edge, add board delay and clock
|
||||
# difference.
|
||||
# Assume worst case as data being generated late and receiving an early clock:
|
||||
# - Max CPLD TCO
|
||||
# - Max data propagation delay
|
||||
# - Max CPLD clock propagation delay and minimum FPGA clock propagation delay
|
||||
# - Maximum delay from MC100EPT23 clock buffer
|
||||
set_input_delay -clock pll_ref_clk \
|
||||
-max [expr {$pll_ref_clk_period - $db_gpio_cpld_max_out + $db_gpio_board_max_delay \
|
||||
+ $db_cpld_prc_clock_prop_max - $fpga_prc_clock_prop_min + $clock_translate_max}] \
|
||||
$db_gpio_ports
|
||||
|
||||
# Negate minimum output delay as it is defined from the change to the start
|
||||
# clock edge.
|
||||
# Assume worst case as data being generated early and receiving an late clock:
|
||||
# - Min CPLD TCO
|
||||
# - Min data propagation delay (0)
|
||||
# - Min CPLD clock propagation delay and max FPGA clock propagation delay
|
||||
set_input_delay -clock pll_ref_clk \
|
||||
-min [expr {- $db_gpio_cpld_min_out \
|
||||
- $db_gpio_board_min_delay \
|
||||
- $db_cpld_prc_clock_prop_min + $fpga_prc_clock_prop_max}] \
|
||||
$db_gpio_ports
|
||||
|
||||
|
||||
###############################################################################
|
||||
# x410_ps_rfdc_bd
|
||||
###############################################################################
|
||||
|
||||
# This property tells Vivado that we require these clocks to be well aligned.
|
||||
# We have synchronous clock domain crossings between these clocks that can have
|
||||
# large hold violations after placement due to uneven clock loading.
|
||||
set_property CLOCK_DELAY_GROUP DataClkGroup [get_nets -hier -filter {\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/data_clk ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/data_clk_2x ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/pll_ref_clk_out ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/rfdc_clk_2x ||\
|
||||
NAME=~*/rfdc/data_clock_mmcm/inst/CLK_CORE_DRP_I/clk_inst/rfdc_clk \
|
||||
}]
|
||||
|
||||
# We treat rfdc_clk and data_clk buffers as asynchronous, with knowledge that
|
||||
# code clocked in this domain will be reset after this clocked is enabled. This
|
||||
# will make timing easier to meet on these clock domains.
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableRfdcBufg1x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/rf_clock_buffers/rfdc_clk_1x_buf/*BUFGCE*/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableRfdcBufg2x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/rf_clock_buffers/rfdc_clk_2x_buf/*BUFGCE*/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableDataBufg1x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*DataClk1xSafeBufg/CE}]
|
||||
|
||||
set_false_path -from [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*rEnableDataBufg2x*/C}] \
|
||||
-to [get_pins -hierarchical -filter {NAME =~ */rfdc/clock_gates_0/*DataClk2xSafeBufg/CE}]
|
||||
|
||||
|
||||
###############################################################################
|
||||
# SPLL SYSREF Capture
|
||||
###############################################################################
|
||||
|
||||
# SYSREF is generated by the LMK04832 clocking chip (SPLL), which also produces
|
||||
# the PLL reference clock (PRC) used to generate data clocks with a MMCM. Both
|
||||
# SYSREF and PLL reference clock are directly fed into the RFSoC.
|
||||
# SYSREF is captured by the FPGA fabric in the PRC clock domain (MMCM's PRC
|
||||
# output) with a double synchronizer and then transfered to the RFDC clock
|
||||
# domain. Both SYSREF versions (PRC and RFDC) are used by downstream logic for
|
||||
# sync. purposes.
|
||||
# SYSREF is a continuous signal running at PRC freq. / 25, and it is
|
||||
# intentionally shifted in the LMK chip to align it closer to the
|
||||
# PRC's falling edge.
|
||||
# The added delay follows the formula:
|
||||
# SYSREF LMK delay = 22 * sample clock period
|
||||
# The highest sampling frequency supported in MPM (3.072 GHz) is used for
|
||||
# timing constraints. Therefore, SYSREF LMK's delay = 22 * (1 / 3.072e9).
|
||||
set sysref_lmk_delay 7.161
|
||||
#
|
||||
# These are the signals' lengths and corresponding delays (assuming 170 ps/in):
|
||||
# - SYSREF --> 5794 mils (5.794 inches) = 0.985 ns
|
||||
# - PRC --> 5668 mils (5.668 inches) = 0.964 ns
|
||||
#
|
||||
# For min/max input delay calculations, it is assumed min prop. delay of 0 ns,
|
||||
# which essentially over-constrains SYSREF.
|
||||
#
|
||||
# The max input delay is the latest that SYSREF may arrive w.r.t PRC, and it is
|
||||
# calculated as follows:
|
||||
# Input delay (max) = SYSREF's LMK delay + SYSREF prop. delay (max)
|
||||
# - PRC prop. delay (min)
|
||||
set sysref_max_input_delay [expr {$sysref_lmk_delay + 0.985 - 0}]
|
||||
#
|
||||
# The min input delay is the earliest that SYSREF may arrive w.r.t PRC, and it
|
||||
# is calculated as follows:
|
||||
# Input delay (min) = SYSREF's LMK delay + SYSREF prop. delay (min)
|
||||
# - PRC prop. delay (min)
|
||||
set sysref_min_input_delay [expr {$sysref_lmk_delay + 0 - 0.964}]
|
||||
|
||||
set_input_delay -clock pll_ref_clk -max $sysref_max_input_delay [get_ports {SYSREF_FABRIC_P}]
|
||||
set_input_delay -clock pll_ref_clk -min $sysref_min_input_delay [get_ports {SYSREF_FABRIC_P}]
|
||||
|
||||
###############################################################################
|
||||
# SPI to MB CPLD (PL)
|
||||
# This interface is defined as system synchronous to pll_ref_clk.
|
||||
###############################################################################
|
||||
|
||||
# The output delays are chosen to allow a large time window of valid data for
|
||||
# the MB CPLD logic.
|
||||
set spi_min_out_delay 0.000
|
||||
set spi_max_out_delay 11.000
|
||||
|
||||
# Set output constraints for all ports.
|
||||
set spi_out_ports [get_ports {PL_CPLD_SCLK PL_CPLD_MOSI PL_CPLD_CS0_n PL_CPLD_CS1_n}]
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -min $spi_min_out_delay $spi_out_ports
|
||||
set_output_delay -clock [get_clocks pll_ref_clk] -max $spi_max_out_delay $spi_out_ports
|
||||
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# Copyright 2022 Ettus Research, a National Instruments Brand
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
#
|
||||
# Description:
|
||||
# Clock definition constraints for X410
|
||||
#
|
||||
|
||||
###############################################################################
|
||||
# Motherboard Clocks
|
||||
###############################################################################
|
||||
|
||||
# PLL Reference Clock. Used to derive data clocks.
|
||||
# Constrain to the fastest possible clock rate supported in the driver.
|
||||
# MPM supports 61.44 / 62.5 / 64.0 MHz.
|
||||
set pll_ref_clk_period 15.625
|
||||
create_clock -name pll_ref_clk -period $pll_ref_clk_period [get_ports PLL_REFCLK_FPGA_P]
|
||||
Reference in New Issue
Block a user