问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 10 人浏览分享

开启左侧

第10章 千兆以太网RGMII接口约束实例

[复制链接]
10 0
10.1 RGMII接口
       PHY芯片的MII接口有很多种,例如MII、GMII、RGMII、SGMII、XGMII、TBI、RTBI等。其中RMGII的主要优势在于,它可同时适用于1000M、100M、10M三种速率,而且接口占用引脚数较少。但也存在缺点,其一,PCB布线时需要尽可能对数据、控制和时钟线进行等长布线。其二、对其时序约束较为严格。
image.jpg
10.1.1 RGMII信号定义
       RGMII接口使用4bit数据接口采用上下沿DDR的方式在 一个时钟周期内传输8bit数据信号,即上升沿发送或者接收数据的低4bit,下降沿发送或者接收数据的高4bit。同理,使用1bit控制接口采用DDR的方式在一个时钟周期内传输2bit控制信号,即在上升沿发送或者接收数据使能信号(TX_EN、RX_DV),下降沿发送数据错误信号与使能信号的逻辑异或值(TX_ERR xor TX_EN、RX_ERR xor RX_DV),根据该信号可以计算出相应的数据错误信号。
发送端:
·TXC:发送数据信号和控制信号对应的同步时钟信号(125M、25M、2.5M)。
·TXD[3:0]:发送数据信号,4bit位宽。
·TX_CTL:发送控制信号。
发送端信号时序如下图所示。
image.jpg
接收端:
·RXC:接收数据信号和控制信号对应的同步时钟信号(125M、25M、2.5M)。
·RXD[3:0]:接收数据信号,4bit位宽。
·RX_CTL:接收控制信号。
接收端信号时序如下图所示。
image.jpg

10.1.2 RGMII接口信号组合定义
发送端:关于发送端TX_EN(GMII_TX_EN)、TX_ERR(GMII_TX_ER)、TXD[7:0]信号不同组合对应的含义如下图表所示。
image.jpg
       在大部分应用中,我们只需要关注最后两种即可,当TX_CTL上升沿和下降沿均为1时,表示数据有效。当TX_CTL上升沿为1,下降沿为0时,表示当前时钟周期的8bit数据错误。
接收端:同理接收端关于RX_EN(GMII_RX_EN)、RX_ERR(GMII_RX_ER)、RXD[7:0]信号不同组合对应的含义如下图表所示。
image.jpg
       与发送端类似,我们首先需要关注最后两种,即当RX_CTL上升沿和下降沿均为1时,表示数据有效。当RX_CTL上升沿为1,下降沿为0时,表示当前时钟周期数据错误。除此之外,表中前三项是很有意义的组合类型,这也是RGMII接口可以同时支持1000M/100M/10M三种速率的重要因素。它利用数据帧(frame)之间的发送间隔传递当前连接的状态信息。通过这些信息可以判断当前链路的状态、速率、双工情况。

10.1.3 RGMII接口的三种速率模式
RGMII 接口适用亍 1000M 、100M 、10M 三种传输速率。
当工作于1000M时,时钟信号TXC和RXC均为125MHz,4bit数据信号上下沿值均有效,控制信号上下沿值也均有效。
当工作于100M时,时钟信号 TXC 和 RXC 均为 25MHz ,4bit数据信号只有上升沿值[3:0]有效,相当于此时数据 信号切换为单沿SDR(Single Data Rata)4位传输模式。控制信号仍为上下沿有效。
当工作于10M时,时钟信号TXC和RXC均为2.5MHz,数据信号和控制信号的使用和100M速率时完全相同。


10.2 RGMII接口时序
       对于FPGA来说,RGMII接口是一种典型的DDR源同步接口。当RGMII接口工作在1000M速率时,TXC和RXC时钟信号都为125MHz,那么单个接口的速率便等同于250Mbps,单个信号的有效数据窗口最大为4ns。在FPGA中设计高速源同步接口的重点在于时序控制和时序约束。
10.2.1 发送端
一般的PHY芯片都支持两种RGMII发送端口的时序关系。一种称为非延时模式,如下图所示。
image.jpg
       即要满足时钟信号TXC的边沿对准数据信号TXD[3:0]和控制信号TX_CTL有效窗口中心附近的位置,也就是说TXC比其他信号存在2ns(90°相位)左右的延时。
另一种为延时模式,如下图所示。
image.jpg
       这种时序要求TXC的边沿与其发送的数据TXD和控制信号TX_CTL边沿对齐,所有信号具有相同的相位。一般来说,大部分PHY芯片默认都是采用正常时序模式,可以通过MDIO接口设置寄存器,或者芯片特殊功能引脚将其配置为延时模式。

10.2.2 接收端
       RGMII接收端口同样也存在两种时序关系,同为非延时和延时模式。非延时模式如下图所示。此时,时钟信号RXC与RXD和RX_CTL边沿对齐,具有相同的相位。
image.jpg
延时模式时序关系如下图所示。
image.jpg
       此时,要满足时钟信号RXC的边沿对准数据信号RXD[3:0]和控制信号RX_CTL有效窗口中心附近的位置,即RXC比其它信号存在2ns(90°相位)左右的延时。一般来说,PHY芯片默认即可能是延时模式也有可能是非延时模式,客通过MDIO接口设置相应的寄存器,或者芯片特殊功能引脚改变PHY芯片的RGMII接口时序模式。


10.2.3 B50610 RGMII接口PHY
RGMII发送接口时序,该芯片RGMII发送接口默认使用的是延时模式,由如下寄存器决定。
image.jpg
延迟模式RGMII发送接口时序关系如下图所示。
image.jpg
RGMII接收接口时序,此芯片接收接口默认也是采用了延时模式,默认寄存器设置如下:
image.jpg
B50610芯片延时模式RGMII接收接口时序关系如下图所示。
image.jpg


10.2.4 88E1518 RGMII接口PHY
88E1518 RGMII发送接口时序,该芯片RGMII发送接口默认使用的是延时模式,由如下寄存器的值决定。
image.jpg
延时模式RGMII发送接口时序关系如下图所示。
image.jpg
88E1518 RGMII接收接口时序,该芯片RGMII接收接口默认使用的也是延时模式,由如下寄存器的值决定。
image.jpg
延时模式RGMII接收接口时序关系如下图所示。
image.jpg


10.2.5 RTL8211 RGMII接口PHY
       具体型号以RTL8211FD通过设置引脚为上拉或者下拉来设置延迟,以下是发送或者接收及接口的延时设置。
image.jpg
       从下图中我们发现RTL8211描述的发送delay和前面的B50610以及88E1518描述的不一样,RTL8211在delay模式下数据setup是正值,说明建立时间在时钟上升沿之前。而B50610以及88E1518在delay模式下建立时间是负值,说明是在时钟沿之后。
image.jpg
image.jpg
image.jpg


10.3 RGMII接口时序约束
       以米联客UDP协议栈程序为例,对以太网RGMII接口进行时序约束。由于RGMII接口有一套标准的时序规范,故不同PHY芯片的约束可以互相套用,下面使用88E1518芯片,参照其数据手册进行约束实战。
10.3.1 RX接口延时模式约束
       首先对输入时钟进行约束,RX接口的时钟频率为125MHz。使用Eidt Timing Constraints,添加create_clock约束,将时钟命名为rx_clk,周期为8ns。生成的约束如下:
create_clock -period 8.000 -name rx_clk -waveform {0.000 4.000} [get_ports I_a_rgmii_rxc]
       RGMII的RX接口默认使用延时模式,数据和时钟到达FPGA输入管脚时会有2ns的延迟,时钟边沿在数据的中间位置。参照手册中的关系,应当使用源同步双沿采样中心对齐的模板。
image.jpg
       由上图可以得到,dv_bre = 1.2ns,dv_are = 1.2ns,dv_bfe = 1.2ns,dv_afe = 1.2ns,根据以上信息,我们可以做出如下约束:
set_input_delay -clock [get_clocks rx_clk] -rise -min 1.200 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd
set_input_delay -clock [get_clocks rx_clk] -rise -max 2.800 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -min -add_delay 1.200 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -max -add_delay 2.800 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd
       写入约束后,重新进行布局布线,查看时序报告。
image.jpg
image.jpg
       建立时间的裕量还有很多,而保持时间的为负,我们点开hold路径的详细报告,查询时序违例的原因,以此来选择合适的优化策略。
image.jpg
       由上图可知保持时间违例的原因是数据从接口到IDDR的走线很短,导致延时很小,这就需要使用IDELAY来增加数据的延时,接收数据RXD和控制信号RX_CTL都增加延迟。
image.jpg image.jpg
       设置IDELAY_VALUE的值为10,输入信号经过IDELAY后固有延迟为0.6ns,对于200M的参考时钟其抽头系数tap的分辨率为78ps。计算出数据经过IDELAY的延迟应当为0.6 + 0.078*10 = 1.38ns,时序分析工具在计算时,IDELAY的延迟为1.195ns,最终结果满足保持时间要求。
image.jpg

10.3.2 RX接口非延时模式约束
       对于非延迟模式下的RX接口,手册中数据和时钟的关系如下图,由于发射沿和锁存沿是同一个时钟沿,应当使用源同步双沿采样边沿对齐,时钟不经过PLL的模板。
image.jpg
由上图可以得到,skew_bre = 0.5,skew_are = 0.5,根据以上信息,约束如下:
set_input_delay -clock [get_clocks rx_clk] -rise -min 3.500 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd}]
set_input_delay -clock [get_clocks rx_clk] -rise -max 4.500 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -min -add_delay 3.500 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd}]
set_input_delay -clock [get_clocks rx_clk] -clock_fall -fall -max -add_delay 4.500 [get_ports {I_a_rgmii_rx_ctl I_a_rgmii_rxd}]
       重新布局布线后得到的时序报告如下:
image.jpg
image.jpg
      建立时间裕量为负,这是因为时钟的延时太小,采样不到数据。在程序中我们保留了上一次分析中添加的IDELAY原语,这给数据带来了1.291ns的延时,而建立时间的裕量为-1.278,把IDELAY删掉就可以满足建立时间的要求了。
       如果出现这样一种情况,没有IDELAY后仍然不满足时序要求,那数据的延时就没有减小的空间了,这样就只能增大时钟的延时。时钟路径中,外部时钟通过BUFIO来驱动IDDR原语,而BUFIO在IOBANK中,延迟最小。如果把BUFIO换成BUFG,时钟的延时可以再增加1ns左右。

10.3.3 TX接口延时模式约束
       PHY的TX接口使用延时模式的情况,TXC的时钟信号由系统主时钟通过MMCM输出125MHz的clk_out2时钟,再经过ODDR原语输出。MMCM产生的时钟如下图。
image.jpg
gmii_tx_clk_d改为clk_125
image.jpg
需要对TX接口的时钟做生成时钟约束,约束命令如下:
create_generated_clock -name tx_clk -source [get_pins clk_wiz_0_inst/clk_out2] -multiply_by 1 [get_ports O_a_rgmii_txc]
       数据手册中,使用延时模式下TX接口数据和时钟的关系如下图所示。
image.jpg
       采用源同步双沿采样,基于目标器件的建立时间和保持时间计算输出延迟的约束模板,约束命令如下:
set_output_delay -clock [get_clocks tx_clk] -rise -min -2.700 [get_ports {O_a_rgmii_tx_ctl O_a_rgmii_txd}]
set_output_delay -clock [get_clocks tx_clk] -rise -max -0.900 [get_ports {O_a_rgmii_tx_ctl O_a_rgmii_txd}]
set_output_delay -clock [get_clocks tx_clk] -clock_fall -fall -min -add_delay -2.700 [get_ports {O_a_rgmii_tx_ctl O_a_rgmii_txd}]
set_output_delay -clock [get_clocks tx_clk] -clock_fall -fall -max -add_delay -0.900 [get_ports {O_a_rgmii_tx_ctl O_a_rgmii_txd}]

重新布局布线后,得到的时序报告中出现了保持时间违例。
image.jpg
点开详细报告查找原因,下图1是保持时间时序报告,图2是建立时间时序报告。
image.jpg
image.jpg
通过分析报告可以知道,时序分析工具在分析保持时间关系时,实际上是按照下图进行分析的。
image.jpg
但是我们预期的结果应该是发送的数据被相同的边沿采样,即上升沿采样上升沿发送的数据,下降沿采样下降沿发送的数据,才能保证数据被正确恢复,需要让工具按照下图进行分析。
image.jpg
要让工具按照我们的预期进行分析,就需要使用多周期约束,将目的时钟锁存沿提前一个沿,约束命令如下:
set_multicycle_path -setup -rise_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -rise_to [get_clocks tx_clk] 0
set_multicycle_path -setup -fall_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -fall_to [get_clocks tx_clk] 0
时序报告如下,进行多周期约束后,时序分析工具按照我们的预期进行分析,并且时序没有出现违例。
image.jpg
image.jpg

10.3.4 TX接口非延时模式约束
       该模式下由于时钟PHY内部没有2ns延时,需要在FPGA内部将时钟延时。产生输出数据的逻辑由125MHz的时钟驱动,该时钟为主时钟通过MMCM生成的clk_out2。我们再生成一个有90°相移的125MHz时钟clk_out3,该时钟作为TX接口输出的时钟。对该时钟进行生成时钟约束,命令如下:
create_generated_clock -name tx_clk -source [get_pins clk_wiz_0_inst/clk_out3] -multiply_by 1 [get_ports O_a_rgmii_txc]
数据手册中,非延时模式下TX接口数据和时钟的关系如下图所示。
image.jpg
采用源同步双沿采样,基于目标器件的建立时间和保持时间计算输出延迟的约束模板,约束命令如下:
set_output_delay -clock [get_clocks tx_clk] -rise -min -0.800 [get_ports {O_a_rgmii_tx_ctl {O_a_rgmii_txd}}]
set_output_delay -clock [get_clocks tx_clk] -rise -max 1.000 [get_ports {O_a_rgmii_tx_ctl {O_a_rgmii_txd}}]
set_output_delay -clock [get_clocks tx_clk] -clock_fall -fall -min -add_delay -0.800 [get_ports {O_a_rgmii_tx_ctl {O_a_rgmii_txd}}]
set_output_delay -clock [get_clocks tx_clk] -clock_fall -fall -max -add_delay 1.000 [get_ports {O_a_rgmii_tx_ctl {O_a_rgmii_txd}}]

重新布局布线后,并没有出现时序违例,但其中存在着错误的报告。
image.jpg
有些路径分析出来的裕量很大,我们点进裕量为4.178的详细报告中查看原因。
image.jpg
       分析报告可知,产生这么大裕量的原因是,时序分析工具错误地分析了建立时间的发射沿和锁存沿关系,在这份报告中,是按照下图中蓝线的关系分析的。实际上我们想让工具按照下图中红线的关系进行分析。
image.jpg
工具会根据裕量最小的情况进行布局布线,因此上面的错误其实并不影响最终实现的结果。但是分析这些路径会消耗工具布线的时间,因此,我们需要使用伪路径约束让工具不分析这些路径,约束命令如下:
set_false_path -setup -rise_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -fall_to [get_clocks tx_clk]
set_false_path -setup -fall_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -rise_to [get_clocks tx_clk]
set_false_path -hold -rise_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -rise_to [get_clocks tx_clk]
set_false_path -hold -fall_from [get_clocks -of_objects [get_pins clk_wiz_0_inst/inst/mmcm_adv_inst/CLKOUT1]] -fall_to [get_clocks tx_clk]
约束完成后,时序分析工具不再对这些路径进行分析。
image.jpg
       至此,对RGMII接口各种情况的时序分析都做完了。时序约束无非就是查看数据手册,套模板,然后根据时序报告具体问题具体分析。其实掌握了以上内容,其它接口的时序分析就没有什么问题了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

10

粉丝

78

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版