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 reg
variabile può essere assegnata al massimo in una sola always
istruzione. In altre parole, reg
s ha affinità con i always
blocchi.
I seguenti tipi di always
blocchi 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 reg
s che hanno affinità con i always
blocchi combinatori sono implementati come segnali calcolati da altri segnali usando la logica combinatoria, cioè le porte.
I registri che hanno affinità con i always
blocchi 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 negedge
usato). 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 always
blocco, out
al secondo. out_n
sarà implementato con un singolo gate NOT che guiderà out_n
e sarà guidato da out
(si noti che è una logica combinatoria pura). D'altra parte, out
sarà 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
è ...