記事 ID: 000092741 コンテンツタイプ: エラッタ 最終改訂日: 2023/08/15

F タイルイーサネット インテル® FPGA Hard IP のマルチレーン PTP バリアントのデザイン例にあるスクリプトを使用する際、rx_tam_adjust の計算値が間違っているのはなぜですか?

環境

  • インテル® Quartus® Prime 開発ソフトウェア・プロ・エディション
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    詳細

    インテル® Quartus® Prime Pro Edition ソフトウェア・バージョン 22.3 の問題により、F タイル・イーサネット・インテル® 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]

    l_rx_xcvr_if_pulse_adj [配列取得rx_xcvr_if_pulse_adj] に設定
    l_rx_xcvr_if_pulse_adj_signを設定する[配列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 スパルスオフセット (+符号ビット) のための '配列リスト'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

    配列セット rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    print_info_time 「RX 基準レーンの決定」

    #a)非同期パルスを参照して同期パルス(アライメントマーカー)オフセットを決定する

    if {$::FEC > 0} {

    print_out "\tバリアント : 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 [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 スパルスオフセット (+符号ビット) のための '配列リスト'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

    配列セット rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    配列セット rx_xcvr_if_pulse_adj_sign $lst_rx_xcvr_if_pulse_adj_sign

    print_info_time 「RX 基準レーンの決定」

    #a)非同期パルスを参照して同期パルス(アライメントマーカー)オフセットを決定する

    if {$::FEC > 0} {

    print_out "\tバリアント : 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 [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]]]

    }

    }

    アレイ・セット 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

    配列セット rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj

    配列セット 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) : [フォーマット 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 基準レーンを決定する

    int_list [determine_rx_ref_lane [配列取得rx_xcvr_if_pulse_adj]\

    $VL\

    # ステップ 3: RX 基準レーンを決定する

    int_list [determine_rx_ref_lane [配列取得rx_xcvr_if_pulse_adj]\

    [配列取得rx_xcvr_if_pulse_adj_sign]\

    $VL

    1. ファイルを保存

    この問題は、インテル® Quartus® Prime Pro Edition ソフトウェアのバージョン 22.4 で修正されています。

    関連製品

    本記事の適用対象: 2 製品

    インテル® Agilex™ F シリーズ FPGA および SoC FPGA
    インテル® Agilex™ 7 FPGA & SoC FPGA I シリーズ

    このページのコンテンツは、元の英語のコンテンツを人力翻訳および機械翻訳したものが混在しています。この内容は参考情報および一般的な情報を提供するためものであり、情報の正確さと完全性を保証するものではありません。インテルは不正確な翻訳があった場合でもいかなる責任を負いません。このページの英語版と翻訳の間に矛盾がある場合は、英語版に準拠します。 このページの英語版をご覧ください。