文章 ID: 000092741 内容类型: 勘误 上次审核日期: 2023 年 08 月 15 日

使用设计示例中的脚本对 F-tile 以太网英特尔® FPGA Hard IP的多通道 PTP 变体使用脚本时,为什么我的rx_tam_adjust计算值不正确?

环境

  • 英特尔® Quartus® Prime Pro Edition
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    说明

    由于英特尔® Quartus® Prime Pro Edition 软件版本 22.3 中存在问题,F-tile 以太网英特尔® FPGA Hard IP的多通道 PTP 变体的设计示例中提供的ptp_fw.tcl”脚本可能会生成不正确的rx_tam_adjust值。

    解决方法

    要变通解决此问题,请执行以下步骤

    1. 打开位于<生成的示例设计文件夹 >/hardware_test_design/hwtest/altera/ptp/ptp_fw.tcl 中的 PTP 固件脚本
    2. 查找 替换 以下 代码行:

    # b) 计算 脉冲调整

    for {set fl 0} {$fl < $::FL} {incr fl} {
    set rx_xcvr_if_pulse_adj($fl) [format 0x%X $rx_fec_cw_pos_fl($fl)]
    }

    # b) 计算脉冲调整检查 FEC 在从同一收发器通道接收的 FEC 通道之间的cw_pos翻转

    for {set fl 0} {$fl < $::FL} {incr fl} {
    set fl_minus [expr $fl - [expr $fl % $::P L_FL_MAP]]
    set cond1a [expr ($rx_fec_cw_pos_fl($fl) >= $rx_fec_cw_pos_fl($fl_minus))]
    set cond1b [expr (($rx_fec_cw_pos_fl($fl) - $rx_fec_cw_pos_fl($fl_minus)) > 0x4E20)]

    set cond2a [expr ($rx_fec_cw_pos_fl($fl_minus) > $rx_fec_cw_pos_fl($fl))]
    set cond2b [expr (($rx_fec_cw_pos_fl($fl_minus) - $rx_fec_cw_pos_fl($fl)) > 0x4E20)]

    if {$cond 1a && $cond 1b} {
    if {$::FEC == 2} {
    # KRFEC
    set rx_xcvr_if_pulse_adj($fl) [expr 0x5280 - $rx_fec_cw_pos_fl($fl)]
    } elseif {($::FEC == 3) ||($::FEC == 4)}{
    # KP/LLFEC
    set rx_xcvr_if_pulse_adj($fl) [expr 0x5500 - $rx_fec_cw_pos_fl($fl)]
    }
    设置rx_xcvr_if_pulse_adj_sign($fl) 0x1
    } elseif {$cond 2a && $cond 2b} {
    if {$::FEC == 2} {
    # KRFEC
    set rx_xcvr_if_pulse_adj($fl) [expr 0x5280 + $rx_fec_cw_pos_fl($fl)]
    } elseif {($::FEC == 3) ||($::FEC == 4)}{
    # KP/LLFEC
    set rx_xcvr_if_pulse_adj($fl) [expr 0x5500 + $rx_fec_cw_pos_fl($fl)]
    }
    设置rx_xcvr_if_pulse_adj_sign($fl) 0x0
    } else {
    set rx_xcvr_if_pulse_adj($fl) [format 0x%X $rx_fec_cw_pos_fl($fl)]
    设置rx_xcvr_if_pulse_adj_sign($fl) 0x0
    }
    }

    返回 [数组获取rx_xcvr_if_pulse_adj]

    set l_rx_xcvr_if_pulse_adj [array get rx_xcvr_if_pulse_adj]
    set l_rx_xcvr_if_pulse_adj_sign [array get rx_xcvr_if_pulse_adj_sign]

    return [list $l_rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj_sign]

    proc determine_rx_ref_lane {lst_rx_xcvr_if_pulse_adj VL UI rx_pcs_bitslip_cnt rx_pcs_dlpulse_aligned l_rx_apulse_offset l_rx_apulse_offset_sign l_rx_apulse_wdelay l_rx_apulse_time ip_inst_base_addr} {

    #

    # 参数:

    # 返回:接收脉冲偏移(+符号位)的“数组列表”。rx ref pl/vl/fl

    阵列集 rx_apulse_offset $l_rx_apulse_offset

    数组集 rx_apulse_offset_sign $l_rx_apulse_offset_sign

    阵列集 rx_apulse_wdelay $l_rx_apulse_wdelay

    数组设置为 rx_apulse_time $l_rx_apulse_time

    array set rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    print_info_time“确定 RX 参考通道”

    # a) 参照异步脉冲确定同步脉冲(对齐标记)偏移

    if {$::FEC > 0} {

    print_out “\tVariant : FEC>0”

    for {set fl 0} {$fl < $::FL} {incr fl} {

    set fl_minus [expr $fl - [expr $fl % $::P L_FL_MAP]]

    set val0 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) & 0x0000001F]]

    set val1 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]

    if {$val 1 > $rx_xcvr_if_pulse_adj($fl_minus)} {

    设置rx_spulse_offset_sign($fl) 0

    set rx_spulse_offset_0 [format 0x%lX [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]]

    set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ;# 43'rx_spulse_offset_0

    set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

    } else {

    设置rx_spulse_offset_sign($fl) 1

    set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]]

    set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ;# 43'rx_spulse_offset_0

    set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

    }

    proc determine_rx_ref_lane {lst_rx_xcvr_if_pulse_adj lst_rx_xcvr_if_pulse_adj_sign VL UI rx_pcs_bitslip_cnt rx_pcs_dlpulse_aligned l_rx_apulse_offset l_rx_apulse_offset_sign l_rx_apulse_wdelay l_rx_apulse_time ip_inst_base_addr} {

    #

    # 参数:

    # 返回:接收脉冲偏移(+符号位)的“数组列表”。rx ref pl/vl/fl

    阵列集 rx_apulse_offset $l_rx_apulse_offset

    数组集 rx_apulse_offset_sign $l_rx_apulse_offset_sign

    阵列集 rx_apulse_wdelay $l_rx_apulse_wdelay

    数组设置为 rx_apulse_time $l_rx_apulse_time

    array set rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    array set rx_xcvr_if_pulse_adj_sign $lst_rx_xcvr_if_pulse_adj_sign

    print_info_time“确定 RX 参考通道”

    # a) 参照异步脉冲确定同步脉冲(对齐标记)偏移

    if {$::FEC > 0} {

    print_out “\tVariant : FEC>0”

    for {set fl 0} {$fl < $::FL} {incr fl} {

    set fl_minus [expr $fl - [expr $fl % $::P L_FL_MAP]]

    set val0 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) & 0x0000001F]]

    set val1 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]

    if { $rx_xcvr_if_pulse_adj_sign($fl) == 1} {

    设置rx_spulse_offset_sign($fl) 1

    set rx_spulse_offset_0 [format 0x%lX [expr $rx_xcvr_if_pulse_adj($fl) * $ui * $::P L_FL_MAP]]

    set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ;# 43'rx_spulse_offset_0

    set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

    } else {

    if {$val 1 > $rx_xcvr_if_pulse_adj($fl_minus)} {

    设置rx_spulse_offset_sign($fl) 0

    set rx_spulse_offset_0 [format 0x%lX [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]]

    set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ;# 43'rx_spulse_offset_0

    set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

    } else {

    设置rx_spulse_offset_sign($fl) 1

    set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]]

    set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ;# 43'rx_spulse_offset_0

    set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

    }

    }

    array set rx_xcvr_if_pulse_adj [configure_rx_fec_cw_pos $inst_num $init_pl]

    if {$::FEC > 0} {

    set int_list [configure_rx_fec_cw_pos $inst_num $init_pl]

    lassign $int_list l_rx_xcvr_if_pulse_adj l_rx_xcvr_if_pulse_adj_sign

    array set rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj

    array set rx_xcvr_if_pulse_adj_sign $l_rx_xcvr_if_pulse_adj_sign

    if {$::d ebug} {

    for {set fl 0} {$fl < $::FL} {incr fl} {

    print_out “\trx_xcvr_if_pulse_adj($fl) : [format 0x%08X $rx_xcvr_if_pulse_adj($fl)]”

    print_out “\trx_xcvr_if_pulse_adj_sign($fl) : [format 0x%08X $rx_xcvr_if_pulse_adj_sign($fl)]”

    }

    }

    # 第 3 步:确定 RX 参考通道

    set int_list [determine_rx_ref_lane [array get rx_xcvr_if_pulse_adj]\

    $VL\

    # 第 3 步:确定 RX 参考通道

    set int_list [determine_rx_ref_lane [array get rx_xcvr_if_pulse_adj]\

    [数组获取rx_xcvr_if_pulse_adj_sign]\

    $VL

    1. 保存文件

    从英特尔® Quartus® Prime 专业版软件版本 22.4 开始,此问题已修复。

    相关产品

    本文适用于 2 产品

    英特尔® Agilex™ F 系列 FPGA 和 SoC FPGA
    英特尔® Agilex™ 7 FPGA 和 SoC FPGA I 系列

    本页面上的内容是原始英文内容的人工翻译与计算机翻译的组合。我们提供此内容是为了您的便利并且仅供参考,未必完整或准确。如果本页面的英文版与翻译版之间存在任何冲突,应以英文版为准。 查看此页面的英语版本。