aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/n3xx/mb_timing.xdc
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/n3xx/mb_timing.xdc')
-rw-r--r--fpga/usrp3/top/n3xx/mb_timing.xdc111
1 files changed, 111 insertions, 0 deletions
diff --git a/fpga/usrp3/top/n3xx/mb_timing.xdc b/fpga/usrp3/top/n3xx/mb_timing.xdc
new file mode 100644
index 000000000..6aa3f8132
--- /dev/null
+++ b/fpga/usrp3/top/n3xx/mb_timing.xdc
@@ -0,0 +1,111 @@
+#
+# Copyright 2017 Ettus Research, A National Instruments Company
+# SPDX-License-Identifier: LGPL-3.0
+#
+# Timing analysis is performed in "/n3xx/doc/mb_timing.xlsx". See
+# the spreadsheet for more details and explanations.
+
+#*******************************************************************************
+## Asynchronous clock groups
+
+# All the clocks from the PS are async to everything else except clocks generated
+# from themselves.
+set_clock_groups -asynchronous -group [get_clocks clk100 -include_generated_clocks]
+set_clock_groups -asynchronous -group [get_clocks clk40 -include_generated_clocks]
+set_clock_groups -asynchronous -group [get_clocks bus_clk -include_generated_clocks]
+set_clock_groups -asynchronous -group [get_clocks meas_clk_ref -include_generated_clocks]
+
+
+
+#*******************************************************************************
+## PPS Input Timing
+
+# The external PPS is synchronous to the external reference clock, which is expected to
+# be at 10 MHz. Given [setup, hold] of [5ns, 5ns] at the rear panel inputs of the N310,
+# we have an adequate data valid window at the FPGA. However, since we overconstrain the
+# reference clock to 25 MHz, we use the alternative period here for setup analysis.
+set_input_delay -clock ref_clk -min 4.651 [get_ports REF_1PPS_IN]
+set_input_delay -clock ref_clk -max [expr {$REF_CLK_PERIOD - 0.235}] [get_ports REF_1PPS_IN]
+
+# The GPS PPS is also synchronous to the external reference clock (since there is a
+# switch on the clock input outside the FPGA). Again, use the overconstrained period.
+set_input_delay -clock ref_clk -min 1.234 [get_ports GPS_1PPS]
+set_input_delay -clock ref_clk -max [expr {$REF_CLK_PERIOD - 2.111}] [get_ports GPS_1PPS]
+
+
+
+#*******************************************************************************
+## White Rabbit DAC
+# Constrain the DIN and NSYNC bits around the clock output. No readback.
+
+set MAX_SKEW 5
+set SETUP_SKEW [expr {($MAX_SKEW / 2)-0.5}]
+set HOLD_SKEW [expr {($MAX_SKEW / 2)+0.5}]
+set PORT_LIST [get_ports {WB_DAC_DIN WB_DAC_NCLR WB_DAC_NSYNC WB_DAC_NLDAC}]
+# Then add the output delay on each of the ports.
+set_output_delay -clock [get_clocks wr_bus_clk] -max -$SETUP_SKEW $PORT_LIST
+set_output_delay -add_delay -clock_fall -clock [get_clocks wr_bus_clk] -max -$SETUP_SKEW $PORT_LIST
+set_output_delay -clock [get_clocks wr_bus_clk] -min $HOLD_SKEW $PORT_LIST
+set_output_delay -add_delay -clock_fall -clock [get_clocks wr_bus_clk] -min $HOLD_SKEW $PORT_LIST
+# Finally, make both the setup and hold checks use the same launching and latching edges.
+set_multicycle_path -setup -to [get_clocks wr_bus_clk] -start 0
+set_multicycle_path -hold -to [get_clocks wr_bus_clk] -1
+# Remove analysis from the output "clock" pin. There are ways to do this using TCL, but
+# they aren't supported in XDC files... so we do it the old fashioned way.
+set_output_delay -clock [get_clocks async_out_clk] 0.000 $WR_OUT_CLK
+set_max_delay -to $WR_OUT_CLK 50.000
+set_min_delay -to $WR_OUT_CLK 0.000
+
+
+
+#*******************************************************************************
+## MB Async Ins/Outs
+
+set ASYNC_MB_INPUTS [get_ports {SFP_*_LOS SFP_*_TXFAULT UNUSED_PIN_TDC*}]
+
+set_input_delay -clock [get_clocks async_in_clk] 0.000 $ASYNC_MB_INPUTS
+set_max_delay -from $ASYNC_MB_INPUTS 50.000
+set_min_delay -from $ASYNC_MB_INPUTS 0.000
+
+
+set ASYNC_MB_OUTPUTS [get_ports {*LED* SFP_*TXDISABLE UNUSED_PIN_TDC* \
+ FPGA_TEST[*]}]
+
+set_output_delay -clock [get_clocks async_out_clk] 0.000 $ASYNC_MB_OUTPUTS
+set_max_delay -to $ASYNC_MB_OUTPUTS 50.000
+set_min_delay -to $ASYNC_MB_OUTPUTS 0.000
+
+
+
+#*******************************************************************************
+## Front Panel GPIO
+# These bits are driven from the DB-A radio clock. Although they are received async in
+# the outside world, they should be constrained in the FPGA to avoid any race
+# conditions. The best way to do this is a skew constraint across all the bits.
+
+set MAX_SKEW 10
+set SETUP_SKEW [expr {($MAX_SKEW / 2)-0.5}]
+set HOLD_SKEW [expr {($MAX_SKEW / 2)+0.5}]
+set PORT_LIST [get_ports {FPGA_GPIO[*]}]
+# Then add the output delay on each of the ports.
+set_output_delay -clock [get_clocks fp_gpio_bus_clk] -max -$SETUP_SKEW $PORT_LIST
+set_output_delay -add_delay -clock_fall -clock [get_clocks fp_gpio_bus_clk] -max -$SETUP_SKEW $PORT_LIST
+set_output_delay -clock [get_clocks fp_gpio_bus_clk] -min $HOLD_SKEW $PORT_LIST
+set_output_delay -add_delay -clock_fall -clock [get_clocks fp_gpio_bus_clk] -min $HOLD_SKEW $PORT_LIST
+# Finally, make both the setup and hold checks use the same launching and latching edges.
+set_multicycle_path -setup -to [get_clocks fp_gpio_bus_clk] -start 0
+set_multicycle_path -hold -to [get_clocks fp_gpio_bus_clk] -1
+# Remove analysis from the output "clock" pin. There are ways to do this using TCL, but
+# they aren't supported in XDC files... so we do it the old fashioned way.
+set_output_delay -clock [get_clocks async_out_clk] 0.000 $FP_GPIO_CLK
+set_max_delay -to $FP_GPIO_CLK 50.000
+set_min_delay -to $FP_GPIO_CLK 0.000
+# All inputs on this interface are async.
+set_input_delay -clock [get_clocks async_in_clk] 0.000 $PORT_LIST
+set_max_delay -from $PORT_LIST 50.000
+set_min_delay -from $PORT_LIST 0.000
+
+#******************************************************************************
+## Reset Sync False Path
+set_false_path -to [get_pins */synchronizer_false_path/stages[0].value_reg[0]/D]
+set_false_path -to [get_pins */synchronizer_false_path/stages[0].value_reg[0]/C]