其他分享
首页 > 其他分享> > XILINX KU系列三速以太网IP核RGMII时序约束方法

XILINX KU系列三速以太网IP核RGMII时序约束方法

作者:互联网

1概述

基于RGMII时序广泛应用于以太网通信中,基于XILINX的三速以太网时序分析,不同的XILINX系列方法不一样。当使用2路以上以太网通信,KU系列FPGA的MAC核需要进行修改,以支持2路以太网和满足时序要求。以下笔者对修改的部分进行说明,希望对广大开发者有所帮助,如果有不对的地方欢迎指针。

2代码修改

主要针对以上三个文件修改,详细的可以打开我们的配套工程阅读代码,下图是第一个以太网的三个文件

tri_mode_ethernet_mac_1_rgmii_v2_0_if.v文件关键部分修改如下:

发送部分odelay3的代码修改,原来默认的代码对于rgmii_tx发送时序调整是通过级联一个idelay3模块来实现,这里注释掉级联的idelay3模块,默认为" TIME"模式最大是1ns延迟调整,修改odelay3模块的delay模式为"COUNT模式",这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整

// 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      (300),

      .DELAY_FORMAT     ("COUNT"),     // Units of the DELAY_VALUE (COUNT, TIME)  

       

      .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      (1'b0),

      .CASC_OUT         (),

      .EN_VTC           (1'b1)

   );

/*

 IDELAYE3 #(

      .DELAY_VALUE      (320),

      .DELAY_TYPE       ("FIXED"),

      .CASCADE          ("SLAVE_END"),

      .REFCLK_FREQUENCY (333.333),

      .SIM_DEVICE       ("ULTRASCALE_PLUS")

       

  )

  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.

 

   assign gmii_txd_falling = txd_from_mac[7:4];

 

   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

 

同理,接收部分idelay3的代码修改,原来默认为" TIME"模式最大是1ns延迟调整,修改idelay3模块的delay模式为"COUNT模式",这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整

IDELAYE3 #(

      .DELAY_FORMAT     ("COUNT"),     // Units of the DELAY_VALUE (COUNT, TIME)

      .DELAY_TYPE       ("FIXED"),

      .REFCLK_FREQUENCY (333.333),

      .DELAY_VALUE      (330),           // Input delay value setting

      .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_FORMAT     ("COUNT"),     // Units of the DELAY_VALUE (COUNT, TIME)        

          .DELAY_TYPE       ("FIXED"),

          .REFCLK_FREQUENCY (333.333),

          .DELAY_VALUE      (330),           // Input delay value setting

          .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

下图是第二个以太网的三个文件,由于需要贡献一部分FPGA的delay_ctr资源,他们的代码稍微有点差异。

修改方法和第一个以太网修改方法一样

ODELAYE3 #(

       

      .DELAY_VALUE      (300),

      .DELAY_FORMAT     ("COUNT"),     // Units of the DELAY_VALUE (COUNT, TIME)  

       

      .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      (1'b0),

      .CASC_OUT         (),

      .EN_VTC           (1'b1)

   );

/*

 IDELAYE3 #(

      .DELAY_VALUE      (320),

      .DELAY_TYPE       ("FIXED"),

      .CASCADE          ("SLAVE_END"),

      .REFCLK_FREQUENCY (333.333),

      .SIM_DEVICE       ("ULTRASCALE_PLUS")

       

  )

  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.

 

   assign gmii_txd_falling = txd_from_mac[7:4];

 

   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

接收部分

  IDELAYE3 #(

      .DELAY_FORMAT     ("COUNT"),

      .DELAY_TYPE       ("FIXED"),

      .REFCLK_FREQUENCY (333.333),

      .DELAY_VALUE      (250),           // Input delay value setting              

      .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_FORMAT     ("COUNT"),

          .DELAY_TYPE       ("FIXED"),

          .REFCLK_FREQUENCY (333.333),

          .DELAY_VALUE      (250),           // Input delay value setting              

          .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

 

以上也能看出第二个以太网和第一个以太网的时序调整有所差异。

3约束文件修改

由于我们在tri_mode_ethernet_mac_1_rgmii_v2_0_if.v中完成了时序的调整,因此需要注释以下约束

时序约束部分修改和硬件上PHY的delay延迟设置有关系,米联客的FPGA的PHY以太网芯片rx 有2ns延迟,tx没有2ns延迟。因此rgmii_rx数据是源同步中心对齐方式分析,而rgmii_tx数据是源源步边沿对齐方式分析,米联客使用的是RTL8211FD芯片,关键的时序参数如下:

因此给出如下时序约束:

############################################################

# RX Clock period Constraints (per instance)               #

############################################################

# Receiver clock period constraints: please do not relax

set rx_clk [get_clocks -of [get_ports rgmii_rxc]]

 

############################################################

# Obtain input clocks from top level XDC                         #

############################################################

set ip_gtx_clk     [get_clocks -of_objects [get_ports gtx_clk]]

 

#

####

#######

##########

#############

#################

#BLOCK CONSTRAINTS

 

############################################################

# For Setup and Hold time analysis on RGMII inputs         #

############################################################

 

# define a virtual clock to simplify the timing constraints

create_clock -name [current_instance .]_rgmii_rx_clk -period 8

set rgmii_rx_clk [current_instance .]_rgmii_rx_clk

 

# Identify RGMII Rx Pads only.  

# This prevents setup/hold analysis being performed on false inputs,

# eg, the configuration_vector inputs.

 

set_input_delay -clock [get_clocks $rgmii_rx_clk] -max -1.5 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

set_input_delay -clock [get_clocks $rgmii_rx_clk] -min -2.5 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -max -1.5 -add_delay [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -min -2.5 -add_delay [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

 

set_false_path -rise_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -setup

set_false_path -fall_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -setup

set_false_path -rise_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -hold

set_false_path -fall_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -hold

 

set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -setup 0

set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -hold -1

 

############################################################

# For Setup and Hold time analysis on RGMII outputs        #

############################################################

 

create_generated_clock -name [current_instance .]_rgmii_tx_clk -divide_by 1 -source [get_pins {tri_mode_ethernet_mac_i/rgmii_interface/rgmii_txc_ddr/C}] [get_ports rgmii_txc]

set rgmii_tx_clk [current_instance .]_rgmii_tx_clk

 

set_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd[*] rgmii_tx_ctl}]

set_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd[*] rgmii_tx_ctl}]

set_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd[*] rgmii_tx_ctl}] -clock_fall -add_delay

set_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txd[*] rgmii_tx_ctl}] -clock_fall -add_delay

 

set_false_path -rise_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -setup

set_false_path -fall_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -setup

set_false_path -rise_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -hold

set_false_path -fall_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -hold

 

set_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] 0 -setup

set_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] -1 -hold

 

这里时序分析是比较难理解的部分,尤其是根据datasheet分析时序要求,更多的关于时序相关的内容,请看米联客时序课程相关内容。

附录:常见问题

1联系方式

米联客官方社区:www.uisrc.com

 

米联客社区FPGA/SOC QQ群:

群1:516869816         群2:543731097

群3:86730608         群4:34215299

 

技术微信:18951232035

技术电话:18951232035

 

官方微信公众号(新微信公众号):

2售后

1、7天无理由退货(人为原因除外)

2、质保期限:本司产品自快递签收之日起,提供一年质保服务(主芯片,比如FPGA 或者CPU等除外)。

3、维修换货,需提供淘宝订单编号或合同编号,联系销售/技术支持安排退回事宜。

售后维修请登录工单系统:https://www.uisrc.com/plugin.php?id=x7ree_service

4、以下情形不属于质保范畴。

A:由于用户使用不当造成板子的损坏:比如电压过高造成的开发板短路,自行焊接造成的焊盘脱落、铜线起皮 等

B:用户日常维护不当造成板子的损坏:比如放置不当导致线路板腐蚀、基板出现裂纹等

5、质保范畴外(上方第4条)及质保期限以外的产品,本司提供有偿维修服务。维修仅收取器件材料成本,往返运 费全部由客户承担。

6、寄回地址,登录网页获取最新的售后地址:https://www.uisrc.com/t-1982.html

3销售

天猫米联客旗舰店:https://milianke.tmall.com

京东米联客旗舰店:https://milianke.jd.com/

米联客生态淘宝店:https://milianke.taobao.com

 

销售电话:18921033576

 

公司地址:常州溧阳总部:常州溧阳市中关村吴潭渡路雅创高科智造谷10-1幢楼

南京研发基地:南京市栖霞区仙林大道181号5幢1820室

4在线视频

https://www.uisrc.com/video.html

5软件下载

https://www.uisrc.com/f-download.html

6经验分享

https://www.uisrc.com/f-390.html

7官方博文

https://www.uisrc.com/portal.php?mod=list&catid=35

 

 

标签:tx,三速,clk,IP,get,delay,b0,rgmii,以太网
来源: https://www.cnblogs.com/milianke/p/16589526.html