Innanzitutto, nota che non tutti i design di Verilog sono sintetizzabili. Di solito, solo un sottoinsieme molto specifico di costrutti può essere utilizzato in un progetto che deve essere realizzato in hardware.
Un'importante restrizione che si apre è che ogni regvariabile può essere assegnata al massimo in una sola alwaysistruzione. In altre parole, regs ha affinità con i alwaysblocchi.
I seguenti tipi di alwaysblocchi possono essere generalmente utilizzati.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
Nel primo caso, *indica che il blocco deve essere eseguito ogni volta che cambia qualsiasi segnale utilizzato nel blocco o, equivalentemente, che il blocco deve essere eseguito continuamente. Pertanto, gli regs che hanno affinità con i alwaysblocchi combinatori sono implementati come segnali calcolati da altri segnali usando la logica combinatoria, cioè le porte.
I registri che hanno affinità con i alwaysblocchi di quest'ultimo tipo, d'altra parte, sono uscite di infradito D che sono sincronizzate sul fronte di salita di clk(fronte di discesa se negedgeusato). Gli input per le infradito sono, di nuovo, calcolati con la logica combinatoria da altri segnali.
Considera il seguente esempio in qualche modo inventato.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Qui, out_nè associato al primo alwaysblocco, outal secondo. out_nsarà implementato con un singolo gate NOT che guiderà out_ne sarà guidato da out(si noti che è una logica combinatoria pura). D'altra parte, outsarà guidato da un infradito con clock clk. L'input per il flip-flop verrà nuovamente calcolato da un gate NOT da out(che è guidato dal summenzionato flip-flop). L'ottimizzazione dei sintetizzatori combinerà le due porte NOT e utilizzerà una porta NOT e una flip-flop.
A seconda dell'hardware disponibile, è possibile utilizzare altri tipi di costrutti. Ad esempio, se le infradito hanno ripristini asincroni, anche il seguente costrutto è sintetizzabile.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of codeè ...