Como identificar áreas de um projeto de FPGA que usam mais recursos e área?


11

Estou trabalhando em um projeto de FPGA grande e estou muito próximo dos limites de recursos do FPGA que estou usando atualmente, o Xilinx LX16 no pacote CSG225.

O design também está quase completo, no entanto, no momento, ele não se encaixa mais no FPGA. Posso desligar as peças para ajustá-las, no entanto, preciso reduzir o uso de recursos para concluir o design e atender aos requisitos de tempo e tamanho.

Gostaria de saber se existem ferramentas em nossos relatórios que podem me ajudar a identificar quais partes do meu design estão consumindo mais recursos. Meu design não é particionado e está dividido em cerca de uma dúzia ou mais de módulos VHDL.

Os relatórios de tempo do Xilinx são fantásticos, mas agora preciso saber onde posso obter o meu melhor retorno em termos de economia de espaço.

Eu também tenho dificuldade em dizer que tipo de recursos estou ficando sem ou quais os efeitos.

Outro aborrecimento é que, à medida que o design aumenta, os componentes que costumavam atender ao tempo estão começando a falhar, porque seu posicionamento não é mais o ideal.

Atualmente, eu uso os relatórios de tempo estático pós-local e rota, e uso o SmartXplorer. Estou usando estratégias de design para otimizar o tempo.

Depois de desativar parte do meu design para ajustá-lo, aqui estão alguns dos resultados:

utilização do registro de fatia: 42% utilização da fatia de LUT: 96% número de pares LUT-FF totalmente usados: 38% Isso significa que eu sou leve nos registros, mas muito exigente no uso de portas?

Existem ferramentas para ajudar os desenvolvedores a otimizar por área ou, pelo menos, fornecer a eles mais informações sobre seu código?

Atualização: Depois de analisar a utilização no nível do módulo, descobri que havia pequenas assinaturas assíncronas de cola em todo o lugar, que representam cerca de 30% do total de LUTs. Estou usando-os como cola de domínio cruzado para ônibus de alta velocidade. Eu deveria ser capaz de eliminá-los, uma vez que os relógios estão intimamente relacionados. (Entrada de 120 MHz, produz 100 MHz e 200 MHz através de DCMs)


Parece que você tem muitas interconexões entre os sinais, tenho certeza de que pode consertar isso alterando os níveis de otimização, compartilhamento de recursos e outros. Qual ferramenta você está usando? ISE ou Vivado?
perfil completo de Farhad

1
Estou usando o ISE (o Vivado não oferece suporte ao Spartan-6). Eu publiquei isso nos fóruns do Xilinx e eles disseram para ativar o Relatório Detalhado do Mapa. Eu fiz isso, e o arquivo * .mrp agora contém a Seção 13 - Utilização pela hierarquia. Postarei os dados assim que os tiver formatado melhor.
Marcus10110

Respostas:


5

Cruzei esta pergunta no Fórum Xilinx aqui: http://forums.xilinx.com/t5/Implementation/How-to-determine-what-part-of-the-design-consumes-the-most/td-p / 393247

Essa resposta é amplamente baseada nos comentários. Agradecimentos a Deepika, Sikta e Gabor.

Primeiro, ative 'Gerar relatório detalhado do MAPA' nas propriedades do processo do mapa (-detalhe).

Em seguida, abra o Resumo do Design e navegue para Utilização no Nível do Módulo. Aqui está a hierarquia completa, mostrando a utilização de design exclusivo e inclusivo.

Cada linha mostrará um par de números como 0/5392. Isso significa que esse módulo contém zero desse elemento específico, mas esse módulo e todos os seus submódulos contêm um total de 5392 elementos.

Aqui está minha saída (parcialmente expandida) Relatório de utilização

Ao trabalhar na redução do tamanho, o Gabor recomenda mudar para um FPGA maior nas ferramentas de sintetizador, para que ele possa mapear completamente mesmo quando for muito grande para caber no seu FPGA atual e fará com que as ferramentas funcionem mais rapidamente.


3

Parece que você está usando quase todos os recursos lógicos enquanto usa apenas metade dos registros. Parece que você precisa descobrir o que está consumindo todas as suas LUTs. Existem maneiras de otimizar componentes específicos e torná-los um pouco mais eficientes em termos de espaço - coisas como RAMs, registradores de turnos e máquinas de estado. Veja o arquivo .log resultante do sintetizador. Ele informará que tipo de componentes estão sendo inferidos. Verifique se ele está inferindo os componentes corretamente. Caso contrário, pode não estar gerando uma netlist particularmente eficiente. Você pode contar muito apenas observando os arquivos de log de síntese. É possível que algumas pequenas alterações no seu código permitam ao sintetizador inferir vários componentes; portanto, dê uma olhada no manual do sintetizador para obter algum modelo. Pode ser necessário alternar o sintetizador para otimizar a área em vez da velocidade. Além disso, verifique se você não tem nenhuma configuração inferida desativada. Uma vez tentei sintetizar um componente de design que consumia 40% de um Spartan 3E 500 (9.312 pares LUT / FF de 4 entradas, 5,6 KB de RAM de bloco) para um Virtex 6 HXT 565 (354.240 pares LUT de 6 entradas / FF duplo, 32 MB de RAM). Demorou 7 horas para o Xilinx par terminar e ocupou cerca de 40% do chip. ?!?!?!? Acontece que a RAM inferida do bloco foi desativada e o sintetizador transformou vários KB de RAM em LUTs. Não é a decisão mais eficiente de sempre. Depois de alterar a configuração, ocupou 1% do chip. Vai saber. 312 pares LUT / FF de 4 entradas, bloco de 5,6 KB de RAM) para um Virtex 6 HXT 565 (354.240 pares LUT de 6 entradas / FF duplo, bloco de 32 MB de RAM). Demorou 7 horas para o Xilinx par terminar e ocupou cerca de 40% do chip. ?!?!?!? Acontece que a RAM inferida do bloco foi desativada e o sintetizador transformou vários KB de RAM em LUTs. Não é a decisão mais eficiente de sempre. Depois de alterar a configuração, ocupou 1% do chip. Vai saber. 312 pares LUT / FF de 4 entradas, bloco de 5,6 KB de RAM) para um Virtex 6 HXT 565 (354.240 pares LUT de 6 entradas / FF duplo, bloco de 32 MB de RAM). Demorou 7 horas para o Xilinx par terminar e ocupou cerca de 40% do chip. ?!?!?!? Acontece que a RAM inferida do bloco foi desativada e o sintetizador transformou vários KB de RAM em LUTs. Não é a decisão mais eficiente de sempre. Depois de alterar a configuração, ocupou 1% do chip. Vai saber.


3

Vale a pena postar toda a seção 'uso de recursos' na saída da ferramenta.

Você usa todas as RAMs de bloco? É comum poder substituir funções lógicas / matemáticas por tabelas de consulta de RAM equivalentes se o domínio for suficientemente restrito e elas tiverem complexidade suficiente para valer a pena calcular previamente.

Assim como a inferência de memória, o mesmo se aplica aos multiplicadores. Às vezes, um pequeno desvio do modelo de instanciação recomendado pode fazer com que o multiplicador seja inferido nas unidades DSP48A.

Se você estiver usando o controlador PCIe, poderá reduzir o espaço total do buffer reservado para cargas úteis TLP ou o tamanho máximo do pacote TLP? Isso pode reduzir o uso de RAM / lógica do núcleo do IP ao custo da largura de banda total / de reserva.

Com o (Altera) Quartus, você pode selecionar vários itens na exibição da hierarquia de design e ver lá o uso da área pós-P & R codificado / agrupado em cores. Isso pode dar uma idéia visual do uso relativo dos seus módulos de design.


Obrigado. Estou usando as macros IP rígidas para os multiplicadores e usei o CoreGen para fazer os FIFOs, embora tenha selecionado alguns dos pequenos programas para usar a RAM distribuída (em vez da RAM do bloco). Vou dar uma olhada no uso deles.
Marcus10110
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.