Aufgrund eines Problems mit der Altera® Hard IP für PCI® Express-Varianten, die den Soft Reset Controller (SRC) verwenden, kann es vorkommen, dass der Hot-Reset-Status nicht innerhalb der erforderlichen Zeit verlassen wird.
Hinweis: Gen2-Designs in Quartus Version 13.1 oder höher und alle Gen-3-Designs für die Stratix® V- und Arria® V GZ-Geräte erfordern die Verwendung des SRC. Andere Geräte verwenden den SRC nicht.
Die Reihenfolge für den Hot-Reset ist wie folgt:
- Der PCIe-Host initiiert einen Hot-Reset und wechselt in seinen Hot-Reset-Status.
- Die Hard IP geht in den Hot-Reset-Zustand über.
- Sobald der PCIe-Host seinen Hot-Reset-Status verlässt, sollte die Hard IP für weitere 2 ms im Hot-Reset bleiben und dann gemäß der PCIe-Spezifikation zu Detect.Quiet beendet werden.
In Designs, die den SRC verwenden, wird das 2-ms-Timeout jedoch neu gestartet, wenn die Empfänger in einer der aktiven Lanes locked_to_data umschalten. Wenn auf einer der Lanes übermäßiges Rauschen auftritt, schalten die Empfänger möglicherweise locked_to_data. Jeder Umschalter von locked_to_data bewirkt, dass der 2ms-Zähler neu gestartet wird, möglicherweise für immer, und die Hard IP in einem konstanten Hot-Reset-Zustand belässt.
Führen Sie die folgenden Schritte aus, um dieses Problem zu umgehen.
Öffnen Sie die Datei altpcie_rs_serdes.v,
Suchen und kommentieren Sie den folgenden Code aus
dl_ltssm_r <= ltssm;
dl_ltssm_rr <= dl_ltssm_r;
Wenn ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0) && (hotreset_cnt>20\'h0)) beginnen
hotreset_cnt <= hotreset_cnt-20\'h1;
Ende
sonst beginnen
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Ende
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;
Fügen Sie die folgenden Zeilen ein:
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;
Ende
if(hotreset_2ms == 1\'b1) begin
exits_hotreset <= 1\'b0;
Ende
sonst, wenn ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0)) beginnen
exits_hotreset <= 1\'b1;
Ende
Wenn ((exits_hotreset == 1\'b1) && (hotreset_cnt > 20\'h0)) beginnen
hotreset_cnt <= hotreset_cnt-20\'h1;
Ende
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;