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

作者:Cheng Zhang,AMD工程师;文章来源:AMD Xilinx开发者社区

1. 关于PRBS13、QPRBS13、PRBS13Q和QPRBS13-CEI的定义

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

2)在AR72117中对QPRBS13、PRBS13Q和QPRBS13-CEI有以下定义:

  • PRBS13Q按照IEEE 802.3bs-2017 120.5.11.2.1 被定义为重复两次以格雷编码的PRBS13
  • QPRBS13-CEI与PRBS13Q相同
  • QPRBS13是PRBS13和反转的PRBS13组合
  • 目前对于Vivado2023.1版本的IBERT GUI界面暂时不支持QPRBS13的设置,需要通过tcl或者端口设置的方法来实现。

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

    3)PRBS13、QPRBS13、PRBS13Q解析

    首先,根据PRBS13的表达式来构建一个数列表格, PRBS13每 8191个bit循环一次,此处选取前64位数据展示并且与仿真波形作对比:

    PRBS13仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 1)

    注意:按照AM017的描述,当TX_GRAY_BYP_EN为1时,关闭GARY编码器。当TX_GRAY_BYP_EN为0时,使能GARY编码器。

    PRBS13Q仿真波形 (TXQPRBSEN = 0, TX_GRAY_BYP_EN = 0)

    QPRBS13仿真波形 (TXQPRBSEN = 1, TX_GRAY_BYP_EN = 1)

    当前输入为反转后的PRBS13(连续12位“1”),因此按照PRBS13表达式产生的64位数据如下表所示:

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

    2. 新建Versal GTM工程

    对于Versal GTM,IBERT工具已经被集成到GTM内部。因此需要使用Versal Transceivers Wizard新建一个测试工程,本文的测试工程基于VPK120 评估板设计。
    在Wizard中主要更改两个地方的设置:

  • Transceiver type:设置为GTM
  • Preset:选择GTM(PAM4) Ethernet 51G
  • 设置完成后打开IP Example Design:

    3. 调整硬件设置

    此处需要对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。

    4. 构建寄存器读写函数

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

    1) 获取对象名称

    本文中的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

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

    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]

    实际运行结果

    1) 将PDI文件下载到器件中,并且运行tcl命令,先不使能QPRBS,设置为常规PRBS13输出。

    可以看到NEAR-END PCS回环已经建立,并且RXPRBSLOCKED也已经拉高。

    2) 运行TCL命令,打开TXQPRBS使能,对于RX继续输出常规PRBS,此时Link status显示为No Link和实际速率之间翻转,且RXPRBSLOCKED输出状态也呈现为周期性翻转。

    3) 再次运行TCL命令,打开RXQPRBS使能,此时的Link status再次恢复显示为实际速率,RXPRBSLOCKED输出也再次呈现为高电平。

    4) 参考AM017,Versal GTM除了不支持QPRBS-7,其他的Pattern都是支持的。

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

    评论

    求助:我在另外一台可上网的笔记本上安装了vivado18.3的dconav,为何设计工具最高只有15.4版本?

    最新文章

    最新文章