自学内容网 自学内容网

以太网详解(五)GMII、RGMII、SGMII接口时序约束(Quartus 平台)

接口时序

Avalon Streaming 接口时序

Receive Timing

在这里插入图片描述
接收操作出现长度错误时的时序图:
在这里插入图片描述
rx_err[5:0]:接收错误。在帧中的最后一个字节拉高,以指示在接收帧时检测到错误。具体错误信息如下表所示:

BitDescription
5冲突(collision)错误。在半双工链路上,发送数据帧之前会先探测链路是否空闲。但是,有可能两个不同的终端都检测到了链路空闲,而后都开始发送数据帧。这样,两个数据帧就会在链路上发生冲突。严格来讲, collision 并不是错误帧,而是 CSMA/CD 机制必然导致的事件。半双工以太网中,出现 collision 错误通常是正常现象。
4由于 PHY 或 PCS 错误导致的接收帧损坏。当在 MII/GMII/RGMII 上检测到错误时拉高。
3截断的接收帧。当接收帧由于接收 FIFO 缓冲区溢出而被截断时拉高。
2CRC 错误。当收到带有 CRC-32 错误的帧时拉高。此错误位仅适用于具有有效长度的帧。
1无效长度错误。当接收帧的长度不符合 IEEE 标准 802.3 的规定时拉高。帧长度必须至少为 64(0x40)字节,并且不超过不同帧类型的最大值。
0接收帧错误。表示发生了错误。它是 rx_err[5:1] 的逻辑或。

Transmit Timing

在这里插入图片描述

GMII 接口时序

Receive Timing

在接收时,所有信号都在 rx_clk 的上升沿上采样。GMII 数据使能信号 gm_rx_dv 由 PHY 断拉高,表示新帧的开始,并保持高状态,直到帧的最后一个字节出现在 gm_rx_d[7:0] 总线上。帧之间,gm_rx_dv 保持拉低。

如果 PHY 检测到从线路接收到的帧有错误,则 PHY 在帧传输期间的任何时间拉高 GMII 错误信号 gm_rx_err 至少一个时钟周期。

在 GMII 接口上接收到的带有 PHY 错误指示的帧随后在 Avalon streaming 接口上传输,错误信号 rx_err[0] 拉高。

Transmit Timing

在传输时,所有数据传输都与 tx_clk 的上升沿同步。GMII 数据使能信号 gm_tx_en 被拉高来指示新帧的开始,并保持高状态,直到该帧的最后一个字节出现在 gm_tx_d[7:0] 总线上。帧之间,gm_tx_en 保持拉低状态。

如果在 Avalon streaming 接口上接收到一个带有错误的帧(ff_tx_eop 拉高),则在帧传输期间的任何时间,GMII gm_tx_err 信号将拉高。

RGMII 接口时序

Receive Timing

在接收时,在 rx_clk 的双沿采样所有信号。RGMII 控制信号 rx_control 由 PHY 拉高,以指示新帧的开始,并保持高状态,直到帧的最后一个字节在 rgmii_in[3:0] 总线上出现。帧之间,rx_control 保持拉低状态。
在这里插入图片描述
在 RGMII 接口上接收到带有 PHY 错误指示的帧,随后在 Avalon streaming 接口上传输错误信号 rx err[0]。
在这里插入图片描述
注意,rx_clk 的上升沿会延后与数据 90° 以确保数据被正确采样。

Transmit Timing

在传输时,所有数据传输都同步到 tx_clk 的双沿。RGMII 控制信号 tx_control 被拉高来指示新帧的开始,并保持高状态,直到 rgmii_out[3:0] 总线上出现帧的最后一个字节。帧之间,tx_control 保持拉低状态。
在这里插入图片描述
如果在 Avalon streaming 接口上接收到一个错误的帧(ff_tx_err 在 ff_tx_eop 拉高),则该帧随后在帧传输期间的任何时间与 RGMII tx_control 信号(在 tx_clk 的下降沿)一起传输。如下图所示:
在这里插入图片描述

如何创建 .sdc 约束文件

三速以太网系统时钟信号

在生成三速以太网 Intel FPGA IP 并将其集成到系统中之后,您需要创建一个时序约束文件来指定时钟约束需求。

一个简单的三速以太网系统如下图所示:
在这里插入图片描述
整个三速以太网系统主要有以下四组时钟:

  • clk:MAC 配置时钟,一般由 PLL 产生,接到 PLL 输出。
  • ff_tx_clk,ff_rx_clk:Avalon streaming 时钟,MAC 传输接口的数据同步时钟,一般由 PLL 产生,接到 PLL 输出。
  • tx_clk,rx_clk:GMII、RGMII 模式下收发器参考时钟,与 gm_tx_c,gm_rx_c 连接。其中,gm_rx_c 由外部 PHY 芯片提供,接到 FPGA 专用参考时钟引脚。时钟由 PLL 产生,既给 tx_clk 提供时钟,又给外部 PHY 芯片提供时钟 gm_tx_c,如下图所示。
  • ref_clk:SGMII 模式下收发器参考时钟,必须接到 FPGA 专用参考时钟引脚,且必须与 SGMII 的 TX、RX 位于同一个 bank,不可以接到 PLL 输出。SGMII without CLK 模式下,接的是外部 125Mhz 晶振。

在这里插入图片描述
需要注意的是,由于 RGMII 1000 Mbps 采用 DDR 模式传输数据,所以 PLL 需要输出两个不同的时钟,一个既给 tx_clk 提供时钟,一个给外部 PHY 芯片提供时钟 rgmii_txc。这两个时钟的关系为:

  • 核心 TX 时钟(英特尔® FPGA):125 MHz、25 MHz 和 2.5 MHz。
  • RGMII_TX_Clock(外部 PHY):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º。

GMII、RGMII 模式下各时钟频率范围如下表所示
在这里插入图片描述
SGMII 模式下各时钟频率范围如下表所示
在这里插入图片描述
需要注意的是,不同的 FIFO 位宽需要匹配不同的 ff_tx_clk,ff_rx_clk 时钟频率

创建 set_input_delay,set_output_delay 约束

由于 GMII、RGMII 接口为并行接口,所以需要创建 set_input_delay,set_output_delay 约束。SGMII 接口为串行接口,使用 CDR 技术从链路中恢复时钟,所以不需要创建 set_input_delay,set_output_delay 约束。

set_input_delay,set_output_delay

在这里插入图片描述
对于一个芯片设计来说,芯片的外部都会有一些器件和芯片进行数据的交换,简单的示意图如上所示。虚线框是 FPGA 芯片,外部的器件从 STA 的角度被简化为两个寄存器 Device A 和 Device B,在本文案例中,Device A 和 Device B 是同一个,即网口 PHY 芯片。

如上图所示,如果在设计上没有对 dina,douta 的数据进行约束,那么 STA 工具并不能够得到由外部寄存器经过组合逻辑到达 rega 的时间,同时也不知道 dina 信号和输入的 clk 是什么关系(如果有多个时钟,到底和哪个时钟是有关的??)和内部采样 rega 的关系。

input delay 和 output delay 就是告诉 STA 工具芯片外部的信号的 delay 信息。如果知道芯片外部器件的 datasheet,那么 input delay 和 output delay 要严格按照 datasheet 的要求去设置。

如果不设置 input delay 和 output delay,那么工具并不知道上述信息,也就是说工具并不会分析这条 path。由于大多数信号进入芯片内部都是需要和芯片内部进行数据传递的,所以必须通过约束 input delay 和 output delay 的方式告诉工具此处的 timing 信息,这样才能保证输入的信号能够被芯片内部正确的采样,从而保证芯片工作正常。

反之,如果某些信号是一些在芯片正常工作之前就稳定的常值信号(bist en 等),那么实际上是没有必要对这些信号进行 timing 分析的,所以这些信号可以不用约束 input delay 来简化时序约束。

如何设置设置 input delay 和 output delay?

对于 input delay 和 output delay 关键是理解下面两句话的含义

  • set_input_delay 是说该输入信号是在时钟沿后多长时间到达模块的 port 上的。
  • set_output_delay 是说该输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。

设置输入延时(Input Delay)

由下图可以看出 Input Delay 是以上游芯片的时钟发送沿为参考,上游的输出数据到达 FPGA 的外部输入端口之间的延迟。
在这里插入图片描述
输入延迟(input delay)包括 Tco 和 Trace Delay(板间延迟),其中 Trace delay 又叫 Board delay。

Tco 需要去查找上游芯片的 datasheet,TD 需要去查看 PCB 走线。
在这里插入图片描述
其中,DDR 模式传输和 SDC 模式传输的约束方式有区别,需要添加 -clock_fall 指令额外约束下降沿,如下图所示:
在这里插入图片描述
设置输出延时(Output Delay)

输出延时指的是从 FPGA 输出数据后到达外部器件时钟沿的延时时间,包括 PCB 板上的走线延时以及外部器件的数据建立和保持时间。也可以理解为在捕获沿到来时,数据已经存在的时间,如下图所示。
在这里插入图片描述
因为是以下游芯片的捕获沿为参考点,所以建立时间为正,保持时间为负。
在这里插入图片描述
其中,DDR 模式传输和 SDC 模式传输的约束方式有区别,需要添加 -clock_fall 指令额外约束下降沿,如下图所示:
在这里插入图片描述
注意,一般 GMII、RGMII 都会采用等长方式走线,所以从 PCB 走线数据可以看出,clk 和 data 的走线延时 TD 差异很小,可以忽略不计。
TD 计算公式:1ps 对应 6mil 走线长度。

GMII 接口时序约束

下面查看网口 PHY 芯片 M88E1111 的 datasheet。

125 MHz 时,周期为 8ns,T = 8ns。

由下图可知,Tco max = T - setup time = 8 - 2.5 = 5.5ns,Tco min = hold time = 0.5ns

所以设置 input delay max = 5.5ns,input delay min = 0.5ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 input delay max = 4ns,input delay min = -1ns
在这里插入图片描述
由下图可知,output delay max = TD max + Tsu = 0 + 2.0 = 2ns,output delay min = TD min – Thd = 0 – 0 = 0ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 output delay max = 0.5ns,output delay min = -1.5ns
在这里插入图片描述

GMII 接口 set_input_delay 约束
  1. 创建输入时钟。
create_clock -name {gm_rx_c} -period 8.000 -waveform { 0.000 4.000 } [get_ports {gm_rx_c}]
  1. 约束输入延迟。
set_input_delay -clock  [get_clocks  {gm_rx_c}] -max 4.000 [get_ports {{gm_rx_d[*]} gm_rx_dv gm_rx_err}] -add_delay
set_input_delay -clock  [get_clocks  {gm_rx_c}] -min -1.000 [get_ports {{gm_rx_d[*]} gm_rx_dv gm_rx_err}] -add_delay
GMII 接口 set_output_delay 约束
  1. 创建发送时钟。这里,由锁相环产生一个 125MHz 的时钟,由 c1 输出。锁相环输入 i_clk 为外部 100M 晶振。
create_generated_clock -name {gm_tx_c} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[1]}] 
  1. 约束输出延迟。
set_output_delay -clock  [get_clocks  {gm_tx_c}] -max 0.500 [get_ports {{gm_tx_d[*]} gm_tx_engm_tx_err}] -add_delay
set_output_delay -clock  [get_clocks  {gm_tx_c}] -min -1.500 [get_ports {{gm_tx_d[*]} gm_tx_en gm_tx_err}] -add_delay

RGMII 接口时序约束

本小节从满足 1000 Mbps 模式下各种要求的角度出发,解决 RGMII 接口时序相关问题。1000 Mbps 模式下,需要最多接口时序裕量,因而这是此处唯一需要考虑的情况。

125 MHz 时,周期为 8ns,但由于 RGMII 1000 Mbps 采用 DDR 模式传输数据,两个沿都已使用,因而有效沿周期仅为 4ns。TX 和 RX 总线完全独立但时钟源同步,从而简化了时序。RGMII 规定要求从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.0 ns 到最长 2.6 ns。

换言之,必须延迟从 MAC 输出到 PHY 输入 TX_CLK,并延迟从 PHY 输出到 MAC 输入的 RX_CLK。输出管脚处测得每个方向上,信号在规定的 +/- 500 ps RGMII 偏斜规范内同步传输。每个方向所需的最小延迟为 1ns,但 Intel® 建议将延迟目标定为 1.5 ns 到 2.0 ns,以确保足够的时序裕量。

Intel FPGA官方的RGMII约束指南:
https://www.intel.cn/content/www/cn/zh/support/programmable/support-resources/design-examples/horizontal/exm-tse-rgmii-phy.html

由官方约束指南可知,由于外部 PHY 的 TX 和 RX 延迟特性开启(90 度偏移),所以导致:
RGMII_RX_Clock(英特尔® FPGA):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º
所以需要创建一个虚拟时钟:
RGMII_RX_Virtual_Clock(外部 PHY):125 MHz、25 MHz 和 2.5 MHz
来更方便的进行时序约束。

下面查看网口 PHY 芯片 M88E1111 的 datasheet。
在这里插入图片描述
在这里插入图片描述
注意:这里的 Register 20.1 和 20.7 置 1 时,外部 PHY 的 TX 和 RX 延迟特性开启(90 度偏移)。默认值为 0,需要软件配置!!

因此,

125 MHz 时,周期为 8ns,RGMII 采用 DDR 模式,T = 4ns。

由下图可知,Tco max = T - setup time = 4 - 1.2 = 2.8ns,Tco min = hold time = 1.2ns

所以设置 input delay max = 2.8ns,input delay min = 1.2ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 input delay max = 1.3ns,input delay min = -0.3ns
在这里插入图片描述
由下图可知,output delay max = TD max + Tsu = 0 - 0.9 = -0.9ns,output delay min = TD min – Thd = 0 - 2.7 = -2.7ns。

Intel® 建议从任意方向上接收器的 DATA 开始延迟 CLK 最短 1.5 ns 到最长 2.0 ns,以确保足够的时序裕量。所以对时序约束进行修正,这里延时 1.5ns,所以设置 output delay max = -2.4ns,output delay min = -4.2ns
在这里插入图片描述

RGMII 接口 set_input_delay 约束
  1. 创建输入时钟和虚拟时钟。其中,虚拟时钟用以描述输入延时。
create_clock -name {rgmii_rxc} -period 8.000 -waveform { 2.000 6.000 } [get_ports {rgmii_rxc}]
create_clock -name {rgmii_rxc_virtual} -period 8.000 -waveform { 0.000 4.000 }
  1. 约束输入延迟。
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -max 1.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -min -0.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -max 1.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -clock_fall -add_delay
set_input_delay -clock  [get_clocks {rgmii_rxc_virtual}] -min -0.300 [get_ports {{rgmii_rxd[*]} rgmii_rx_ctl}] -clock_fall -add_delay
  1. 设置非关联路径。
set_false_path -fall_from [get_clocks {rgmii_rxc_virtual}] -rise_to [get_clocks {rgmii_rxc}] -setup
set_false_path -rise_from [get_clocks {rgmii_rxc_virtual}] -fall_to [get_clocks {rgmii_rxc}] -setup
set_false_path -rise_from [get_clocks {rgmii_rxc_virtual}] -rise_to [get_clocks {rgmii_rxc}] -hold
set_false_path -fall_from [get_clocks {rgmii_rxc_virtual}] -fall_to [get_clocks {rgmii_rxc}] -hold
RGMII 接口 set_output_delay 约束
  1. 创建发送时钟。这里,由锁相环产生两个 125MHz 的时钟,由 c1,c2 输出。锁相环输入 i_clk 为外部 100M 晶振。

这里的 gm_tx_c 为核心 TX 时钟(英特尔® FPGA):125 MHz、25 MHz 和 2.5 MHz。
这里的 rgmii_txc 为RGMII_TX_Clock(外部 PHY):125 MHz +90º、25 MHz +90º 和 2.5 MHz +90º。

为什么用 gm_tx_c 来命名核心 TX 时钟?主要是为了后面 DEMO 的 GMII、RGMII 模式兼容,以及从英特尔 Quartus Prime 软件版本 17.1 起,在英特尔 Stratix 10、英特尔 Arria 10和英特尔 Cyclone 10 GX设备中不支持 RGMII 接口。所以外部用了 gmii_rgmii_bridge 模块,三速以太网 IP 接的仍是 GMII 接口。

create_generated_clock -name {gm_tx_c} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[1]}] 
create_generated_clock -name {rgmii_txc} -source [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|refclk[0]}] -duty_cycle 50/1 -multiply_by 10 -divide_by 8 -phase 90/1 -master_clock {i_clk} [get_pins {clk_pll_inst|iopll_0|altera_iopll_i|twentynm_pll|iopll_inst|outclk[2]}] 
  1. 约束输出延迟。
set_output_delay -clock  [get_clocks {rgmii_txc}] -max -2.400 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -min -4.200 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -max -2.400 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -clock_fall -add_delay
set_output_delay -clock  [get_clocks {rgmii_txc}] -min -4.200 [get_ports {{rgmii_txd[*]} rgmii_tx_ctl}] -clock_fall -add_delay
  1. 设置非关联路径。
set_false_path -fall_from [get_clocks {gm_tx_c}] -rise_to [get_clocks {rgmii_txc}] -setup
set_false_path -rise_from [get_clocks {gm_tx_c}] -fall_to [get_clocks {rgmii_txc}] -setup
set_false_path -rise_from [get_clocks {gm_tx_c}] -rise_to [get_clocks {rgmii_txc}] -hold
set_false_path -fall_from [get_clocks {gm_tx_c}] -fall_to [get_clocks {rgmii_txc}] -hold
  1. 时钟输出最好用 DDIO 或 DDR 输出。

到此就结束了吗?

并没有结束,如果按上述约束编译工程,编译结束后,会发现时序报告有时序违例。这是因为,FPGA 内部的时钟和数据并不是完全同步的,FPGA 内部的时钟和数据到外部引脚的端口上也有延迟。需要略微调整 input delay 和 output delay,来使 slack 满足要求。


原文地址:https://blog.csdn.net/s1_mple/article/details/144700196

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!