Eu sempre li que os atrasos declarados no código RTL nunca podem ser sintetizados. Eles são feitos apenas para fins de simulação e as ferramentas de síntese modernas apenas ignoram as declarações de atrasos no código.
Por exemplo: x = #10 y;
será considerado como x = y;
pela ferramenta de síntese.
Quais são as razões pelas quais as declarações de atraso em qualquer linguagem de descrição de hardware (por exemplo, VHDL, Verilog ou Sytem-Verilog) não podem ser sintetizadas?
verilog
vlsi
system-verilog
asic
Anand
fonte
fonte
Respostas:
Sintetizar significa, de alguma forma, converter o que você descreveu (no Verilog aqui) em hardware real .
Agora, no seu Verilog, você diz que tem um atraso de 50ns. Ok, mas agora, em termos de hardware, como você os converteria em hardware real?
Se você estiver usando um FPGA, como você criaria seu atraso de 50ns usando os recursos FPGA disponíveis (LUT, Registradores, Elemento Ram, ...)? Adicionando atrasos de roteamento adicionais? imagine que você especifique 1s de atraso! Impossível sem usar TODA a capacidade de roteamento do seu chip (talvez não o suficiente). Seu design não pode ser ajustado. O mesmo para um ASIC. Você usaria 80% da superfície do silício para adicionar um atraso a uma linha.
A maneira como deve funcionar é que você use o design síncrono e implemente o atraso usando contadores ou outras técnicas. Mas os atrasos devem ser múltiplos do relógio desse elemento.
Normalmente, você encontra coisas como teses "após 10 ns" que são atrasos na propagação. Ao fazer uma simulação ideal em um simulador Verilog, as saídas acontecem exatamente quando as entradas mudam. Isso não é realista e não descreve a maneira como o hardware real funciona. Para explicar isso, você pode especificar após quanto tempo sua saída será alterada: usando a declaração de atraso.
fonte
Portando minha resposta do SO . Que enfoca por que é impraticável sintetizar atrasos absolutos
Ao sintetizar árvores de relógio, a ferramenta de síntese os equilibra adicionando atrasos, para que todos os nós recebam o relógio ao mesmo tempo, de modo que parece que a ferramenta de síntese tem a capacidade de adicionar atrasos.
No entanto, quando os ASICs são fabricados, há uma variação na velocidade; em um nível alto, isso pode ser visto como Lento, Típico e Rápido. Na prática, existem centenas de variações desses cantos em que certos tipos de dispositivos no silício correm rápido e outros lentos.
Esses cantos do silício também têm classificação de temperatura, o pior caso pode ser + 140C silício rápido e -40C silício lento. A variação do atraso através de um buffer neste caso pode ser de 1ns para dizer 30ns.
Para trazer isso de volta ao Verilog, se
#10
fosse sintetizável, você obteria 155 + -145, ou seja, 10ns a 300ns, se você também projetou algo#20
para fazer parte da mesma interface ou estrutura de controle, ele terá um intervalo de 20ns a 600ns . Portanto, a coisa toda não é realmente válida em relação ao seu design. Você não entende exatamente#10
e#20
que foram especificados.As árvores de relógio são projetadas de forma a limitar os atrasos máximos e mínimos e, assim, todos os nós na árvore de relógio escalam um em relação ao outro. Eles nunca recebem uma regra tão estrita que deve ser o número 10ns, pois isso é fisicamente impossível de garantir em um circuito combinatório.
fonte
A única unidade de tempo absoluta seria de um relógio externo. De onde viria o atraso arbitrário - que tipo de equivalente lógico digital discreto o produziria a partir do relógio?
Se você deseja um atraso sintetizável, precisará usar a entrada do relógio externo e uma máquina / contador de estados apropriado que conte para um número específico de ciclos de relógio.
fonte