Debido a un problema con la IP dura de Altera® para las variantes PCI® Express que utilizan el controlador de restablecimiento parcial (SRC), es posible que no salga del estado de restablecimiento en caliente dentro del tiempo requerido.
Nota: Los diseños de Gen2 en Quartus versión 13.1 o posterior, y todos los diseños de Gen 3, para los dispositivos Stratix® V y Arria® V GZ, requieren el uso del SRC. Otros dispositivos no utilizan el SRC.
La secuencia para el restablecimiento en caliente es la siguiente:
- El host PCIe inicia un hot reset y entra en su estado de hot reset
- El IP duro entra en su estado de restablecimiento en caliente.
- Una vez que el host PCIe deja su estado de restablecimiento en caliente, la IP dura debe permanecer en restablecimiento en caliente durante 2 ms adicionales y luego salir a Detect.Quiet, según la especificación PCIe.
Sin embargo, en los diseños que utilizan el SRC, el tiempo de espera de 2 ms se reiniciará si los receptores alternan locked_to_data en cualquiera de los carriles activos. Si hay ruido excesivo en alguno de los carriles, los receptores pueden alternar locked_to_data. Cada alternancia de locked_to_data hace que el contador de 2 ms se reinicie, potencialmente para siempre, dejando la IP dura en un estado de restablecimiento en caliente constante.
Para evitar este problema, realice los pasos siguientes.
Abra el archivo altpcie_rs_serdes.v,
Busque y comente el código a continuación
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;
Final
else begin
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Final
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;
Insértese las líneas siguientes:
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;
Final
if(hotreset_2ms == 1\'b1) begin
exits_hotreset <= 1\'b0;
Final
else if ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0)) begin
exits_hotreset <= 1\'b1;
Final
if ((exits_hotreset == 1\'b1) && (hotreset_cnt > 20\'h0)) begin
hotreset_cnt <= hotreset_cnt-20\'h1;
Final
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;