aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/n3xx/n3xx_wr.xdc
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/n3xx/n3xx_wr.xdc')
-rw-r--r--fpga/usrp3/top/n3xx/n3xx_wr.xdc78
1 files changed, 78 insertions, 0 deletions
diff --git a/fpga/usrp3/top/n3xx/n3xx_wr.xdc b/fpga/usrp3/top/n3xx/n3xx_wr.xdc
new file mode 100644
index 000000000..2b69c9ead
--- /dev/null
+++ b/fpga/usrp3/top/n3xx/n3xx_wr.xdc
@@ -0,0 +1,78 @@
+#
+# Copyright 2018 Ettus Research, A National Instruments Company
+# SPDX-License-Identifier: LGPL-3.0
+#
+
+
+# 20 MHz White Rabbit reference
+create_clock -name wr_refclk -period 50.000 [get_ports WB_20MHZ_P]
+
+# 62.5M TXOUTCLK from the MGT that does most of the heavy lifting
+create_clock -name wr_txoutclk -period 16.000 \
+ [get_pins -hierarchical -filter \
+ {NAME=~sfp_wrapper_0/*/cmp_xwrc_platform/gen_phy_kintex7.cmp_gtx/U_GTX_INST/gtxe2_i/TXOUTCLK}]
+
+# 62.5M RXOUTCLK from the MGT that doesn't do as much as the TXOUTCLK
+create_clock -name wr_rxoutclk -period 16.000 \
+ [get_pins -hierarchical -filter \
+ {NAME=~sfp_wrapper_0/*/cmp_xwrc_platform/gen_phy_kintex7.cmp_gtx/U_GTX_INST/gtxe2_i/RXOUTCLK}]
+
+# Rename the WR 62.5M system clock
+create_generated_clock -name wr_sysclk \
+ [get_pins -hierarchical -filter {NAME=~sfp_wrapper_0/*/cmp_xwrc_platform/gen_default_plls.gen_kintex7_default_plls.cmp_sys_clk_pll/CLKOUT0}]
+
+# Rename the WR ~62.5M DMTD clock
+create_generated_clock -name wr_dmtdclk \
+ [get_pins -hierarchical -filter {NAME=~sfp_wrapper_0/*/cmp_xwrc_platform/gen_default_plls.gen_kintex7_default_plls.cmp_dmtd_clk_pll/CLKOUT0}]
+
+
+
+# Clock Interaction Matrix : ------------------------------------------------------------
+# Everything is basically async to everything else, except for the net_clk group.
+# Blanks mean there are no paths there (in the WR v4.2 build).
+#
+# The wr_sysclk (62.5 MHz) is derived from the 125 MHz MGT Reference clock (NETCLK).
+# On the other hand, the wr_dmtdclk, also a 62.5 MHz clock, is derived from the 20 MHz
+# WR VCXO. This two clock groups could be considered asynchronous due to its different
+# source and different MMCM primitive (which unrelates them even more).
+#
+# | wr_RXOUTCLK | wr_TXOUTCLK | wr_dmtdclk | wr_sysclk | net_clk
+# wr_RXOUTCLK | timed | async | async | async |
+# wr_TXOUTCLK | async | timed | async | async |
+# wr_dmtdclk | | | timed | async |
+# wr_sysclk | async | async | async | timed | timed
+# net_clk | async | | | timed | timed
+
+set_clock_groups -asynchronous -group [get_clocks wr_rxoutclk] \
+ -group [get_clocks wr_txoutclk] \
+ -group [get_clocks wr_dmtdclk] \
+ -group [get_clocks net_clk]
+
+set_clock_groups -asynchronous -group [get_clocks wr_sysclk] \
+ -group [get_clocks wr_txoutclk] \
+ -group [get_clocks wr_rxoutclk] \
+ -group [get_clocks wr_dmtdclk]
+
+# Safe paths : --------------------------------------------------------------------------
+# There is a mix of safe and unknown clock interactions between wr_sysclk and wr_dmtdclk.
+# The safe crossings refer to those using a synchronizer structure; and to avoid
+# failing timing on those paths, we ignore them (i.e. false paths), and allow the tools
+# to time the rest.
+#
+# The WR IP uses easily identifiable single-bit synchronizers to transfer strobes from
+# the wr_dmtdclk to the wr_sysclk domain.
+#
+# Commenting out command since the asynchronous groups were updated and paths ignored.
+# set_false_path -from [get_clocks wr_dmtdclk] \
+# -to [get_pins -hierarchical -filter {NAME =~ */sync_posedge.sync0_reg/D}]
+#
+#
+# The tags generated by the DDMTD (wr_dmtdclk domain) are deglitched before being output
+# to the upstream logic in the wr_sysclk domain. Thus, a safe multi-bit crossing is
+# expected between these two domains, and we tell the tools to ignore those paths.
+# See usrp3/lib/white_rabbit/wr_cores_v4_2/modules/timing/dmtd_with_deglitcher.vhd for
+# implementation details.
+#
+# Commenting out command since the asynchronous groups were updated and paths ignored.
+# set_false_path -from [get_clocks wr_dmtdclk] \
+# -to [get_pins -hierarchical -filter {NAME =~ */U_Wrapped_Softpll/tags_masked_reg*/D}]