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 regvariáveis podem ser atribuídas apenas em no máximo uma alwaysinstrução. Em outras palavras, regs têm afinidade com alwaysblocos.
Os seguintes tipos de alwaysblocos 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, regs que têm afinidade com alwaysblocos 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 alwaysblocos 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 negedgeusada). 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_nestá associado ao primeiro alwaysbloco, outao segundo. out_nserá implementado com um único portão NOT que será acionado out_ne acionado out(observe que é uma lógica combinacional pura). Por outro lado, outserá 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é ..