1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
|
#
# Copyright 2018 Ettus Research, A National Instruments Company
# SPDX-License-Identifier: LGPL-3.0
#
# Description: Timing constraints for the USRP E320
#
###############################################################################
# Input Clocks
###############################################################################
# External Reference Clock
set REF_CLK_PERIOD 50.00
create_clock -name ref_clk -period $REF_CLK_PERIOD [get_ports CLK_REF_RAW]
# Radio clock from AD9361
set rx_clk_period 8.138
create_clock -name rx_clk -period $rx_clk_period [get_ports RX_CLK_P]
# 1 Gigabit Ethernet Reference Clock
create_clock -name ge_clk -period 8.000 [get_ports CLK_MGT_125M_P]
# 10 Gigabit and Aurora Reference Clock
create_clock -name xge_clk -period 6.400 [get_ports CLK_MGT_156_25M_P]
# Derived radio clocks (two mutually-exclusive clocks using a BUFGMUX)
create_generated_clock -name radio_clk_1x \
-divide_by 4 \
-add \
-master_clock rx_clk \
-source [get_pins cat_io_lvds_dual_mode_i0/cat_io_lvds_i0/cat_input_lvds_i0/sdr_clk_2x_bufr/O] \
[get_pins cat_io_lvds_dual_mode_i0/BUFGCTRL_radio_clk/O]
create_generated_clock -name radio_clk_2x \
-divide_by 2 \
-add \
-master_clock rx_clk \
-source [get_pins cat_io_lvds_dual_mode_i0/cat_io_lvds_i0/cat_input_lvds_i0/sdr_clk_bufr/O] \
[get_pins cat_io_lvds_dual_mode_i0/BUFGCTRL_radio_clk/O]
set_clock_groups -physically_exclusive -group radio_clk_1x -group radio_clk_2x
###############################################################################
# Rename Clocks
###############################################################################
create_clock -name clk100 \
-period [get_property PERIOD [get_clocks clk_fpga_0]] \
[get_pins [get_property SOURCE_PINS [get_clocks clk_fpga_0]]]
set_input_jitter clk100 0.3
create_clock -name clk40 \
-period [get_property PERIOD [get_clocks clk_fpga_1]] \
[get_pins [get_property SOURCE_PINS [get_clocks clk_fpga_1]]]
set_input_jitter clk40 0.75
create_clock -name meas_clk_ref \
-period [get_property PERIOD [get_clocks clk_fpga_2]] \
[get_pins [get_property SOURCE_PINS [get_clocks clk_fpga_2]]]
set_input_jitter meas_clk_ref 0.18
create_clock -name bus_clk \
-period [get_property PERIOD [get_clocks clk_fpga_3]] \
[get_pins [get_property SOURCE_PINS [get_clocks clk_fpga_3]]]
set_input_jitter bus_clk 0.15
# DMA Clock
create_generated_clock -name ddr3_dma_clk \
[get_pins {e320_clocking_i/mmcm_adv_inst/CLKOUT0}]
###############################################################################
# Clock Crossings
###############################################################################
set DDR3_UI_CLK_PERIOD [get_property period [get_clocks ddr3_ui_clk]]
set RADIO_CLK_1X_PERIOD [get_property period [get_clocks radio_clk_1x]]
set RADIO_CLK_2X_PERIOD [get_property period [get_clocks radio_clk_2x]]
set XGE_CLK_PERIOD [get_property period [get_clocks xge_clk]]
# XADC temperature
set_max_delay -from [get_pins tempmon_i/device_temp_r_reg[*]/C] -to [get_clocks ddr3_ui_clk] $DDR3_UI_CLK_PERIOD -datapath_only
# GPIO muxing
set_max_delay -from [get_pins e320_core_i/fp_gpio_src_reg_reg[*]/C] -to [get_clocks radio_clk_1x] $RADIO_CLK_1X_PERIOD -datapath_only
set_max_delay -from [get_pins e320_core_i/fp_gpio_src_reg_reg[*]/C] -to [get_clocks radio_clk_2x] $RADIO_CLK_2X_PERIOD -datapath_only
# Codec reset
set_max_delay -from [get_pins e320_core_i/dboard_ctrl_reg[2]/C] -to [get_clocks radio_clk_1x_1] $RADIO_CLK_1X_PERIOD -datapath_only
# Power-on reset
set_max_delay -from [get_pins por_gen/por_rst_reg/C] -to [get_clocks xge_clk] $XGE_CLK_PERIOD -datapath_only
# SFP MDIO data and clock signal crossings. These are double synchronized in
# the Xilinx MDIO IP.
set_max_delay -from [get_pins sfp_wrapper_i/mgt_io_i/mdio_master_i/mdio_out_reg/C] \
-to [get_clocks xge_clk] $XGE_CLK_PERIOD -datapath_only
set_max_delay -from [get_pins sfp_wrapper_i/mgt_io_i/mdio_master_i/mdc_reg/C] \
-to [get_clocks xge_clk] $XGE_CLK_PERIOD -datapath_only
###############################################################################
# False Paths
###############################################################################
# Synchronizer core false paths
set_false_path -to [get_pins -hierarchical -filter {NAME =~ */synchronizer_false_path/stages[0].value_reg[0][*]/D}]
set_false_path -to [get_pins -hierarchical -filter {NAME =~ */synchronizer_false_path/stages[0].value_reg[0][*]/S}]
# MIG core reset
# According to Xilinx AR 61112, it is safe to make sys_rst a false path.
set_false_path -from [get_pins bus_reset_gen/reset_out_reg/C] \
-to [get_clocks ddr3_ui_clk]
set_false_path -from [get_pins bus_reset_gen/reset_out_reg/C] \
-to [get_clocks ddr3_ui_clk_2x]
# USR_ACCESS build date
set_false_path -through [get_pins usr_access_i/DATA[*]]
###############################################################################
# PPS Input Timing
###############################################################################
# The external PPS is synchronous to the external reference clock. We want to
# allow for 5 ns of setup and 5 ns of hold at the external connectors of the
# device.
set t_ext_setup 5.0
set t_ext_hold 5.0
# Board delays for external REF/PPS
set t_ext_pps_to_fpga(min) 1.673 ; # Delay from external pin of PPS to FPGA
set t_ext_pps_to_fpga(max) 5.011
set t_ext_ref_to_fpga(min) 1.452 ; # Delay from external pin of reference clock to FPGA
set t_ext_ref_to_fpga(max) 4.000
# Calculate the needed setup and hold at FPGA for external PPS, taking into
# account worst-case clock and data path skew.
set t_ext_fpga_setup [expr $t_ext_setup + ($t_ext_ref_to_fpga(min) - $t_ext_pps_to_fpga(max))]
set t_ext_fpga_hold [expr $t_ext_hold + ($t_ext_pps_to_fpga(min) - $t_ext_ref_to_fpga(max))]
set_input_delay -clock ref_clk -max [expr $REF_CLK_PERIOD - $t_ext_fpga_setup] [get_ports CLK_SYNC_EXT]
set_input_delay -clock ref_clk -min $t_ext_fpga_hold [get_ports CLK_SYNC_EXT]
# The GPS provides 2 ns setup and 2 ns of hold around the rising clock edge
set t_int_setup 2.0
set t_int_hold 2.0
# Board delays for internal REF/PPS
set t_int_pps_to_fpga(min) 0.359 ; # Delay from PPS output of GPS to FPGA
set t_int_pps_to_fpga(max) 0.438
set t_int_ref_to_fpga(min) 1.699 ; # Delay from reference clock output of GPS to FPGA
set t_int_ref_to_fpga(max) 3.149
# Calculate the needed setup and hold at FPGA for internal PPS, taking into
# account worst-case clock and data path skew.
set t_int_fpga_setup [expr $t_int_setup + ($t_int_ref_to_fpga(min) - $t_int_pps_to_fpga(max))]
set t_int_fpga_hold [expr $t_int_hold + ($t_int_pps_to_fpga(min) - $t_int_ref_to_fpga(max))]
set_input_delay -clock ref_clk -max [expr $REF_CLK_PERIOD - $t_int_fpga_setup] [get_ports CLK_SYNC_INT]
set_input_delay -clock ref_clk -min $t_int_fpga_hold [get_ports CLK_SYNC_INT]
###############################################################################
# LVDS Interface
###############################################################################
# LVDS interface is source synchronous DDR. tPCB numbers are taken from
# HyperLynx for the Rev B PCB. 10 ps was added to each PCB delay for additional
# margin.
# From the AD9361 data sheet
set tDDRX(min) 0.25
set tDDRX(max) 1.25
set tSTX(min) 1.0
set tHTX(min) 0.0
# Other timing parameters
set tCP2X(min) [expr 0.45 * $rx_clk_period] ; # Worst-case bit period
set tTrns(max) 0.220 ; # Amount of time it takes an input to transition
# Input timing parameters
set tPCB_RX(max) 0.058 ; # Max delay by which the clock trace is longer than the data trace
set tPCB_RX(min) -0.059 ; # Min delay by which the clock trace is longer than the data trace
set tSetupIn [expr $tCP2X(min) - $tDDRX(max) + $tPCB_RX(min)]
set tHoldIn [expr $tDDRX(min) - $tTrns(max) - $tPCB_RX(max)]
# Input Setup/Hold (Rising Clock Edge)
set_input_delay -clock [get_clocks rx_clk] -max [expr $tCP2X(min) - $tSetupIn] [get_ports {RX_DATA_*[*] RX_FRAME_*}]
set_input_delay -clock [get_clocks rx_clk] -min $tHoldIn [get_ports {RX_DATA_*[*] RX_FRAME_*}]
# Input Setup/Hold (Falling Clock Edge)
set_input_delay -clock [get_clocks rx_clk] -max [expr $tCP2X(min) - $tSetupIn] [get_ports {RX_DATA_*[*] RX_FRAME_*}] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -min $tHoldIn [get_ports {RX_DATA_*[*] RX_FRAME_*}] -clock_fall -add_delay
# Output timing parameters
set tPCB_TX(max) 0.066 ; # Max delay by which the clock trace is longer than the data trace
set tPCB_TX(min) -0.049 ; # Min delay by which the clock trace is longer than the data trace
set tSetupOut [expr $tSTX(min) - $tPCB_TX(min)]
set tHoldOut [expr $tHTX(min) + $tPCB_TX(max)]
# Create tx_clk (FB_CLK)
create_generated_clock \
-name tx_clk \
-multiply_by 1 \
-source [get_pins cat_io_lvds_dual_mode_i0/cat_io_lvds_i0/cat_output_lvds_i0/ddr_clk_oserdese2/CLK] \
[get_ports TX_CLK_P]
# Output Setup
set_output_delay -clock [get_clocks tx_clk] -max $tSetupOut [get_ports {TX_DATA_*[*] TX_FRAME_*}]
set_output_delay -clock [get_clocks tx_clk] -max $tSetupOut [get_ports {TX_DATA_*[*] TX_FRAME_*}] -clock_fall -add_delay
# Output Hold
set_output_delay -clock [get_clocks tx_clk] -min [expr -$tHoldOut] [get_ports {TX_DATA_*[*] TX_FRAME_*}]
set_output_delay -clock [get_clocks tx_clk] -min [expr -$tHoldOut] [get_ports {TX_DATA_*[*] TX_FRAME_*}] -clock_fall -add_delay
###############################################################################
# SPI
###############################################################################
# Xilinx doesn't allow you to fully constrain EMIO because the internal SPI
# clock is not accessible. So delay constraints are used to limit the delays to
# compatible values.
# Transceiver SPI
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI0MO] \
-to [get_ports XCVR_SPI_MOSI] 6.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_MOSI] 0.0
#
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI0SCLKO] \
-to [get_ports XCVR_SPI_CLK] 6.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_CLK] 0.0
#
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI0SSON[0]] \
-to [get_ports XCVR_SPI_CS_N] 6.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_CS_N] 0.0
#
set_max_delay -from [get_ports XCVR_SPI_MISO] \
-to [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI0MI] 4.0 -datapath_only
set_min_delay -from [get_ports XCVR_SPI_MISO] -to [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI0MI] 0.0
# Clock synthesizer SPI
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI1MO] \
-to [get_ports CLK_PLL_SDATA] 9.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_MOSI] 0.0
#
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI1SCLKO] \
-to [get_ports CLK_PLL_SCLK] 9.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_CLK] 0.0
#
set_max_delay -from [get_pins e320_ps_bd_i/processing_system7_0/inst/PS7_i/EMIOSPI1SSON[0]] \
-to [get_ports CLK_PLL_SLE] 9.0 -datapath_only
set_min_delay -to [get_ports XCVR_SPI_CS_N] 0.0
###############################################################################
# Miscellaneous I/O Constraints
###############################################################################
# Transceiver
set_max_delay -to [get_ports XCVR_RESET_N] 50.0
set_min_delay -to [get_ports XCVR_RESET_N] 0.0
#
set_max_delay -from [get_ports XCVR_CTRL_OUT[*]] 5.0 -datapath_only
set_min_delay -from [get_ports XCVR_CTRL_OUT[*]] 0.0
# GPIO
set_max_delay -from [get_ports GPIO_PREBUFF[*]] 5.0 -datapath_only
set_min_delay -from [get_ports GPIO_PREBUFF[*]] 0.0
#
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports GPIO_DIR[*]]] \
-to [get_ports GPIO_DIR[*]] 8.0 -datapath_only
set_min_delay -to [get_ports GPIO_DIR[*]] 0.0
#
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports GPIO_PREBUFF[*]]] \
-to [get_ports GPIO_PREBUFF[*]] 8.0 -datapath_only
set_min_delay -to [get_ports GPIO_PREBUFF[*]] 0.0
#
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports GPIO_OE_N]] \
-to [get_ports GPIO_OE_N] 8.0 -datapath_only
set_min_delay -to [get_ports GPIO_OE_N] 0.0
#
set_max_delay -to [get_ports {EN_GPIO_2V5 EN_GPIO_3V3 EN_GPIO_VAR_SUPPLY}] 50.0
set_min_delay -to [get_ports {EN_GPIO_2V5 EN_GPIO_3V3 EN_GPIO_VAR_SUPPLY}] 0.0
# GPS
set_max_delay -from [get_ports {GPS_ALARM GPS_LOCK GPS_PHASELOCK GPS_SURVEY GPS_WARMUP}] 10.0 -datapath_only
set_min_delay -from [get_ports {GPS_ALARM GPS_LOCK GPS_PHASELOCK GPS_SURVEY GPS_WARMUP}] 0.0
#
set_max_delay -to [get_ports GPS_INITSURV_N] 50.0
set_min_delay -to [get_ports GPS_INITSURV_N] 0.0
set_max_delay -to [get_ports GPS_RST_N] 50.0
set_min_delay -to [get_ports GPS_RST_N] 0.0
#
set_max_delay -to [get_ports CLK_GPS_PWR_EN] 50.0
set_min_delay -to [get_ports CLK_GPS_PWR_EN] 0.0
# Clock Control
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports CLK_REF_SEL]] \
-to [get_ports CLK_REF_SEL] 8.0 -datapath_only
set_min_delay -to [get_ports CLK_REF_SEL] 0.0
#
set_max_delay -from [get_ports CLK_MUX_OUT] 5.0 -datapath_only
set_min_delay -from [get_ports CLK_MUX_OUT] 0.0
# DDR3
set_max_delay -to [get_ports ddr3_reset_n] 50.0
set_min_delay -to [get_ports ddr3_reset_n] 0.0
# LEDs
set_max_delay -to [get_ports RX1_GRN_ENA] 50.0
set_min_delay -to [get_ports RX1_GRN_ENA] 0.0
set_max_delay -to [get_ports TX1_RED_ENA] 50.0
set_min_delay -to [get_ports TX1_RED_ENA] 0.0
set_max_delay -to [get_ports TXRX1_GRN_ENA] 50.0
set_min_delay -to [get_ports TXRX1_GRN_ENA] 0.0
set_max_delay -to [get_ports RX2_GRN_ENA] 50.0
set_min_delay -to [get_ports RX2_GRN_ENA] 0.0
set_max_delay -to [get_ports TX2_RED_ENA] 50.0
set_min_delay -to [get_ports TX2_RED_ENA] 0.0
set_max_delay -to [get_ports TXRX2_GRN_ENA] 50.0
set_min_delay -to [get_ports TXRX2_GRN_ENA] 0.0
#
set_max_delay -to [get_ports LED_ACT1] 50.0
set_min_delay -to [get_ports LED_ACT1] 0.0
set_max_delay -to [get_ports LED_LINK1] 50.0
set_min_delay -to [get_ports LED_LINK1] 0.0
# Control Filters
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports FE*_SEL[*]]] \
-to [get_ports FE*_SEL[*]] 10.0 -datapath_only
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports RX*_SEL[*]]] \
-to [get_ports RX*_SEL[*]] 10.0 -datapath_only
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports RX*_BSEL[*]]] \
-to [get_ports RX*_BSEL[*]] 10.0 -datapath_only
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports TX*_BSEL[*]]] \
-to [get_ports TX*_BSEL[*]] 10.0 -datapath_only
# PA Control
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports TX_HFAMP*_ENA]] \
-to [get_ports TX_HFAMP*_ENA] 10.0 -datapath_only
set_max_delay -from [all_fanin -only_cells -startpoints_only -flat [get_ports TX_LFAMP*_ENA]] \
-to [get_ports TX_LFAMP*_ENA] 10.0 -datapath_only
# SFP
set_max_delay -from [get_ports SFP1_RXLOS] 50.0
set_min_delay -from [get_ports SFP1_RXLOS] 0.0
set_max_delay -to [get_ports SFP1_TXDISABLE] 50.0
set_min_delay -to [get_ports SFP1_TXDISABLE] 0.0
|