A reconfiguração do transceptor \'reconfig_busy\' porta de saída pode ficar presa, afirmada alta após uma afirmação de redefinição. Os canais do transceptor conectados ao controlador de reconfiguração afetado também podem ficar travados na reinicialização. A porta de saída \'reconfig_busy\' permanece presa mesmo após redefinir o controlador de reconfiguração; apenas reprogramar o dispositivo pode resolver o problema.
Este sintoma pode ser causado pela estrutura de reinicialização interna do controlador de reconfiguração do transceptor. Uma afirmação assíncrona de redefinição da lógica que conduz o barramento de endereço de uma RAM M20K pode causar propagação lógica assíncrona. Isso pode fazer com que várias linhas de endereço no M20K se tornem afirmadas simultaneamente, o que pode causar compartilhamento de carga entre células de bits, corrompendo o conteúdo do M20K.
Esta corrupção afeta o controlador de reconfiguração de dispositivos Stratix® V e Arria® V GZ porque contém um processador Nios® II que é usado para calibração de PMA, e o código do programa do processador é armazenado na RAM M20K. Se a corrupção ocorrer dentro da memória Nios® II do programa, isso pode fazer com que o processador seja travado, resultando na porta de reconfig_busy de saída ficando emperrada. A recuperação desta situação só é possível reprogramando o dispositivo, pois o conteúdo do M20K é carregado apenas durante a programação do dispositivo.
A correção para este problema alterará o controlador de reinicialização interna e a estrutura de redefinição do controlador de reconfiguração do transceptor para usar reinicializações síncronas, bem como desaconsorize preventivamente a porta clock_enable M20K durante uma condição de reinicialização.
A correção estará disponível em uma versão futura do software Quartus® II. Um patch pode ser fornecido para versões anteriores do software Quartus II enviando uma solicitação de serviço no meuSupport. Se uma solução for necessária imediatamente, a correção pode ser aplicada manualmente usando as seguintes instruções.
Há 9 arquivos que precisam ser adicionados ou modificados:
-
altera_reset_controller_early_ce_mod.v (adicionar)
-
altera_reset_synchronizer_early_ce_mod.v (adicionar)
-
Arquivo QIP associado ao controlador de reconfiguração do transceptor (modifique)
-
alt_xcvr_reconfig.sv (modificar)
-
alt_xcvr_reconfig_soc.sv (modificar)
-
alt_xcvr_reconfig_cpu.v (modificar)
-
alt_xcvr_reconfig_cpu_ram.sv (modificar)
-
sv_xrbasic_lif_csr.sv (modificar)
-
sv_xcvr_reconfig_mif_avmm.sv (modificar)
Esses 9 arquivos devem estar localizados no diretório onde o controlador de reconfiguração do transceptor foi gerado.
Baixe altera_reset_controller_early_ce_mod.v e coloque-o no diretório onde os arquivos de reconfiguração do transceptor são mantidos:
Download altera_reset_synchronizer_early_ce_mod.v e coloque-o no diretório onde os arquivos de reconfiguração do transceptor são mantidos:
Para adicionar esses dois arquivos ao seu design, localize e modifique o arquivo .qip associado à instância do controlador de reconfiguração do transceptor e adicione as duas linhas a seguir ao arquivo:
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [junte-se a $:quartus(qip_path) "LIBRARY_PATH/altera_reset_controller_early_ce_mod.v"]
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [junte-se a $:quartus(qip_path) "LIBRARY_PATH/altera_reset_synchronizer_early_ce_mod.v"]
Nas duas linhas acima, modifique LIBRARY_NAME e LIBRARY_PATH para corresponder às outras entradas no arquivo .qip do controlador de reconfiguração do transceptor.
Para alt_xcvr_reconfig.sv, faça as seguintes modificações:
-
Localize a alt_xcvr_resync do módulo de alt_xcvr_resync e reverte as conexões entre as portas 'd' e 'redefinir'. Uma vez modificada, a instação deve ser a seguinte:
alt_xcvr_resync #(
. INIT_VALUE (1)
) inst_reconfig_reset_sync (
.clk (mgmt_clk_clk),
.d (mgmt_rst_reset),
.reset (1\'b0),
.q (r_mgmt_rst_reset)
);
Para alt_xcvr_reconfig_soc.sv, faça as seguintes modificações:
Adicione a seguinte definição de fio perto da parte superior do módulo:
fio cpu_reset_req;
Localize a instação do módulo alt_xcvr_reconfig_cpu e adicione a seguinte porta:
.ram_ce (cpu_reset_req),
Localize a instação do módulo alt_xcvr_reconfig_cpu_ram e adicione a seguinte porta:
.ram_ce (cpu_reset_req),
Para alt_xcvr_reconfig_cpu.v, faça as seguintes modificações:
-
Adicione a seguinte porta ao nível superior:
fio de saída ram_ce,
-
Adicione o seguinte código ao módulo:
fio m20k_gate;
fio altera_ram_clock_enable;
atribuir altera_ram_clock_enable = ~ m20k_gate;
atribuir ram_ce = altera_ram_clock_enable;
-
Encontre a instação do altera_reset_controller e altere isso para uma instaução de altera_reset_controller_early_ce_mod. Adicione a porta m20k_gate a esta instação e conecte-a ao sinal m20k_gate sinal. Após fazer essas modificações, a instação deve ser a seguinte:
altera_reset_controller_early_ce_mod #(
. NUM_RESET_INPUTS (1),
. OUTPUT_RESET_SYNC_EDGES ("desaassert"),
. SYNC_DEPTH (2)
) rst_controller (
.reset_in0 (~reset_reset_n), // reset_in0.reset
.clk (clk_clk), // clk.clk
.reset_out (reconfig_ctrl_reset_reset), // reset_out.reset
.m20k_gate (m20k_gate),
.reset_in1 (1\'b0), // (encerrado)
.reset_in2 (1\'b0), // (encerrado)
.reset_in3 (1\'b0), // (encerrado)
.reset_in4 (1\'b0), // (encerrado)
.reset_in5 (1\'b0), // (encerrado)
.reset_in6 (1\'b0), // (encerrado)
.reset_in7 (1\'b0), // (encerrado)
.reset_in8 (1\'b0), // (encerrado)
.reset_in9 (1\'b0), // (encerrado)
.reset_in10 (1\'b0), // (encerrado)
.reset_in11 (1\'b0), // (encerrado)
.reset_in12 (1\'b0), // (encerrado)
.reset_in13 (1\'b0), // (encerrado)
.reset_in14 (1\'b0), // (encerrado)
.reset_in15 (1\'b0) // (encerrado)
);
Para o arquivo alt_xcvr_reconfig_cpu_ram.sv , faça as seguintes modificações:
-
Adicione a seguinte porta de entrada:
entrada ram_ce,
-
Encontre a instanização de altsyncram e modifique a porta clocken0 para conectá-la à nova porta de entrada ram_ce de entrada:
.clocken0 (ram_ce),
-
Modifique as definições de defparam clock_enable_input/output_a/b da seguinte forma:
altsyncram_component.clock_enable_input_a = "NORMAL",
altsyncram_component.clock_enable_input_b = "NORMAL",
altsyncram_component.clock_enable_output_a = "NORMAL",
altsyncram_component.clock_enable_output_b = "NORMAL",
Para o arquivo sv_xrbasic_lif_csr.sv , faça as seguintes modificações:
-
Localize o bloqueio sequencial sempre que controla o endereço do canal lógico. Este bloqueio sempre pode ser identificado pelo comentário "// registro de canal lógico" acima. Remova a condição de redefinição da lista de sensibilidade. Uma vez modificado, o início do bloco sempre deve ser o seguinte:
registro de canal lógico
sempre @(posedge reconfig_clk) começar
se (reset == 1) começar
...
-
Localize o bloqueio sequencial sempre que controla o registro de endereços de reconfig nativo. Este bloqueio sempre pode ser identificado pelo comentário "// registro de endereço de reconfig nativo, pode ser interpretado como endereço de deslocamento de canal ou endereço físico" acima dele. Remova a condição de redefinição da lista de sensibilidade. Uma vez modificado, o início do bloco sempre deve ser o seguinte:
registro de endereços de reconfig nativo, pode ser interpretado como endereço de deslocamento de canal ou endereço físico
sempre @(posedge reconfig_clk) começar
se (reset == 1) começar
...
Para o arquivo sv_xcvr_reconfig_mif_avmm.sv , essa alteração só é necessária se a reconfiguração de canal ou PLL estiver habilitada na GUI megawizard do controlador de reconfiguração do transceptor. Faça a seguinte modificação:
-
Localize o bloqueio sequencial sempre que tenha o comentário "/Avalon saída e armazenamento interno" acima e remova a condição de redefinição da lista de sensibilidade. Uma vez modificado, o início do bloco sempre deve ser o seguinte:
Avalon e armazenamento interno
sempre @(posedge clk)
Começar
se (redefinir) começar
...
Após todas essas alterações, seu design precisará ser recompilado.