Usando portas de buffer em VHDL?

Oct 31 2020

É uma má prática de codificação usar portas de buffer em VHDL?

Eu defino uma entidade com uma porta de saída com o_done.

entity blahblah is
  port (
...other signals...
 o_done    : out std_logic;              
  );
end entity blahblah;

O sintetizador não gosta que eu leia uma porta de saída e não a sintetizará - embora seja um código VHDL 2008 legal. Não consigo mudar meu sintetizador.

Eu uso o_done em 2 processos com clock:

process begin
    wait until rising_edge(clk);
    if (reset = '1') then
      o_done <= '0';
    else
      if ( State1 ) then
        o_done <= '1';
      elsif ( o_done = '1' AND State0 ) then
        o_done <= '1';
      else
        o_done <= '0';
      end if;
    end if;
  end process;

  process begin
    wait until rising_edge(clk);
    if (reset = '1') then
      count <= to_unsigned(0, 8);
    else
      if( stateS0 AND done = '1' ) then
        count <= to_unsigned(0, 8);
      elsif( stateS1 AND y_counter >= 2 AND p >= 0 ) then
        count <= count + 1;
      end if;
    end if;
  end process;

Novamente, o_done, desde que definido como out na declaração de porta, não é sintetizável, pois o mecanismo de síntese não é totalmente compatível com VHDL 2008. Não consigo mudar o sintetizador.

Então, como faço para contornar o_done sendo uma porta de saída e querendo lê-lo?

Posso fazer um sinal intermediário - como faço isso normalmente?

Respostas

3 MituRaj Oct 31 2020 at 01:34

Sim, você pode usar a solução simples de criar um sinal interno:

signal done : std_logic ;

Use este sinal dentro do seu processo com clock.

E simplesmente atribua-o o_donecomo uma instrução simultânea dentro da definição de arquitetura:

o_done <= done ;

Eu realmente não tive a necessidade de usar portas de buffer em códigos VHDL até agora. Isso é algo que extraí do Guia de Síntese Xilinx Vivado:

O VHDL permite o modo de porta de buffer quando um sinal é usado internamente e como uma porta de saída quando há apenas um driver interno. As portas de buffer são uma fonte potencial de erros durante a síntese e complicam a validação dos resultados da pós-síntese por meio da simulação. referência: Capítulo 5, Guia de Síntese Xilinx Vivado