Primeiro, observe que nem todos os designs da Verilog são sintetizáveis. Normalmente, apenas um subconjunto muito específico de construções pode ser usado em um design que deve ser realizado em hardware.
Uma restrição importante que aparece é que todas as reg
variáveis podem ser atribuídas apenas em no máximo uma always
instrução. Em outras palavras, reg
s têm afinidade com always
blocos.
Os seguintes tipos de always
blocos geralmente podem ser usados.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
No primeiro caso, *
indica que o bloco deve ser executado sempre que qualquer sinal usado no bloco for alterado ou, equivalentemente, que o bloco deve ser executado continuamente. Portanto, reg
s que têm afinidade com always
blocos combinacionais são implementados como sinais computados de outros sinais usando lógica combinacional, ou seja, portas.
Os registradores que têm afinidade com os always
blocos deste último tipo, por outro lado, são saídas de flip-flops D que são marcados com freqüência na borda ascendente de clk
(borda descendente, se negedge
usada). As entradas para os flip-flops são, novamente, computadas com lógica combinacional de outros sinais.
Considere o seguinte exemplo, um tanto artificial.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Aqui, out_n
está associado ao primeiro always
bloco, out
ao segundo. out_n
será implementado com um único portão NOT que será acionado out_n
e acionado out
(observe que é uma lógica combinacional pura). Por outro lado, out
será conduzido por um flip-flop com clock de clk
. A entrada para o flip-flop será novamente calculada por um gate NOT out
(que é acionado pelo flip-flop acima mencionado). A otimização dos sintetizadores combinará os dois portões NOT e usará um gate NOT e um flip-flop.
Dependendo do hardware que você tem disponível, outros tipos de construções podem ser usados. Por exemplo, se os flip-flops tiverem redefinições assíncronas, a construção a seguir também será sintetizada.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of code
é ..