Devido a um problema com o Altera® Hard IP para variantes PCI® Express que usam o Soft Reset Controller (SRC), ele pode não deixar o estado de reinicialização quente dentro do tempo necessário.
Nota: os projetos da 2ª geração no Quartus versão 13.1 ou posterior, e todos os projetos da 3ª Geração, para os dispositivos Stratix® V e Arria® V GZ, exigem o uso do SRC. Outros dispositivos não usam o SRC.
A sequência de reinicialização a quente é a seguinte:
- O host PCIe inicia uma reinicialização a quente e entra no estado de reinicialização a quente.
- O HARD IP entra no estado de reinicialização a quente.
- Assim que o host PCIe deixar o estado de reinicialização quente, o Hard IP deve permanecer em reinicialização quente para mais 2 ms e depois sair para Detect.Quiet, de acordo com a especificação PCIe.
No entanto, em projetos que usam o SRC, o tempo limite de 2ms será reiniciado se os receptores alternarem locked_to_data em qualquer uma das pistas ativas. Se existir ruído excessivo em qualquer uma das pistas, os receptores podem alternar locked_to_data. Cada alternância de locked_to_data faz com que o contador de 2ms seja reiniciado, potencialmente para sempre, deixando o Hard IP em um estado constante de reinicialização a quente.
Para contornar esse problema, execute as seguintes etapas.
Abra o arquivo altpcie_rs_serdes.v,
Encontre e comente o código abaixo
dl_ltssm_r <= ltssm;
dl_ltssm_rr <= dl_ltssm_r;
se (dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]=8\'h0) && (hotreset_cnt>20\'h0)) começar
hotreset_cnt <= hotreset_cnt-20\'h1;
Final
outro começar
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;
Insira as seguintes linhas:
dl_ltssm_r <= ltssm;
dl_ltssm_rr <= dl_ltssm_r;
se (dl_ltssm_r == 5\'h14) && (dl_ltssm_rr != 5\'h14)) começar
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Final
se (hotreset_2ms == 1\'b1) começar
exits_hotreset <= 1\'b0;
Final
caso contrário se (dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0)) começar
exits_hotreset <= 1\'b1;
Final
se (exits_hotreset == 1\'b1) && (hotreset_cnt > 20\'h0)) começar
hotreset_cnt <= hotreset_cnt-20\'h1;
Final
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;