Quero projetar um bloco de lógica combinatória usando VHDL, mas, ocasionalmente, o resultado sintetizado contém uma trava não intencional.
Quais diretrizes de codificação eu preciso seguir para evitar que o sintetizador deduza travas?
Exemplo: no pequeno segmento de código, devo usar instruções if-else?
Respostas:
Para evitar travas, é necessário garantir que todas as suas saídas sejam atribuídas em todas as possíveis ramificações do código.
por exemplo,
geraria uma trava, porque na primeira condição, o valor de b (1) não é especificado; portanto, o compilador decidiu que você deseja manter o valor anterior de b (1) lá. Uma maneira de escrever isso que não geraria uma trava é:
Aqui, você declara explicitamente que b deve reter seu valor antigo e depois substitui b (0) pelo novo valor.
Outra maneira é dar um valor padrão ba, como na resposta do @ TomiJ.
Se você publicar o código no qual está obtendo uma trava, poderemos ajudá-lo a encontrar o motivo específico.
fonte
b <= b
evite uma trava, pois ainda requer a preservação do estado do sinal.Se você estiver usando processos para a lógica combinacional (e não aconselho isso por esse motivo), certifique-se de que todo caminho no processo atribua algo a todos os sinais que o processo conduz. Nenhuma das saídas pode depender de nenhuma das saídas da "última vez" que o processo foi executado.
Caso contrário, você deduz uma trava porque na próxima vez que o processo é agendado, ele deve manter o valor do sinal que não recebeu um novo valor da última vez.
Prefiro manter a lógica puramente combinatória como atribuições contínuas e usar processos para a lógica com clock, para que não receba travas.
fonte
Quatro regras para evitar travas:
Além disso, se você tiver vários processos combinacionais, certifique-se de não criar um loop.
Vários estilos de codificação podem ajudá-lo a seguir essas regras, por exemplo, o estilo na resposta do @ TomiJ. Como @Martin Thompson ressalta, pode ser melhor evitar a lógica combinacional todos juntos. Coloque tudo em um processo cronometrado.
fonte
Como foi apontado por @fbo e @Martin Thompson, você precisa garantir que todo sinal acionado pelo processo receba algum valor em cada ramo do processo, e esse valor não deve depender do estado anterior de nenhuma das saídas do processo.
A maneira mais fácil de garantir isso é atribuir algum valor padrão a cada saída no início do processo, por exemplo (cooptando o exemplo do fbo):
fonte