ID de l'article: 000092741 Type de contenu: Errata Dernière révision: 15/08/2023

Pourquoi ma valeur calculée pour rx_tam_adjust est-elle incorrecte lorsque j’utilise les scripts trouvés dans les exemples de conception pour les variantes PTP multivoies du Intel® FPGA Hard IP Ethernet F-tile ?

Environnement

  • Intel® Quartus® Prime Pro Edition
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    Descriptif

    En raison d’un problème dans la version 22.3 du logiciel Intel® Quartus® Prime Pro Edition, le script « ptp_fw.tcl » fourni dans les exemples de conception pour les variantes PTP multivoies du Intel® FPGA Hard IP Ethernet F-tile peut générer des valeurs rx_tam_adjust incorrectes.

    Résolution

    Pour contourner ce problème, procédez comme suit :

    1. Ouvrez le script du microprogramme PTP situé dans < dossier de conception d’exemple généré >/hardware_test_design/hwtest/altera/ptp/ptp_fw.tcl
    2. Trouvez et remplacez les lignes de code suivantes :
    DEÀ

    # b) Calculer le réglage de l’impulsion

    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) Calculer le réglage de l’impulsion et vérifier le roulement de cw_pos du FEC entre la voie FEC reçue de la même voie d’émetteur-récepteur

    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_moins))]
    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)]
    }
    définir 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)]
    }
    Définissez 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)]
    Définissez rx_xcvr_if_pulse_adj_sign($fl) 0x0
    }
    }

    return [batterie obtenir 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} {

    #

    # arguments:

    # retourne : 'array-lists' pour le décalage spulse rx (+ bit de signe). RX REF PL/VL/FL

    ensemble de tableaux rx_apulse_offset $l_rx_apulse_offset

    array set rx_apulse_offset_sign $l_rx_apulse_offset_sign

    Ensemble de tableaux rx_apulse_wdelay $l_RX_APULSE_WDELAY

    ensemble de tableaux rx_apulse_time $l_rx_apulse_time

    ensemble de tableaux rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    print_info_time « Determine RX reference lane » (Déterminer la voie de référence RX)

    # a) Déterminer les décalages de l’impulsion de synchronisation (marqueur d’alignement) en référence à l’impulsion asynchrone

    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)} {

    Définir 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 {

    Set 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} {

    #

    # arguments:

    # retourne : 'array-lists' pour le décalage spulse rx (+ bit de signe). RX REF PL/VL/FL

    ensemble de tableaux rx_apulse_offset $l_rx_apulse_offset

    array set rx_apulse_offset_sign $l_rx_apulse_offset_sign

    Ensemble de tableaux rx_apulse_wdelay $l_RX_APULSE_WDELAY

    ensemble de tableaux rx_apulse_time $l_rx_apulse_time

    ensemble de tableaux rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj

    ensemble de tableaux rx_xcvr_if_pulse_adj_sign $lst_rx_xcvr_if_pulse_adj_sign

    print_info_time « Determine RX reference lane » (Déterminer la voie de référence RX)

    # a) Déterminer les décalages de l’impulsion de synchronisation (marqueur d’alignement) en référence à l’impulsion asynchrone

    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} {

    Set 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)} {

    Définir 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 {

    Set 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} {

    définir 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

    ensemble de tableaux rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj

    ensemble de tableaux 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)] »

    }

    }

    # Étape 3 : Déterminer la voie de référence RX

    Set int_list [determine_rx_ref_lane [Array Get rx_xcvr_if_pulse_adj]\

    $VL\

    # Étape 3 : Déterminer la voie de référence RX

    Set int_list [determine_rx_ref_lane [Array Get rx_xcvr_if_pulse_adj]\

    [tableau obtenir rx_xcvr_if_pulse_adj_sign]\

    $VL

    1. Enregistrez le fichier

    Ce problème est résolu à partir de la version 22.4 du logiciel Intel® Quartus® Prime Pro Edition.

    Produits associés

    Cet article concerne 2 produits

    FPGA et FPGA SoC Intel® Agilex™ série F
    FPGA et FPGA SoC Intel® Agilex™ 7 série I

    Le contenu de cette page est une combinaison de traduction humaine et informatique du contenu original en anglais. Ce contenu vous est fourni pour votre commodité et à titre informatif seulement et ne saurait être totalement exact ou complet. En cas de contradiction entre la version anglaise de cette page et la traduction, c'est la version anglaise qui prévaut. Afficher la version anglaise de cette page.