zoukankan      html  css  js  c++  java
  • Idelay进行时序调节

    IODELAY_GROUP

    
    # PART is virtexu xcvu440flga2892
    
    ############################################################
    # Clock Period Constraints                                 #
    ############################################################
    
    ############################################################
    # RX Clock period Constraints (per instance)               #
    ############################################################
    # Receiver clock period constraints: please do not relax
    create_clock -period 8 [get_ports rgmii_rxc]
    
    #
    ####
    #######
    ##########
    #############
    #################
    #BLOCK CONSTRAINTS
    
    ############################################################
    # Physical Interface Constraints
    ############################################################
    
    ############################################################
    # The following are required to maximise setup/hold        #
    ############################################################
    
    set_property SLEW FAST [get_ports {rgmii_txd[3] rgmii_txd[2] rgmii_txd[1] rgmii_txd[0] rgmii_tx_ctl rgmii_txc}]
    
    
    ############################################################
    # RGMII: IODELAY Constraints
    ############################################################
    # Please modify the value of the IDELAY_VALUE/ODELAY_VALUE
    # according to your design.
    # For more information on IDELAYCTRL and IODELAY, please
    # refer to the User Guide.
    #
    # Apply the same DELAY_VALUE to all RGMII RX inputs.
    # DELAY_VALUE is the time represenatation of the desired delay in ps
    # This is to provide a similiar Clock Path and Data Path delay.
    set_property DELAY_VALUE 900  [get_cells {rgmii_interface/delay_rgmii_rx* rgmii_interface/rxdata_bus[*].delay_rgmii_rx*}]
    # Group IODELAY components
    set_property IODELAY_GROUP tri_mode_ethernet_mac_iodelay_grp [get_cells {rgmii_interface/delay_rgmii_tx* rgmii_interface/txdata_out_bus[*].delay_rgmii_tx*}]
    set_property IODELAY_GROUP tri_mode_ethernet_mac_iodelay_grp [get_cells {rgmii_interface/delay_rgmii_rx* rgmii_interface/rxdata_bus[*].delay_rgmii_rx*}]
    
    
    //------------------------------------------------------------------------------
    // File       : tri_mode_ethernet_mac_0_rgmii_v2_0_if.v
    // Author     : Xilinx Inc.
    // -----------------------------------------------------------------------------
    // (c) Copyright 2013 Xilinx, Inc. All rights reserved.
    //
    // This file contains confidential and proprietary information
    // of Xilinx, Inc. and is protected under U.S. and
    // international copyright and other intellectual property
    // laws.
    //
    // DISCLAIMER
    // This disclaimer is not a license and does not grant any
    // rights to the materials distributed herewith. Except as
    // otherwise provided in a valid license issued to you by
    // Xilinx, and to the maximum extent permitted by applicable
    // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
    // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
    // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
    // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
    // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
    // (2) Xilinx shall not be liable (whether in contract or tort,
    // including negligence, or under any other theory of
    // liability) for any loss or damage of any kind or nature
    // related to, arising under or in connection with these
    // materials, including for any direct, or any indirect,
    // special, incidental, or consequential loss or damage
    // (including loss of data, profits, goodwill, or any type of
    // loss or damage suffered as a result of any action brought
    // by a third party) even if such damage or loss was
    // reasonably foreseeable or Xilinx had been advised of the
    // possibility of the same.
    //
    // CRITICAL APPLICATIONS
    // Xilinx products are not designed or intended to be fail-
    // safe, or for use in any application requiring fail-safe
    // performance, such as life-support or safety devices or
    // systems, Class III medical devices, nuclear facilities,
    // applications related to the deployment of airbags, or any
    // other applications that could lead to death, personal
    // injury, or severe property or environmental damage
    // (individually and collectively, "Critical
    // Applications"). Customer assumes the sole risk and
    // liability of any use of Xilinx products in Critical
    // Applications, subject only to applicable laws and
    // regulations governing limitations on product liability.
    //
    // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
    // PART OF THIS FILE AT ALL TIMES.
    // -----------------------------------------------------------------------------
    // Description:  This module creates a version 2.0 Reduced Gigabit Media
    //               Independent Interface (RGMII v2.0) by instantiating
    //               Input/Output buffers and Input/Output double data rate
    //               (DDR) flip-flops as required.
    //
    //               This interface is used to connect the Ethernet MAC to
    //               an external Ethernet PHY.
    //               This module routes the rgmii_rxc from the phy chip
    //               (via a bufg) onto the rx_clk line.
    
    //------------------------------------------------------------------------------
    
    `timescale 1 ps / 1 ps
    
    //------------------------------------------------------------------------------
    // The module declaration for the PHY IF design.
    //------------------------------------------------------------------------------
    module tri_mode_ethernet_mac_0_rgmii_v2_0_if (
        // Synchronous resets
        input            tx_reset,
        input            rx_reset,
    
        // The following ports are the MDIO physical interface: these will be
        // pins on the FPGA
        inout            mdio,
        output           mdc,
    
        // The following ports are the internal connections from IOB logic to
        // the TEMAC core for the MDIO
        output           mdio_i,
        input            mdio_o,
        input            mdio_t,
        input            mdc_i,
    
        // Current operating speed is 10/100
        input            speedis10100,
    
        // The following ports are the RGMII physical interface: these will be at
        // pins on the FPGA
        output     [3:0] rgmii_txd,
        output           rgmii_tx_ctl,
        output           rgmii_txc,
        input      [3:0] rgmii_rxd,
        input            rgmii_rx_ctl,
        input            rgmii_rxc,
    
        // The following signals are in the RGMII in-band status signals
        output reg       link_status,
        output reg [1:0] clock_speed,
        output reg       duplex_status,
    
        // The following ports are the internal GMII connections from IOB logic
        // to the TEMAC core
        input            phy_tx_enable,
        input            phy_tx_enable_falling,
        input      [7:0] txd_from_mac,
        input            tx_en_from_mac,
        input            tx_er_from_mac,
        input            tx_clk,
        input            clk_div5,
        input            clk_div5_shift,
        output     [7:0] rxd_to_mac,
        output           rx_dv_to_mac,
        output           rx_er_to_mac,
    
        // Receiver clock for the MAC and Client Logic
        output           rx_clk
      );
    
    
      //----------------------------------------------------------------------------
      // internal signals
      //----------------------------------------------------------------------------
    
      wire   [3:0] rgmii_txd_obuf;
      wire         rgmii_tx_ctl_obuf;
      wire         rgmii_txc_obuf;
      wire   [3:0] rgmii_rxd_ibuf;
      wire         rgmii_rx_ctl_ibuf;
      wire         rgmii_rxc_ibuf;
      reg    [3:0] gmii_txd_falling;             // gmii_txd signal registered on the falling edge of tx_clk.
      wire         delay_rgmii_tx_clk_out;
      wire         delay_rgmii_tx_clk_return;
      wire         rgmii_txc_odelay;             // RGMII receiver clock ODDR output.
      wire         rgmii_tx_ctl_odelay;          // RGMII control signal ODDR output.
      wire   [3:0] rgmii_txd_odelay;             // RGMII data ODDR output.
      wire         rgmii_tx_ctl_int;             // Internal RGMII transmit control signal.
      wire         rgmii_rx_ctl_delay;
      wire   [3:0] rgmii_rxd_delay;
      wire         rx_clk_int;
      wire         rx_clk_iddr;
      wire         rgmii_rx_ctl_reg;             // Internal RGMII receiver control signal.
      reg          tx_en_to_ddr;
      wire         tx_en_to_ddr_fall;
      reg          tx_en_to_ddr_lch;
      wire         gmii_rx_dv_reg;               // gmii_rx_dv registered in IOBs.
      wire         gmii_rx_er_reg;               // gmii_rx_er registered in IOBs.
      wire   [7:0] gmii_rxd_reg;                 // gmii_rxd registered in IOBs.
      wire         inband_ce;                    // RGMII inband status registers clock enable
    
    
      //----------------------------------------------------------------------------
      // Input/Output Buffers
      //----------------------------------------------------------------------------
    
      // MDIO
      //--------
      IOBUF mdio_iobuf (
         .I              (mdio_o),
         .IO             (mdio),
         .O              (mdio_i),
         .T              (mdio_t)
      );
    
       // Route through the MDC clock
      OBUF mdc_obuf_i (
         .I              (mdc_i),
         .O              (mdc)
      );
    
    
      // RGMII
      //--------
      OBUF rgmii_txc_obuf_i (
         .I              (rgmii_txc_obuf),
         .O              (rgmii_txc)
      );
    
      OBUF rgmii_tx_ctl_obuf_i (
         .I              (rgmii_tx_ctl_obuf),
         .O              (rgmii_tx_ctl)
      );
    
      genvar loopa;
      generate for (loopa=0; loopa<4; loopa=loopa+1)
        begin : obuf_data
          OBUF rgmii_txd_obuf_i (
             .I          (rgmii_txd_obuf[loopa]),
             .O          (rgmii_txd[loopa])
          );
        end
      endgenerate
    
      
     (* DONT_TOUCH = "yes" *) IBUF rgmii_rxc_ibuf_i (
         .I              (rgmii_rxc),
         .O              (rgmii_rxc_ibuf)
      );
    
     (* DONT_TOUCH = "yes" *) IBUF rgmii_rx_ctl_ibuf_i (
         .I              (rgmii_rx_ctl),
         .O              (rgmii_rx_ctl_ibuf)
      );
    
      genvar loopi;
      generate for (loopi=0; loopi<4; loopi=loopi+1)
        begin : ibuf_data
          IBUF rgmii_rxd_ibuf_i (
             .I          (rgmii_rxd[loopi]),
             .O          (rgmii_rxd_ibuf[loopi])
          );
        end
      endgenerate
    
    
      //----------------------------------------------------------------------------
      // Route internal signals to output ports
      //----------------------------------------------------------------------------
    
      assign rxd_to_mac      = gmii_rxd_reg;
      assign rx_dv_to_mac    = gmii_rx_dv_reg;
      assign rx_er_to_mac    = gmii_rx_er_reg;
    
    
      //----------------------------------------------------------------------------
      // RGMII Transmitter Clock Management
      //----------------------------------------------------------------------------
    
      // Delay the transmitter clock relative to the data.
      // For 1 gig operation this delay is set to produce a 90 degree phase
      // shifted clock w.r.t. gtx_clk_bufg so that the clock edges are
      // centralised within the rgmii_txd[3:0] valid window.
    
      // Instantiate the Output DDR primitive
      ODDRE1 #(
           
          .SRVAL         (1'b0)
      ) rgmii_txc_ddr (
          .Q             (rgmii_txc_odelay),
          .C             (tx_clk),
          .D1            (clk_div5_shift),
          .D2            (clk_div5),
          .SR            (tx_reset)
       );
    
    
       // Instantiate the Output Delay primitive (delay output by 2 ns).  In order to
       // achieve 2ns, an ODELAY is cascaded with an IDELAY from the bitslice
       // immediately below it.
     ODELAYE3 #(
          
          .DELAY_VALUE      (875),
          
          .DELAY_TYPE       ("FIXED"),
          .CASCADE          ("MASTER"),
          .REFCLK_FREQUENCY (333.333),
          .SIM_DEVICE       ("ULTRASCALE")
          
       )
       delay_rgmii_tx_clk (
          .ODATAIN          (rgmii_txc_odelay),
          .DATAOUT          (rgmii_txc_obuf),
          .CLK              (1'b0),
          .CE               (1'b0),
          .INC              (1'b0),
          .CNTVALUEIN       (9'h0),
          .CNTVALUEOUT      (),
          .LOAD             (1'b0),
          .RST              (1'b0),
          .CASC_IN          (1'b0),
          .CASC_RETURN      (delay_rgmii_tx_clk_casc_return),
          .CASC_OUT         (delay_rgmii_tx_clk_casc_out),
          .EN_VTC           (1'b1)
       );
    
     IDELAYE3 #(
          .DELAY_VALUE      (0),
          .DELAY_TYPE       ("FIXED"),
          .CASCADE          ("SLAVE_END"),
          .REFCLK_FREQUENCY (333.333),
          .SIM_DEVICE       ("ULTRASCALE")
          
      )
      delay_rgmii_tx_clk_casc (
          .IDATAIN          (1'b0),
          .DATAOUT          (delay_rgmii_tx_clk_casc_return),
          .DATAIN           (1'b0),
          .CLK              (1'b0),
          .CE               (1'b0),
          .INC              (1'b0),
          .CNTVALUEIN       (9'h0),
          .CNTVALUEOUT      (),
          .LOAD             (1'b0),
          .RST              (1'b0),
          .CASC_IN          (delay_rgmii_tx_clk_casc_out),
          .CASC_RETURN      (1'b0),
          .CASC_OUT         (),
          .EN_VTC           (1'b1)
      );
    
      
    
       //---------------------------------------------------------------------------
       // RGMII Transmitter Logic :
       // drive TX signals through IOBs onto RGMII interface
       //---------------------------------------------------------------------------
    
       // Encode rgmii ctl signal
       assign rgmii_tx_ctl_int = tx_en_from_mac ^ tx_er_from_mac;
    
    
       // Instantiate Double Data Rate Output components. Then
       // put data and control signals through ODELAY components to
       // provide similiar net delays to those seen on the clk signal.
    
       always @ (speedis10100, txd_from_mac)
       begin
          if (speedis10100 == 1'b0)
             gmii_txd_falling     <= txd_from_mac[7:4];
          else
             gmii_txd_falling     <= txd_from_mac[3:0];
       end
    
    
       genvar i;
       generate for (i=0; i<4; i=i+1)
         begin : txdata_out_bus
           ODDRE1 #(
           
              .SRVAL         (1'b0)
           )
           rgmii_txd_out (
              .Q             (rgmii_txd_odelay[i]),
              .C             (tx_clk),
              .D1            (txd_from_mac[i]),
              .D2            (gmii_txd_falling[i]),
              .SR            (tx_reset)
           );
    
    
    
          ODELAYE3 #(
              .DELAY_VALUE      (0),
              .DELAY_TYPE       ("FIXED"),
              .REFCLK_FREQUENCY (333.333),
          .SIM_DEVICE       ("ULTRASCALE")
          
           )
           delay_rgmii_txd (
              .ODATAIN       (rgmii_txd_odelay[i]),
              .DATAOUT       (rgmii_txd_obuf[i]),
              .CLK           (1'b0),
              .CE            (1'b0),
              .INC           (1'b0),
              .CNTVALUEIN    (9'h0),
              .CNTVALUEOUT   (),
              .LOAD          (1'b0),
              .RST           (1'b0),
              .CASC_IN       (1'b0),
              .CASC_RETURN   (1'b0),
              .CASC_OUT      (),
              .EN_VTC        (1'b1)
           );
    
         end
       endgenerate
    
    
    
       // when the speed switches to 10/100 tx_clk is running much faster than
       // txc and therefore the ddr needs to be controlled to prevent updates
       // occuring at tx_clk rate
    
       always @(posedge tx_clk)
       begin
         if(tx_reset) begin  
           tx_en_to_ddr_lch <= 1'b0;
         end  
         else begin
           if(phy_tx_enable | clk_div5) begin
             tx_en_to_ddr_lch <= tx_en_from_mac;
           end
           else if(!clk_div5 & clk_div5_shift) begin
             tx_en_to_ddr_lch <= rgmii_tx_ctl_int;
           end
           else begin
             tx_en_to_ddr_lch <= tx_en_to_ddr_lch;
           end
         end   
       end  
    
       always @(speedis10100 or phy_tx_enable or clk_div5 or clk_div5_shift or tx_en_from_mac or rgmii_tx_ctl_int or tx_en_to_ddr_lch)
       begin
         if( !speedis10100 | (speedis10100 & (phy_tx_enable | clk_div5)))begin
           tx_en_to_ddr = tx_en_from_mac;
         end
         else if( speedis10100 & (!clk_div5 & clk_div5_shift)) begin
           tx_en_to_ddr = rgmii_tx_ctl_int;
         end 
         else begin
           tx_en_to_ddr = tx_en_to_ddr_lch;
         end
       end  
    
       assign tx_en_to_ddr_fall = speedis10100 ? tx_en_to_ddr :rgmii_tx_ctl_int;
    
    
       ODDRE1 #(
           
          .SRVAL         (1'b0)
       )
       ctl_output (
          .Q             (rgmii_tx_ctl_odelay),
          .C             (tx_clk),
          .D1            (tx_en_to_ddr),
          .D2            (tx_en_to_ddr_fall),
          .SR            (tx_reset)
       );
    
       
    
    
       ODELAYE3 #(
          .DELAY_VALUE      (0),
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
          .SIM_DEVICE   ("ULTRASCALE")
          
       )
       delay_rgmii_tx_ctl (
          .ODATAIN       (rgmii_tx_ctl_odelay),
          .DATAOUT       (rgmii_tx_ctl_obuf),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
       );
    
       //---------------------------------------------------------------------------
       // RGMII Receiver Clock Logic
       //---------------------------------------------------------------------------
    
       // Route rgmii_rxc through a BUFG and onto clock routing
       BUFG
       bufg_rgmii_rx_clk (
          .I             (rgmii_rxc_ibuf),
          .O             (rx_clk_int)
       );
    
       // Route rgmii_rxc through a BUFG for connecting to IDDR components
       BUFG 
       bufg_rgmii_rx_clk_iddr (
          .I             (rgmii_rxc_ibuf),
          .O             (rx_clk_iddr)
       );
    
    
       // Assign the internal clock signal to the output port
       assign rx_clk = rx_clk_int;
    
    
       //---------------------------------------------------------------------------
       // RGMII Receiver Logic : receive signals through IOBs from RGMII interface
       //---------------------------------------------------------------------------
    
       // Drive input RGMII Rx signals from PADS through IODELAYS.
    
       // Please modify the IODELAY_VALUE according to your design.
       // For more information on IDELAYCTRL and IODELAY, please refer to
       // the User Guide.
    
       
      IDELAYE3 #(
          .DELAY_TYPE       ("FIXED"),
          .REFCLK_FREQUENCY (333.333),
          .SIM_DEVICE    ("ULTRASCALE")
          
       )
       delay_rgmii_rx_ctl (
          .IDATAIN       (rgmii_rx_ctl_ibuf),
          .DATAOUT       (rgmii_rx_ctl_delay),
          .DATAIN        (1'b0),
          .CLK           (1'b0),
          .CE            (1'b0),
          .INC           (1'b0),
          .CNTVALUEIN    (9'h0),
          .CNTVALUEOUT   (),
          .LOAD          (1'b0),
          .RST           (1'b0),
          .CASC_IN       (1'b0),
          .CASC_RETURN   (1'b0),
          .CASC_OUT      (),
          .EN_VTC        (1'b1)
          );
       
    
       genvar j;
       generate for (j=0; j<4; j=j+1)
         begin : rxdata_bus
    
       
    
           IDELAYE3 #(
              .DELAY_TYPE       ("FIXED"),
              .REFCLK_FREQUENCY (333.333),
              .SIM_DEVICE    ("ULTRASCALE")
          
           )
           delay_rgmii_rxd (
              .IDATAIN       (rgmii_rxd_ibuf[j]),
              .DATAOUT       (rgmii_rxd_delay[j]),
              .DATAIN        (1'b0),
              .CLK           (1'b0),
              .CE            (1'b0),
              .INC           (1'b0),
              .CNTVALUEIN    (9'h0),
              .CNTVALUEOUT   (),
              .LOAD          (1'b0),
              .RST           (1'b0),
              .CASC_IN       (1'b0),
              .CASC_RETURN   (1'b0),
              .CASC_OUT      (),
              .EN_VTC        (1'b1)
           );
         end
       endgenerate
    
    
       // Instantiate Double Data Rate Input flip-flops.
       // DDR_CLK_EDGE attribute specifies output data alignment from IDDR component
    
       genvar k;
       generate for (k=0; k<4; k=k+1)
         begin : rxdata_in_bus
    
           IDDRE1 #(
              .DDR_CLK_EDGE  ("SAME_EDGE_PIPELINED")
           )
           rgmii_rx_data_in (
              .Q1            (gmii_rxd_reg[k]),
              .Q2            (gmii_rxd_reg[k+4]),
              .C             (rx_clk_iddr),
              .CB            (!rx_clk_iddr),
              .D             (rgmii_rxd_delay[k]),
              .R             (1'b0)
           );
         end
       endgenerate
    
       IDDRE1 #(
          .DDR_CLK_EDGE  ("SAME_EDGE_PIPELINED")
       )
       rgmii_rx_ctl_in (
          .Q1            (gmii_rx_dv_reg),
          .Q2            (rgmii_rx_ctl_reg),
          .C             (rx_clk_iddr),
          .CB            (!rx_clk_iddr),
          .D             (rgmii_rx_ctl_delay),
          .R             (1'b0)
       );
    
    
       // Decode gmii_rx_er signal
       assign gmii_rx_er_reg = gmii_rx_dv_reg ^ rgmii_rx_ctl_reg;
    
    
      //----------------------------------------------------------------------------
      // RGMII Inband Status Registers
      // extract the inband status from received rgmii data
      //----------------------------------------------------------------------------
    
       // Enable inband status registers during Interframe Gap
       assign inband_ce = !(gmii_rx_dv_reg || gmii_rx_er_reg);
    
       always @ (posedge rx_clk_int)
       begin
          if (rx_reset) begin
             link_status          <= 1'b0;
             clock_speed[1:0]     <= 2'b0;
             duplex_status        <= 1'b0;
          end
          else if (inband_ce) begin
             link_status          <= gmii_rxd_reg[0];
             clock_speed[1:0]     <= gmii_rxd_reg[2:1];
             duplex_status        <= gmii_rxd_reg[3];
          end
       end
    
    
    
    endmodule
    
    
    //------------------------------------------------------------------------------
    // Title      : Transmitter Clock Generator
    // Project    : Tri-Mode Ethernet MAC
    //------------------------------------------------------------------------------
    // File       : tri_mode_ethernet_mac_0_clk_en_gen.v
    // Author     : Xilinx Inc.
    // -----------------------------------------------------------------------------
    // (c) Copyright 2009 Xilinx, Inc. All rights reserved.
    //
    // This file contains confidential and proprietary information
    // of Xilinx, Inc. and is protected under U.S. and
    // international copyright and other intellectual property
    // laws.
    //
    // DISCLAIMER
    // This disclaimer is not a license and does not grant any
    // rights to the materials distributed herewith. Except as
    // otherwise provided in a valid license issued to you by
    // Xilinx, and to the maximum extent permitted by applicable
    // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
    // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
    // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
    // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
    // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
    // (2) Xilinx shall not be liable (whether in contract or tort,
    // including negligence, or under any other theory of
    // liability) for any loss or damage of any kind or nature
    // related to, arising under or in connection with these
    // materials, including for any direct, or any indirect,
    // special, incidental, or consequential loss or damage
    // (including loss of data, profits, goodwill, or any type of
    // loss or damage suffered as a result of any action brought
    // by a third party) even if such damage or loss was
    // reasonably foreseeable or Xilinx had been advised of the
    // possibility of the same.
    //
    // CRITICAL APPLICATIONS
    // Xilinx products are not designed or intended to be fail-
    // safe, or for use in any application requiring fail-safe
    // performance, such as life-support or safety devices or
    // systems, Class III medical devices, nuclear facilities,
    // applications related to the deployment of airbags, or any
    // other applications that could lead to death, personal
    // injury, or severe property or environmental damage
    // (individually and collectively, "Critical
    // Applications"). Customer assumes the sole risk and
    // liability of any use of Xilinx products in Critical
    // Applications, subject only to applicable laws and
    // regulations governing limitations on product liability.
    //
    // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
    // PART OF THIS FILE AT ALL TIMES.
    // -----------------------------------------------------------------------------
    //   Description:  This module provides clock enables for the tx
    //   logic and clocks to be used in the generation of rgmii_txc.
    //   At 1G the enables are both set to 1 as they are not reuired, at 100M
    //   the enables occur every 5th cycle for the phy interface and every 10th for
    //   the client.  At 10M this changes to every 50th and every 100th respectively.
    //   The clk_div5 outputs are used purely to generate the txc output and are
    //   used as data inputs to the DDR logic.
    //------------------------------------------------------------------------------
    
    `timescale 1 ps/1 ps
    
    module tri_mode_ethernet_mac_0_clk_en_gen
      (
          input             reset,
          input             speed_is_10_100,
          input             speed_is_100,
          input             clk,
          output   reg      client_tx_enable,
          output   reg      phy_tx_enable,
    	  output   reg      phy_tx_enable_falling,
          output   reg      clk_div5,
          output   reg      clk_div5_shift
       );
    
       reg   [5:0]          counter;
       reg   [5:0]          wrap_point;
       reg   [5:0]          first_edge;
       reg   [5:0]          second_edge;
       reg                  div_2;
       wire                 speed_is_10_100_int;
       wire                 speed_is_100_int;
       reg                  clk_div5_int;
       reg                  clk_div5_shift_int;
    // locally sync the speed controls
    
       tri_mode_ethernet_mac_0_block_sync_block txspeedis10100gen (
          .clk              (clk),
          .data_in          (speed_is_10_100),
          .data_out         (speed_is_10_100_int)
       );
    
       tri_mode_ethernet_mac_0_block_sync_block txspeedis100gen (
          .clk              (clk),
          .data_in          (speed_is_100),
          .data_out         (speed_is_100_int)
       );
    
    // generate a 6 bit counter which counts to a max of 50 and then wraps
    // the wrap point is dependant upon the speed setting
    always @(posedge clk)
    begin
       if (reset) begin
          counter                    <= 0;
       end
       else begin
          if (counter >= wrap_point) begin
             counter                 <= 0;
          end
          else begin
             counter                 <= counter + 1;
          end
       end
    end
    
    always @(speed_is_10_100_int or speed_is_100_int)
    begin
       if (!speed_is_10_100_int) begin
          wrap_point                 = 0;
          first_edge                 = 0;
          second_edge                = 0;
       end
       else begin
          if (speed_is_100_int) begin
             wrap_point                 = 4;
             first_edge                 = 1;
             second_edge                = 2;
          end
          else begin
             wrap_point                 = 49;
             first_edge                 = 23;
             second_edge                = 24;
          end
       end
    end
    
    // look for counter to equal wrap point - this gives the high speed
    // clock enable - we want to generate a second enable every other pulse
    always @(posedge clk)
    begin
       if (reset) begin
          div_2                      <= 0;
       end
       else begin
          if (speed_is_10_100_int) begin
             if (counter >= wrap_point) begin
                div_2                <= !div_2;
             end
          end
          else begin
             div_2                   <= 0;
          end
       end
    end
    
    // generate the clock enables - only if speed is not 1G
    always @(posedge clk)
    begin
       if (reset) begin
          clk_div5_int               <= 0;
          clk_div5_shift_int         <= 0;
       end
       else begin
          if (speed_is_10_100_int) begin
             if (counter >= wrap_point) begin
                clk_div5_int         <= 1;
                clk_div5_shift_int   <= 1;
             end
             else if (counter == first_edge) begin
                clk_div5_int         <= 0;
                clk_div5_shift_int   <= 1;
             end
             else if (counter == second_edge) begin
                clk_div5_int         <= 0;
                clk_div5_shift_int   <= 0;
             end
          end
          else begin
             clk_div5_int            <= 0;
             clk_div5_shift_int      <= 1;
          end
       end
    end
    
    // the pipeline delay between the MAC enable and the clock needs to be controlled
    // to ensure the correct timing at the IO
    always @(posedge clk)
    begin
       if (reset) begin
          clk_div5                   <= 0;
          clk_div5_shift             <= 0;
       end
       else begin
          clk_div5                   <= clk_div5_int;
          clk_div5_shift             <= clk_div5_shift_int;
       end
    end
    
    always @(posedge clk)
    begin
       if (reset) begin
          client_tx_enable           <= 0;
          phy_tx_enable              <= 0;
       end
       else begin
          if (counter >= wrap_point) begin
             phy_tx_enable           <= 1;
          end
          else begin
             phy_tx_enable           <= 0;
          end
          if (counter >= first_edge) begin
             phy_tx_enable_falling   <= 1;
          end
          else begin
             phy_tx_enable_falling   <= 0;
          end
          if ((counter >= wrap_point) & !div_2) begin
             client_tx_enable        <= 1;
          end
          else begin
             client_tx_enable        <= 0;
          end
       end
    end
    
    
    
    endmodule
    
    
    //------------------------------------------------------------------------------
    // Title      : CDC Sync Block
    // Project    : Tri-Mode Ethernet MAC
    //------------------------------------------------------------------------------
    // File       : tri_mode_ethernet_mac_0_block_sync_block.v
    // Author     : Xilinx Inc.
    //------------------------------------------------------------------------------
    // Description: Used on signals crossing from one clock domain to another, this
    //              is a multiple flip-flop pipeline, with all flops placed together
    //              into the same slice.  Thus the routing delay between the two is
    //              minimum to safe-guard against metastability issues.
    // -----------------------------------------------------------------------------
    // (c) Copyright 2001-2013 Xilinx, Inc. All rights reserved.
    //
    // This file contains confidential and proprietary information
    // of Xilinx, Inc. and is protected under U.S. and
    // international copyright and other intellectual property
    // laws.
    //
    // DISCLAIMER
    // This disclaimer is not a license and does not grant any
    // rights to the materials distributed herewith. Except as
    // otherwise provided in a valid license issued to you by
    // Xilinx, and to the maximum extent permitted by applicable
    // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
    // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
    // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
    // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
    // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
    // (2) Xilinx shall not be liable (whether in contract or tort,
    // including negligence, or under any other theory of
    // liability) for any loss or damage of any kind or nature
    // related to, arising under or in connection with these
    // materials, including for any direct, or any indirect,
    // special, incidental, or consequential loss or damage
    // (including loss of data, profits, goodwill, or any type of
    // loss or damage suffered as a result of any action brought
    // by a third party) even if such damage or loss was
    // reasonably foreseeable or Xilinx had been advised of the
    // possibility of the same.
    //
    // CRITICAL APPLICATIONS
    // Xilinx products are not designed or intended to be fail-
    // safe, or for use in any application requiring fail-safe
    // performance, such as life-support or safety devices or
    // systems, Class III medical devices, nuclear facilities,
    // applications related to the deployment of airbags, or any
    // other applications that could lead to death, personal
    // injury, or severe property or environmental damage
    // (individually and collectively, "Critical
    // Applications"). Customer assumes the sole risk and
    // liability of any use of Xilinx products in Critical
    // Applications, subject only to applicable laws and
    // regulations governing limitations on product liability.
    //
    // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
    // PART OF THIS FILE AT ALL TIMES.
    // -----------------------------------------------------------------------------
    
    `timescale 1ps / 1ps
    
    (* dont_touch = "yes" *)
    module tri_mode_ethernet_mac_0_block_sync_block #(
      parameter INITIALISE = 1'b0,
      parameter DEPTH = 5
    )
    (
      input        clk,              // clock to be sync'ed to
      input        data_in,          // Data to be 'synced'
      output       data_out          // synced data
    );
    
      // Internal Signals
      wire   data_sync0;
      wire   data_sync1;
      wire   data_sync2;
      wire   data_sync3;
      wire   data_sync4;
    
    
      (* ASYNC_REG = "TRUE", SHREG_EXTRACT = "NO" *)
      FDRE #(
        .INIT (INITIALISE[0])
      ) data_sync_reg0 (
        .C  (clk),
        .D  (data_in),
        .Q  (data_sync0),
    	.CE (1'b1),
        .R  (1'b0)
      );
    
      (* ASYNC_REG = "TRUE", SHREG_EXTRACT = "NO" *)
      FDRE #(
       .INIT (INITIALISE[0])
      ) data_sync_reg1 (
      .C  (clk),
      .D  (data_sync0),
      .Q  (data_sync1),
      .CE (1'b1),
      .R  (1'b0)
      );
    
      (* ASYNC_REG = "TRUE", SHREG_EXTRACT = "NO" *)
      FDRE #(
       .INIT (INITIALISE[0])
      ) data_sync_reg2 (
      .C  (clk),
      .D  (data_sync1),
      .Q  (data_sync2),
      .CE (1'b1),
      .R  (1'b0)
      );
    
      (* ASYNC_REG = "TRUE", SHREG_EXTRACT = "NO" *)
      FDRE #(
       .INIT (INITIALISE[0])
      ) data_sync_reg3 (
      .C  (clk),
      .D  (data_sync2),
      .Q  (data_sync3),
      .CE (1'b1),
      .R  (1'b0)
      );
    
      (* ASYNC_REG = "TRUE", SHREG_EXTRACT = "NO" *)
      FDRE #(
       .INIT (INITIALISE[0])
      ) data_sync_reg4 (
      .C  (clk),
      .D  (data_sync3),
      .Q  (data_sync4),
      .CE (1'b1),
      .R  (1'b0)
      );
    
      assign data_out = data_sync4;
    
    
    endmodule
    
    
    
    //------------------------------------------------------------------------------
    // Title      : Verilog Support Level Module
    // File       : tri_mode_ethernet_mac_0_support.v
    // Author     : Xilinx Inc.
    // -----------------------------------------------------------------------------
    // (c) Copyright 2013 Xilinx, Inc. All rights reserved.
    //
    // This file contains confidential and proprietary information
    // of Xilinx, Inc. and is protected under U.S. and
    // international copyright and other intellectual property
    // laws.
    //
    // DISCLAIMER
    // This disclaimer is not a license and does not grant any
    // rights to the materials distributed herewith. Except as
    // otherwise provided in a valid license issued to you by
    // Xilinx, and to the maximum extent permitted by applicable
    // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
    // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
    // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
    // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
    // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
    // (2) Xilinx shall not be liable (whether in contract or tort,
    // including negligence, or under any other theory of
    // liability) for any loss or damage of any kind or nature
    // related to, arising under or in connection with these
    // materials, including for any direct, or any indirect,
    // special, incidental, or consequential loss or damage
    // (including loss of data, profits, goodwill, or any type of
    // loss or damage suffered as a result of any action brought
    // by a third party) even if such damage or loss was
    // reasonably foreseeable or Xilinx had been advised of the
    // possibility of the same.
    //
    // CRITICAL APPLICATIONS
    // Xilinx products are not designed or intended to be fail-
    // safe, or for use in any application requiring fail-safe
    // performance, such as life-support or safety devices or
    // systems, Class III medical devices, nuclear facilities,
    // applications related to the deployment of airbags, or any
    // other applications that could lead to death, personal
    // injury, or severe property or environmental damage
    // (individually and collectively, "Critical
    // Applications"). Customer assumes the sole risk and
    // liability of any use of Xilinx products in Critical
    // Applications, subject only to applicable laws and
    // regulations governing limitations on product liability.
    //
    // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
    // PART OF THIS FILE AT ALL TIMES.
    // -----------------------------------------------------------------------------
    // Description: This module holds the support level for the Tri-Mode
    //              Ethernet MAC IP.  It contains potentially shareable FPGA
    //              resources such as clocking, reset and IDELAYCTRL logic.
    //              This can be used as-is in a single core design, or adapted
    //              for use with multi-core implementations.
    //------------------------------------------------------------------------------
    
    
    `timescale 1 ps/1 ps
    
    
    //------------------------------------------------------------------------------
    // The entity declaration for the block support level
    //------------------------------------------------------------------------------
    module tri_mode_ethernet_mac_0_support
       (
          input                gtx_clk,
          
          // Reference clock for IDELAYCTRL's
          input                refclk,
    
           // asynchronous reset
          input                glbl_rstn,
          input                rx_axi_rstn,
          input                tx_axi_rstn,
    
          // Receiver Interface
          //--------------------------
          output      [27:0]   rx_statistics_vector,
          output               rx_statistics_valid,
    
          output               rx_mac_aclk,
          output               rx_reset,
          output      [7:0]    rx_axis_mac_tdata,
          output               rx_axis_mac_tvalid,
          output               rx_axis_mac_tlast,
          output               rx_axis_mac_tuser,
    
          output      [4:0]    rx_axis_filter_tuser,
    
          // Transmitter Interface
          //-----------------------------
          input       [7:0]    tx_ifg_delay,
          output      [31:0]   tx_statistics_vector,
          output               tx_statistics_valid,
    
          output               tx_mac_aclk,
          output               tx_reset,
          input       [7:0]    tx_axis_mac_tdata,
          input                tx_axis_mac_tvalid,
          input                tx_axis_mac_tlast,
          input                tx_axis_mac_tuser,
          output               tx_axis_mac_tready,
    
          // MAC Control Interface
          //----------------------
          input                pause_req,
          input       [15:0]   pause_val,
    
          output               speedis100,
          output               speedis10100,
    
          // RGMII Interface
          //----------------
          output      [3:0]    rgmii_txd,
          output               rgmii_tx_ctl,
          output               rgmii_txc,
          input       [3:0]    rgmii_rxd,
          input                rgmii_rx_ctl,
          input                rgmii_rxc,
          output               inband_link_status,
          output      [1:0]    inband_clock_speed,
          output               inband_duplex_status,
    
          
          // MDIO Interface
          //---------------
          inout                mdio,
          output               mdc,
    
          // AXI-Lite Interface
          //---------------
          input                s_axi_aclk,
          input                s_axi_resetn,
    
          input       [11:0] s_axi_awaddr,
          input                s_axi_awvalid,
          output               s_axi_awready,
    
          input       [31:0]   s_axi_wdata,
          input                s_axi_wvalid,
          output               s_axi_wready,
    
          output      [1:0]    s_axi_bresp,
          output               s_axi_bvalid,
          input                s_axi_bready,
    
          input       [11:0] s_axi_araddr,
          input                s_axi_arvalid,
          output               s_axi_arready,
    
          output      [31:0]   s_axi_rdata,
          output      [1:0]    s_axi_rresp,
          output               s_axi_rvalid,
          input                s_axi_rready,
    
          output               mac_irq
    
          );
    
      //----------------------------------------------------------------------------
      // Shareable logic
      //----------------------------------------------------------------------------
    
      // Instantiate the sharable reset logic
      tri_mode_ethernet_mac_0_support_resets  tri_mode_ethernet_mac_support_resets_i (
          .glbl_rstn             (glbl_rstn),
          .refclk                (refclk),
          
          .idelayctrl_ready      (1'b1),
          
          .idelayctrl_reset_out  (idelayctrl_reset)   );
    
       // An IDELAYCTRL primitive needs to be instantiated for the Fixed Tap Delay
       // mode of the IDELAY.
       IDELAYCTRL  #(
          .SIM_DEVICE ("ULTRASCALE")
       )
       tri_mode_ethernet_mac_idelayctrl_common_i (
          .RDY                  (idelayctrl_ready),
          .REFCLK               (refclk),
          .RST                  (idelayctrl_reset)
       );
    
    
       //---------------------------------------------------------------------------
       // Instantiate the TEMAC core block
       //---------------------------------------------------------------------------
      
       tri_mode_ethernet_mac_0_block tri_mode_ethernet_mac_i(
       
          .gtx_clk                     (gtx_clk),
          
           // asynchronous reset
          .glbl_rstn                   (glbl_rstn),
          .rx_axi_rstn                 (rx_axi_rstn),
          .tx_axi_rstn                 (tx_axi_rstn),
    
          // Receiver Interface
          //--------------------------
    
          .rx_statistics_vector        (rx_statistics_vector),
          .rx_statistics_valid         (rx_statistics_valid),
    
          .rx_mac_aclk                 (rx_mac_aclk),
          .rx_reset                    (rx_reset),
          .rx_axis_mac_tdata           (rx_axis_mac_tdata),
          .rx_axis_mac_tvalid          (rx_axis_mac_tvalid),
          .rx_axis_mac_tlast           (rx_axis_mac_tlast),
          .rx_axis_mac_tuser           (rx_axis_mac_tuser),
          .rx_axis_filter_tuser        (rx_axis_filter_tuser),
          // Transmitter Interface
          //-----------------------------
    
          .tx_ifg_delay                (tx_ifg_delay),
          .tx_statistics_vector        (tx_statistics_vector),
          .tx_statistics_valid         (tx_statistics_valid),
    
          .tx_mac_aclk                 (tx_mac_aclk),
          .tx_reset                    (tx_reset),
          .tx_axis_mac_tdata           (tx_axis_mac_tdata),
          .tx_axis_mac_tvalid          (tx_axis_mac_tvalid),
          .tx_axis_mac_tlast           (tx_axis_mac_tlast),
          .tx_axis_mac_tuser           (tx_axis_mac_tuser),
          .tx_axis_mac_tready          (tx_axis_mac_tready),
    
          // MAC Control Interface
          //----------------------
          .pause_req                   (pause_req),
          .pause_val                   (pause_val),
    
          .speedis100                  (speedis100),
          .speedis10100                (speedis10100),
          // RGMII Interface
          //----------------
          .rgmii_txd                   (rgmii_txd),
          .rgmii_tx_ctl                (rgmii_tx_ctl),
          .rgmii_txc                   (rgmii_txc),
          .rgmii_rxd                   (rgmii_rxd),
          .rgmii_rx_ctl                (rgmii_rx_ctl),
          .rgmii_rxc                   (rgmii_rxc),
          .inband_link_status          (inband_link_status),
          .inband_clock_speed          (inband_clock_speed),
          .inband_duplex_status        (inband_duplex_status),
    
           
          // MDIO Interface
          //---------------
          .mdio                        (mdio),
          .mdc                         (mdc),
    
          // AXI-Lite Interface
          //---------------
          .s_axi_aclk                  (s_axi_aclk),
          .s_axi_resetn                (s_axi_resetn),
    
          .s_axi_awaddr                (s_axi_awaddr),
          .s_axi_awvalid               (s_axi_awvalid),
          .s_axi_awready               (s_axi_awready),
    
          .s_axi_wdata                 (s_axi_wdata),
          .s_axi_wvalid                (s_axi_wvalid),
          .s_axi_wready                (s_axi_wready),
    
          .s_axi_bresp                 (s_axi_bresp),
          .s_axi_bvalid                (s_axi_bvalid),
          .s_axi_bready                (s_axi_bready),
    
          .s_axi_araddr                (s_axi_araddr),
          .s_axi_arvalid               (s_axi_arvalid),
          .s_axi_arready               (s_axi_arready),
    
          .s_axi_rdata                 (s_axi_rdata),
          .s_axi_rresp                 (s_axi_rresp),
          .s_axi_rvalid                (s_axi_rvalid),
          .s_axi_rready                (s_axi_rready),
    
          .mac_irq                     (mac_irq)
    
        );
    
    
    endmodule
     
    
    
    # PART is virtexu xcvu440flga2892
    
    ############################################################
    # Clock Period Constraints                                 #
    ############################################################
    
    ############################################################
    # RX Clock period Constraints (per instance)               #
    ############################################################
    # Receiver clock period constraints: please do not relax
    create_clock -period 8 [get_ports rgmii_rxc]
    
    #
    ####
    #######
    ##########
    #############
    #################
    #BLOCK CONSTRAINTS
    
    ############################################################
    # Physical Interface Constraints
    ############################################################
    
    ############################################################
    # The following are required to maximise setup/hold        #
    ############################################################
    
    set_property SLEW FAST [get_ports {rgmii_txd[3] rgmii_txd[2] rgmii_txd[1] rgmii_txd[0] rgmii_tx_ctl rgmii_txc}]
    
    
    ############################################################
    # RGMII: IODELAY Constraints
    ############################################################
    # Please modify the value of the IDELAY_VALUE/ODELAY_VALUE
    # according to your design.
    # For more information on IDELAYCTRL and IODELAY, please
    # refer to the User Guide.
    #
    # Apply the same DELAY_VALUE to all RGMII RX inputs.
    # DELAY_VALUE is the time represenatation of the desired delay in ps
    # This is to provide a similiar Clock Path and Data Path delay.
    set_property DELAY_VALUE 900  [get_cells {tri_mode_ethernet_mac_i/rgmii_interface/delay_rgmii_rx* tri_mode_ethernet_mac_i/rgmii_interface/rxdata_bus[*].delay_rgmii_rx*}]
    # Group IODELAY components
    set_property IODELAY_GROUP tri_mode_ethernet_mac_iodelay_grp [get_cells {tri_mode_ethernet_mac_i/rgmii_interface/delay_rgmii_tx* tri_mode_ethernet_mac_i/rgmii_interface/txdata_out_bus[*].delay_rgmii_tx*}]
    set_property IODELAY_GROUP tri_mode_ethernet_mac_iodelay_grp [get_cells {tri_mode_ethernet_mac_i/rgmii_interface/delay_rgmii_rx* tri_mode_ethernet_mac_i/rgmii_interface/rxdata_bus[*].delay_rgmii_rx*}]
    set_property IODELAY_GROUP tri_mode_ethernet_mac_iodelay_grp [get_cells  {tri_mode_ethernet_mac_idelayctrl_common_i}]
    
    # IDELAYCTRL reset input is false path
    set_false_path -to [get_pins -filter {REF_PIN_NAME =~ RST} -of [get_cells tri_mode_ethernet_mac_idelayctrl_common_i*]]
    
    #
    ####
    #######
    ##########
    #############
    #################
    #CORE CONSTRAINTS
    
    
    
    ############################################################
    # Crossing of Clock Domain Constraints: please do not edit #
    ############################################################
    
    # control signal is synced separately so we want a max delay to ensure the signal has settled by the time the control signal has passed through the synch
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/rx_pause/pause*to_tx_reg[*]}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/tx_pause/count_set*reg}] 32 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/rx_pause/pause*to_tx_reg[*]}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/tx_pause/pause_count*reg[*]}] 32 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/rx_pause/pause_req_to_tx_int_reg}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/flow/tx_pause/sync_good_rx/data_sync_reg0}] 6 -datapath_only
    
    
    
    
    # set a false path for the clock path from the address filter dist rams
    # the paths we care about timing are either the write interface OR the read interface
    # this path is from the write to the read which should be ignored
    set_false_path -from [get_cells -hierarchical -filter {NAME =~ *tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/address_filter_inst/*/DP}] -to  [get_cells -hierarchical -filter {NAME =~ *tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/address_filter_inst/*addr*/bit_match*reg[*]}]
    
    # false path due to synced control path
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/rd_data_ref_reg[*]}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/ip2bus_data_reg[*]}] 6 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/response_toggle_reg}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/sync_response/data_sync_reg0}] 6 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/request_toggle_reg}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*statistics_counters/sync_request/data_sync_reg0}] 6 -datapath_only
    
    
    ############################################################
    # Ignore paths to resync flops
    ############################################################
    set_false_path -to [get_pins -filter {REF_PIN_NAME =~ PRE} -of [get_cells -hier -regexp {.*/async_rst.*}]]
    set_false_path -to [get_pins -filter {REF_PIN_NAME =~ CLR} -of [get_cells -hier -regexp {.*/async_rst.*}]]
    set_false_path -to [get_pins -filter {REF_PIN_NAME =~ PRE} -of [get_cells -hier -regexp {.*/reset_sync.*}]]
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/addr_regs.promiscuous_mode_reg_reg}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/address_filter_inst/resync_promiscuous_mode/data_sync_reg0}] 6 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/addr_regs.filter_enable_reg_reg[*]}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/address_filter_inst/address_filters[*].sync_enable/data_sync_reg0}] 6 -datapath_only
    set_max_delay -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/conf/update_pause_ad_int_reg}] -to [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/addr_filter_top/address_filter_inst/sync_update/data_sync_reg0}] 6 -datapath_only
    
    
    # the mdio interface is clocked from the axi clock but the clock is so slow is can be considered to be data
    # the data related outputs are output on the falling edge of the MDC output so both can simply be considered to be multicycle paths
    set_multicycle_path 10 -setup -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.miim_clk_int_reg}  ] -throu [get_ports mdc]
    set_multicycle_path 9 -hold -from   [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.miim_clk_int_reg}  ] -throu [get_ports mdc]
    set_multicycle_path 10 -setup -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.phy/enable_reg_reg}] -throu [get_ports mdc]
    set_multicycle_path 9 -hold -from   [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.phy/enable_reg_reg}] -throu [get_ports mdc]
    set_multicycle_path 10 -setup -from [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.phy/mdio*reg}      ] -throu [get_ports mdio]
    set_multicycle_path 9 -hold -from   [get_cells {tri_mode_ethernet_mac_i/tri_mode_ethernet_mac_0_core/*managen/mdio_enabled.phy/mdio*reg}      ] -throu [get_ports mdio]
    # mdio has timing implications but slow interface so relaxed
    set_false_path  -to [get_cells -hier -filter {NAME =~ *managen/mdio_enabled.phy/mdio_in_reg1_reg}]
    
    
    
    

    ------------------------------------------------------------

    clock_dedicated_route backbone

      -----------------------------------------------------------

      "如果时钟输入引脚需要驱动不同时钟域的CMT(MMCM/PLL)模块,那么约束CLOCK_DEDICATED_ROUTE=BACKBONE是必须的。 是什么情况会导致时钟输入与CMT不在一个时钟域呢?当一组外部接口时序,其时钟信号输入FPGA的一个I/O Bank,而相应的数据信号则在另一个I/O Bank输入,并且此时需对时钟信号进行分频,分频后的时钟用作输入数据的采集。"

    ---------------------------------------------------------------

    xilinx的时钟架构设计

    ----------------------------------------------------------------

    IDELAYCTRL

    转载:

    https://zhuanlan.zhihu.com/p/91843786

    https://zhuanlan.zhihu.com/p/117290284

  • 相关阅读:
    mybatis-plus物理分页插件使用
    mybatis-plus提供支持ActiveRecord模式
    mybatis-plus通用Service
    mybatis-plus返回查询总记录数
    Mybatis-Plus查询返回Map类型数据
    Mybatis-Plus条件构造器condition动态判断条件
    Mybatis-Plus条件构造器select方法返回指定字段
    mybatis-plus条件构造器UpdateWrapper实例
    mybatis-plus条件构造器QueryWrapper实例
    这玩意比ThreadLocal叼多了,吓得why哥赶紧分享出来。
  • 原文地址:https://www.cnblogs.com/time93/p/13246402.html
Copyright © 2011-2022 走看看