En raison d’un problème avec le logiciel Intel® Quartus® Prime 16.1, la tx_bonding_clocks d’horloge générée de Arria 10 PCIe Hard IP Gen3 est incorrecte.
La raison en est que la altera_pcie_express.sdc a des contraintes manquantes.
Pour résoudre ce problème, veuillez ajouter les commandes dedc suivantes à la fin de altera_pcie_express.sdc.
proc skp_sdc_puts {msg {channelId stdout}} {
met $channelId « altera_pcie_a10_skp.sdc >> $msg »
}
proc parent_of_clock {clock_name {MAX_ATTEMPTS 100}} {
skp_sdc_puts « *** *
skp_sdc_puts « ***** Recherchant la hiérarchie de $clock_name ********* »
skp_sdc_puts « *** *
définir des tentatives 0
définir le parent {}
{$attempts < $MAX_ATTEMPTS} {
skp_sdc_puts « Rechercher des horloges qui correspondent à \"$parent$clock_name\ » ... »
définissez matched_clock_collection [get_clocks -maintenant $parent$clock_name] ;# Essayez cette wildcard.
définir num_matched_clocks [get_collection_size $matched_clock_collection]
si { $num_matched_clocks == 1 } { ;# C’est la hiérarchie que nous recherchons.
# Trouvez le nom complet du parent.
définir le parent [join [lrange [split [query_collection $matched_clock_collection] {|}] 0 {end-1}] {|}]
skp_sdc_puts « Parent trouvé : $parent »
skp_sdc_puts « *** *
skp_sdc_puts « *** Terminer la recherche avec le résultat : $parent ******
skp_sdc_puts « *** *
$parent de retour
} elseif { $num_matched_clocks > 1 } { ;# Plusieurs horloges avec le même nom - cela ne devrait pas se produire.
skp_sdc_puts « Erreur : plusieurs horloges correspondent à $parent $ clock_name » {stderr}
skp_sdc_puts « Erreur : Les horloges appariées sont : » {stderr}
skp_sdc_puts « Erreur : [query_collection $matched_clock_collection -report_format] » {stderr}
skp_sdc_puts « *** *
skp_sdc_puts « *** Terminer la recherche avec l’erreur **** »
skp_sdc_puts « *** *
Retour
} d’autre {;# Monter d’un niveau de hiérarchie.
parent d’annexe {*|}
tentatives d’incr
}
}
skp_sdc_puts « Erreur : impossible de trouver le parent de $clock_name dans les tentatives de $MAX_ATTEMPTS »
skp_sdc_puts « *** *
skp_sdc_puts « *** Terminer la recherche avec l’erreur **** »
skp_sdc_puts « *** *
Retour
}
derive_pll_clocks derive_pll_clocks create_base_clocks doit être appelé avant d’appeler parent_of_clock
derive_clock_uncertainty ;# afin de générer une hiérarchie appropriée.
préfixe [parent_of_clock {tx_serial_clk}]
pour {set i 0} {$i != 8} {incr i} {
create_generated_clock -divide_by 1 \
-source « $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|byte_deserializer_pcs_clk_div_by_2_txclk_reg » \
-nom « $prefix|rx_pcs_clk_div_by_4[$i] » \
« $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|sta_rx_clk2_by2_1 » ;# cible
create_generated_clock -multiply_by 1 -divide_by 1 \
-source « $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_tx_pcs.inst_twentynm_hssi_8g_tx_pcs|byte_serializer_pcs_clk_div_by_2_reg » \
-nom « $prefix|tx_pcs_clk_div_by_4[$i] » \
« $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_tx_pcs.inst_twentynm_hssi_8g_tx_pcs|sta_tx_clk2_by2_1 » ; cible #
}
remove_clock « $prefix|tx_bonding_clocks[0] »
create_generated_clock -multiply_by 1 -divide_by 10 \
-source « $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_pll.g_pll_g3n.lcpll_g3xn|lcpll_g3xn|a10_xcvr_atx_pll_inst|twentynm_hssi_pma_cgb_master_inst|clk_fpll_b » \
-master_clock « $prefix|tx_serial_clk » \
-nom « $prefix|tx_bonding_clocks[0] » \
« $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_pll.g_pll_g3n.lcpll_g3xn|lcpll_g3xn|a10_xcvr_atx_pll_inst|twentynm_hssi_pma_cgb_master_inst|cpulse_out_bus[0] »
set_multicycle_path-setup -through [get_pins -compatibility_mode {*pld_rx_data*}] 0
définir rx_clkouts [liste]
pour {set i 0} {$i != 8} {incr i} {
remove_clock « $prefix|g_xcvr_native_insts $i |rx_clk »
remove_clock « $prefix|g_xcvr_native_insts $i] |rx_clkout »
create_generated_clock -multiply_by 1 \
-source « $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|byte_deserializer_pcs_clk_div_by_4_txclk_reg » \
-master_clock « $prefix|tx_bonding_clocks[0] » \
-nom « $prefix|g_xcvr_native_insts[$i]|rx_clk » \
« $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|sta_rx_clk2_by4_1 » ;# cible
create_generated_clock -multiply_by 1 \
-source « $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|byte_deserializer_pld_clk_div_by_4_txclk_reg » \
-master_clock « $prefix|tx_bonding_clocks[0] » \
-nom « $prefix|g_xcvr_native_insts[$i]|rx_clkout » \
« $prefix|altpcie_a10_hip_pipen1b|g_xcvr.altpcie_a10_hip_pllnphy|g_xcvr.g_phy_g3x8.phy_g3x8|phy_g3x8|g_xcvr_native_insts[$i].twentynm_xcvr_native_inst|twentynm_xcvr_native_inst|inst_twentynm_pcs|gen_twentynm_hssi_8g_rx_pcs.inst_twentynm_hssi_8g_rx_pcs|sta_rx_clk2_by4_1_out »
set_clock_groups -exclusif \
-groupe « $prefix|tx_bonding_clocks[0] » \
-groupe « $prefix|g_xcvr_native_insts[$i]|rx_clkout »
set_clock_groups -exclusif \
-groupe « $prefix|tx_bonding_clocks[0] » \
-group « $prefix|rx_pcs_clk_div_by_4[$i] »
}
Ce problème est résolu à partir de la version 17.1 du logiciel Intel® Quartus® Prime Standard Edition.