跳转到主要内容

Versal GTM如何用tcl命令在IBERT生成QPRBS13序列

<font color="#FF8000">作者:Cheng Zhang,AMD工程师;文章来源:AMD Xilinx开发者社区</font>

<strong>1. 关于PRBS13、QPRBS13、PRBS13Q和QPRBS13-CEI的定义</strong>

1)PRBS13的表达式为 x13 + x12 + x2 + x + 1

2)在AR72117中对QPRBS13、PRBS13Q和QPRBS13-CEI有以下定义:
<li>PRBS13Q按照IEEE 802.3bs-2017 120.5.11.2.1 被定义为重复两次以格雷编码的PRBS13</li>
<li>QPRBS13-CEI与PRBS13Q相同</li>
<li>QPRBS13是PRBS13和反转的PRBS13组合</li>

目前对于Vivado2023.1版本的IBERT GUI界面暂时不支持QPRBS13的设置,需要通过tcl或者端口设置的方法来实现。

Tips:不建议同时用IBERT GUI和Properties窗口设置GTM的Attributes,可能会导致寄存器值出错。

3)PRBS13、QPRBS13、PRBS13Q解析

首先,根据PRBS13的表达式来构建一个数列表格, PRBS13每 8191个bit循环一次,此处选取前64位数据展示并且与仿真波形作对比:
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312975-01.jp…; alt=""></center>

PRBS13仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 1)
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312976-02.pn…; alt=""></center>

注意:按照AM017的描述,当TX_GRAY_BYP_EN为1时,关闭GARY编码器。当TX_GRAY_BYP_EN为0时,使能GARY编码器。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312977-03.pn…; alt=""></center>

PRBS13Q仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 0)
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312978-04.pn…; alt=""></center>

QPRBS13仿真波形 (TXQPRBSEN = 1, TX_GRAY_BYP_EN = 1)
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312979-05.pn…; alt=""></center>

当前输入为反转后的PRBS13(连续12位“1”),因此按照PRBS13表达式产生的64位数据如下表所示:
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312980-06.jp…; alt=""></center>

在了解QPRBS13的编码规则后,接下去搭建工程做实际的测试。

<strong>2. 新建Versal GTM工程</strong>

对于Versal GTM,IBERT工具已经被集成到GTM内部。因此需要使用Versal Transceivers Wizard新建一个测试工程,本文的测试工程基于VPK120 评估板设计。
在Wizard中主要更改两个地方的设置:
<li>Transceiver type:设置为GTM</li>
<li>Preset:选择GTM(PAM4) Ethernet 51G</li>

设置完成后打开IP Example Design:
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312981-07.pn…; alt=""></center>

<strong>3. 调整硬件设置</strong>

此处需要对Example design做四个调整:

1) 把gpio_enable、gt_reset和rate_sel三个信号连接到VIO的输出。

2) 添加Clocking wizard模块,设置clk_out1的频率为200MHz,并且提供给gt_bridge和gt_quad的apb3_clk作为时钟。

3) 设置TX和RX的Reference Clock频率为156.25MHz。

4) 把GT Quad约束到Quad 202,Reference clock约束到管脚V45。

修改完成后点击Generate Device Image生成PDI文件,连接JTAG并且把PDI下载到VPK120。

<strong>4. 构建寄存器读写函数</strong>

控制GTM相关寄存器需要按位操作,因此首先需要设计一个能够按位读写的函数,函数内部执行步骤如下:

1) 获取对象名称
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312982-08.pn…; alt=""></center>

本文中的IBERT名称为IBERT_0,在后面的操作中都以IBERT_0作为操作的对象名称。因为工程中用了GT Quad202,所以tcl命令对于Quad202的ch0定义为:IBERT_0.Quad_202.CH_0 ,其他通道可参照这个命名类推。

2) 刷新全部寄存器

这一步操作很重要,如果没有刷新全部寄存器的步骤,将无法读取到最新的寄存器数据,可能会读出来上一次的数据或者全0的数据。
refresh_hw_sio [list [get_hw_sio_gts {IBERT_0.Quad_202.CH_0}] ]
read_gtm_attributes $channel $reg

3) 数据格式转换

刷新寄存器后会发现在GT Properties窗口显示的数据从0xXXXXXXXX变为了0xXXXX_XXXX,然而在tcl的按位与和按位或的运算中无法识别下划线,下划线会导致数据运算出错,这一步需要先从相应的寄存器把数据读取出来,然后将下划线移除。

这里的channel和reg是函数的参数,channel代表GT的通道编号,reg是需要操作的寄存器。
set RegValue1 [get_property $reg [get_hw_sio_gts $channel]]
set RegValue [regsub {_} $RegValue1 ""]
​​​​​​​
4) 判断和位运算

这里的op和value是函数的参数,op代表运算操作是按位与还是按位或,value是具体运算的值。
if { $op == "AND" } {
set RegValue1 [format 0x%x [expr {$RegValue & $value}]]
} elseif { $op == "OR" } {
set RegValue1 [format 0x%x [expr {$RegValue | $value}]]
} else {}
​​​​​​​
5) 将系数设回到相应的寄存器
set_property $reg $RegValue1 [get_hw_sio_gts $channel]
commit_hw_sio [get_hw_sio_gts $channel]
​​​​​​​
​​​​​​​6) 操作函数定义
​​​​​​​
操作函数有4个传递参数proc change_gtm_attributes { channel reg value op },具体作用在上文已经说明。例如对于下面这个函数,其对应的操作是向Quad_202.CH_0的CH0_FABRIC_INTF_CFG0寄存器按位与的方式写入0xFFFEFFDF,即将CH0_FABRIC_INTF_CFG0寄存器的Bit5和Bit16置为“0”,其余位保持不变。
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG0 0xFFFEFFDF AND

<strong>5. 配置GTM的相关寄存器产生QPRBS13序列</strong>

1) 打开Attributes控制使能,关闭端口控制
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG0 0xFFFEFFDF AND

2) 设置TX PRBS的Pattern
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0x6000 OR
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0xFFFF6FFF AND

3) 设置RX PRBS的Pattern
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0x300000 OR
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0xFFB7FFFF AND

4) 打开TXQPRBS使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG4 0x40000000 OR

5) 打开RXQPRBS使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_FABRIC_INTF_CFG1 0x2000 OR

6) 关闭TX Gray Encoder使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_TX_PCS_CFG0 0x1000 OR

7) 关闭TX Gray Decoder使能
change_gtm_attributes IBERT_0.Quad_202.CH_0 CH0_RX_PCS_CFG0 0x1000 OR

8) 设置LOOPBACK为Near end PCS
set_property CH0_LOOPBACK {Near-End PCS} [get_hw_sio_gts IBERT_0.Quad_202.CH_0]

<strong>实际运行结果</strong>

1) 将PDI文件下载到器件中,并且运行tcl命令,先不使能QPRBS,设置为常规PRBS13输出。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312983-09.pn…; alt=""></center>

可以看到NEAR-END PCS回环已经建立,并且RXPRBSLOCKED也已经拉高。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312984-10.pn…; alt=""></center>

2) 运行TCL命令,打开TXQPRBS使能,对于RX继续输出常规PRBS,此时Link status显示为No Link和实际速率之间翻转,且RXPRBSLOCKED输出状态也呈现为周期性翻转。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312985-11.jp…; alt=""></center>

3) 再次运行TCL命令,打开RXQPRBS使能,此时的Link status再次恢复显示为实际速率,RXPRBSLOCKED输出也再次呈现为高电平。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312986-12.jp…; alt=""></center>

4) 参考AM017,Versal GTM除了不支持QPRBS-7,其他的Pattern都是支持的。
<center><img src="https://cdn.eetrend.com/files/2023-08/wen_zhang_/100573401-312987-13.pn…; alt=""></center>

​​​​​​​5) 这个方法也可以用于产生其他QPRBS Pattern。