En raison d’un problème avec l’IP matérielle Altera® pour les variantes PCI® Express qui utilisent le contrôleur de réinitialisation logicielle (SRC), il est possible qu’elle ne quitte pas l’état de réinitialisation à chaud dans le délai requis.
Remarque : les conceptions Gen2 dans Quartus version 13.1 ou ultérieure, et toutes les conceptions Gen 3, pour les périphériques Stratix® V et Arria® V GZ, nécessitent l’utilisation du SRC. Les autres appareils n’utilisent pas le SRC.
La séquence de réinitialisation à chaud est la suivante :
- L’hôte PCIe initie une réinitialisation à chaud et entre dans son état de réinitialisation à chaud.
- L’IP matérielle entre dans son état de réinitialisation à chaud.
- Une fois que l’hôte PCIe quitte son état de réinitialisation à chaud, l’IP matérielle doit rester en réinitialisation à chaud pendant 2 ms supplémentaires, puis quitter Detect.Quiet, conformément à la spécification PCIe.
Cependant, dans les conceptions qui utilisent le SRC, le délai d’attente de 2 ms sera redémarré si les récepteurs basculent locked_to_data sur l’une des voies actives. S’il existe un bruit excessif sur l’une des voies, les récepteurs peuvent basculer locked_to_data. Chaque bascule de locked_to_data provoque le redémarrage du compteur de 2 ms, potentiellement pour toujours, laissant l’IP dur dans un état constant de réinitialisation à chaud.
Pour contourner ce problème, procédez comme suit.
Ouvrez le fichier altpcie_rs_serdes.v,
Trouvez et commentez le code ci-dessous
dl_ltssm_r <= ltssm;
dl_ltssm_rr <= dl_ltssm_r;
if ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0) && (hotreset_cnt>20\'h0)) begin
hotreset_cnt <= hotreset_cnt-20\'h1;
Fin
sinon commencer
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Fin
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;
Insérer les lignes suivantes :
dl_ltssm_r <= ltssm;
dl_ltssm_rr <= dl_ltssm_r;
if((dl_ltssm_r == 5\'h14) && (dl_ltssm_rr != 5\'h14)) begin
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Fin
if(hotreset_2ms == 1\'b1) begin
exits_hotreset <= 1\'b0;
Fin
else if ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0)) begin
exits_hotreset <= 1\'b1;
Fin
if ((exits_hotreset == 1\'b1) && (hotreset_cnt > 20\'h0)) begin
hotreset_cnt <= hotreset_cnt-20\'h1;
Fin
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;