目录
1. 简介
2. 硬件平台
2.1 ZCU102
2.1.1 Clock Sources & Destinations
2.2 ZCU106
2.2.1 Clock Sources & Destinations
2.2.2 IP 配置
2.2.3 约束
3. 结果
3.1 创建 Links
3.1.1 IBERT UI
3.1.2 创建 Links
3.1.3 配置链路
3.1.4 扫描参数
3.1.5 Scan Plot
4. 总结
1. 简介
IBERT ,即 Integrated Bit Error Ratio Tester(集成比特误码率测试仪)。
In-System IBERT (ISI) 和 IBERT Ultrascale GTY 都是用于高速串行接口测试的 IP Core,用于在 Xilinx FPGA 设计中进行串行收发器(SerDes)的性能和功能验证。
In-System IBERT v1.0
1)功能:
- In-System IBERT允许用户在系统运行时对FPGA内的高速串行收发器进行实时测试和监控。
- 支持多种串行协议和接口标准。
- 提供了一个图形用户界面,通过它用户可以配置测试参数,如数据率、编码方式等,并监控测试结果。
- 可以进行眼图分析,帮助用户评估信号完整性。
2)应用场景:
- 适用于系统级的调试和验证,特别是在硬件已经部署后的性能调优和问题诊断。
IBERT Ultrascale GTY v1.3
1)功能:
- IBERT Ultrascale GTY 专为 Ultrascale 架构中的 GTY 收发器设计,提供高精度的信号完整性测试。
- 支持高达 32.75 Gbps 的数据速率测试。
- 同样提供眼图分析工具,以及其他高级分析功能,如误码率测试(BER)。
- 用户界面允许详细配置各种测试参数,并可以保存和回放测试配置。
2)应用场景:
- 主要用于设计和验证阶段,确保GTY收发器能在规定的性能指标下工作。
- 适用于需要高数据速率和高信号完整性的应用,如数据中心、高性能计算和高端网络设备。
主要区别:
1)目标平台和收发器类型:
- In-System IBERT 可以支持多种 Xilinx FPGA 平台和不同类型的收发器。
- IBERT Ultrascale GTY 专门针对 Ultrascale 平台上的GTY类型收发器。
2)功能和性能:
- IBERT Ultrascale GTY提供了更专业的测试功能,特别是在高速数据通信领域,支持更高的数据速率和更复杂的信号分析。
- In-System IBERT更侧重于通用性和在系统运行时的调试与测试。
3)用户界面和操作复杂度:
- 两者都提供图形用户界面,但IBERT Ultrascale GTY的界面可能提供更高级的配置和分析工具。
2. 硬件平台
- ZCU102,包含6个 GT Bank
- ZCU106,包含5个 GT Bank
2.1 ZCU102
2.1.1 Clock Sources & Destinations
Source:
----------------------------------------------------------------------
U56(SI570)(156.25 MHz) -> USER_MGT_SI570_P(N) -> U51(SI53340-B-GM) ->|
Destinations(xczu9eg-ffvb1156-2-e):
-------------------------------------------------------------------------------------
|-> USER_MGT_SI570_CLOCK1_P -Cap-> USER_MGT_SI570_CLOCK1_C_P -> U1.L27(MGT.129.CLK0P)
|-> USER_MGT_SI570_CLOCK1_N -Cap-> USER_MGT_SI570_CLOCK1_C_N -> U1.L28(MGT.129.CLK0P)
|
|-> USER_MGT_SI570_CLOCK2_P -Cap-> USER_MGT_SI570_CLOCK2_C_P -> U1.C8(MGT.230.CLK0P)
|-> USER_MGT_SI570_CLOCK2_N -Cap-> USER_MGT_SI570_CLOCK2_C_N -> U1.C7(MGT.230.CLK0P)
2.2 ZCU106
2.2.1 Clock Sources & Destinations
Source:
----------------------------------------------------------------------
U56(SI570)(156.25 MHz) -> USER_MGT_SI570_P(N) -> U51(SI53340-B-GM) ->|
Destinations(xczu7ev-ffvc1156-2-e):
-------------------------------------------------------------------------------------
|-> USER_MGT_SI570_CLOCK1_P -Cap-> USER_MGT_SI570_CLOCK1_C_P -> U1.U10(MGT.226.CLK1P)
|-> USER_MGT_SI570_CLOCK1_N -Cap-> USER_MGT_SI570_CLOCK1_C_N -> U1.U9(MGT.226.CLK1N)
|
|-> USER_MGT_SI570_CLOCK2_P -Cap-> USER_MGT_SI570_CLOCK2_C_P -> U1.R10(MGT.227.CLK1P)
|-> USER_MGT_SI570_CLOCK2_N -Cap-> USER_MGT_SI570_CLOCK2_C_N -> U1.R9(MGT.227.CLK1N)
2.2.2 IP 配置
1)添加 IP:IBERT Ultrascale GTH v1.4
2)打开示例设计
不用做任何更改,直接编译生成比特流。
2.2.3 约束
1)example_ibert_ultrascale_gth_0.xdc
- Icon Constraints: 设置调试核心的时钟输入频率和使能时钟分频器。
- GTH Refclk Lock Constraints: 定义了GTH参考时钟的引脚分配。
- Refclk Constraints: 创建了GTH参考时钟,并将其分组为异步时钟组。
## Icon Constraints
set_property C_CLK_INPUT_FREQ_HZ 156250000 [get_debug_cores dbg_hub]
set_property C_ENABLE_CLK_DIVIDER true [get_debug_cores dbg_hub]
##gth_refclk lock constraints
set_property PACKAGE_PIN V8 [get_ports gth_refclk0p_i[0]]
set_property PACKAGE_PIN V7 [get_ports gth_refclk0n_i[0]]
set_property PACKAGE_PIN U10 [get_ports gth_refclk1p_i[0]]
set_property PACKAGE_PIN U9 [get_ports gth_refclk1n_i[0]]
set_property PACKAGE_PIN T8 [get_ports gth_refclk0p_i[1]]
set_property PACKAGE_PIN T7 [get_ports gth_refclk0n_i[1]]
set_property PACKAGE_PIN R10 [get_ports gth_refclk1p_i[1]]
set_property PACKAGE_PIN R9 [get_ports gth_refclk1n_i[1]]
## Refclk constraints
create_clock -name gth_refclk0_3 -period 6.4 [get_ports gth_refclk0p_i[0]]
create_clock -name gth_refclk1_3 -period 6.4 [get_ports gth_refclk1p_i[0]]
set_clock_groups -group [get_clocks gth_refclk0_3 -include_generated_clocks] -asynchronous
set_clock_groups -group [get_clocks gth_refclk1_3 -include_generated_clocks] -asynchronous
create_clock -name gth_refclk0_4 -period 6.4 [get_ports gth_refclk0p_i[1]]
create_clock -name gth_refclk1_4 -period 6.4 [get_ports gth_refclk1p_i[1]]
set_clock_groups -group [get_clocks gth_refclk0_4 -include_generated_clocks] -asynchronous
set_clock_groups -group [get_clocks gth_refclk1_4 -include_generated_clocks] -asynchronous
2)ibert_ultrascale_gth_ip_example.xdc
针对每个GTH通道的发送和接收时钟,设置了异步时钟组。
## TX/RX out clock clock constraints
##
# GT X0Y12
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[0].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[0].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y13
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[1].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[1].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y14
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[2].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[2].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y15
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[3].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[0].u_q/CH[3].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y16
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[0].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[0].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y17
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[1].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[1].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y18
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[2].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[2].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
# GT X0Y19
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[3].u_ch/u_gthe4_channel/RXOUTCLK}] -include_generated_clocks]
set_clock_groups -asynchronous -group [get_clocks -of_objects [get_pins {u_ibert_gth_core/inst/QUAD[1].u_q/CH[3].u_ch/u_gthe4_channel/TXOUTCLK}] -include_generated_clocks]
3. 结果
3.1 创建 Links
3.1.1 IBERT UI
下载 bitstream 后,会出现 IBERT UI:
3.1.2 创建 Links
3.1.3 配置链路
- TX Pre-Cursor:在信号的上升沿和下降沿之前增加的高频分量,减少码间干扰(ISI)。
- TX Post-Cursor 是指在信号的上升沿和下降沿之后增加的高频分量,减少信号拖尾现象。
- DFE:选择是否在接收器上启用决策反馈均衡器(Decision Feedback Equalizer)。
- 回环方式:近端回环(在器件内部:1、2)和远端回环(两个器件之间:3、4)。
3.1.4 扫描参数
扫描类型包括:
- 2-D full eye scan,二维全眼扫描
- 1-D bathtub plot,一维浴缸图
扫描步进(水平、垂直):
- 范围均在 1-16,数值越小,扫描图约精细,耗时越长。
- 水平即时间(X轴),1UI=200ps(@5Gpbs)。
- 垂直即电压(Y轴)。
扫描范围(水平、垂直):保持默认即可。
停留时间(Dwell):
- 图表中的每个点都会被扫描一定的时间(用来绘制等高图,Z轴)。
- 例如 1e-5 意味着每个扫描步进需要采集 1e5 个样本。
3.1.5 Scan Plot
测试条件:Near-end PMA,二维全眼扫描,增量(水平、垂直)=1。
Open Area:
- 定义:眼图中没有被信号轨迹覆盖的区域称为 open area。
- 用途:open area越大,表示信号的抖动和噪声越小,信号的完整性越好。
Open UI:
- 定义:眼图中未被信号轨迹覆盖的单位间隔(UI)的百分比。
- 用途:open UI 用于衡量信号在一个单位间隔内的稳定性。open UI越大,表示信号在单位间隔内的抖动越小,接收器能够更准确地判断信号的高低电平。
4. 总结
本文分享在 ZCU102 和 ZCU106 板卡上使用 IBERT Ultrascale GTY 进行眼图测量的示例。
参考:
https://zhuanlan.zhihu.com/p/660133545