Tout d'abord, notez que tous les modèles Verilog ne sont pas synthétisables. Habituellement, seul un sous-ensemble très spécifique de constructions peut être utilisé dans une conception qui doit être réalisée dans le matériel.
Une restriction importante qui apparaît est que chaque reg
variable ne peut être affectée qu'à au plus une always
instruction. En d'autres termes, les reg
s ont une affinité avec les always
blocs.
Les types de always
blocs suivants peuvent généralement être utilisés.
always @(*) begin
// combinational
end
always @(posedge clk) begin
// sequential
end
Dans le premier cas, le *
indique que le bloc doit être exécuté chaque fois qu'un signal utilisé dans le bloc change ou, de manière équivalente, que le bloc doit être exécuté en continu. Par conséquent, les reg
s qui ont une affinité pour les always
blocs combinatoires sont implémentés en tant que signaux calculés à partir d'autres signaux en utilisant une logique combinatoire, c'est-à-dire des portes.
Les registres qui ont une affinité avec des always
blocs de ce dernier type, en revanche, sont des sorties de bascules D qui sont cadencées sur le front montant de clk
(front descendant si negedge
utilisé). Les entrées des bascules sont, encore une fois, calculées avec une logique combinatoire à partir d'autres signaux.
Prenons l'exemple suivant, quelque peu artificiel.
reg out, out_n;
always @(*) begin
out_n = !out;
end
always @(posedge clk) begin
out <= !out;
end
Ici, out_n
est associé au premier always
bloc, out
au second. out_n
sera implémenté avec une seule porte NOT qui pilotera out_n
et sera pilotée out
(notez qu'il s'agit d'une pure logique combinatoire). D'autre part, out
sera entraîné par une bascule cadencée à partir de clk
. L'entrée de la bascule sera à nouveau calculée par une porte NON à partir de out
(qui est entraînée par la bascule susmentionnée). L'optimisation des synthétiseurs combinera les deux portes NOT et utilisera une porte NOT et une bascule.
Selon le matériel dont vous disposez, d'autres types de constructions peuvent être utilisés. Par exemple, si les bascules ont des réinitialisations asynchrones, la construction suivante est également synthétisable.
always @(posedge clk or posedge rst) begin
if (rst)
// reset
else
// sequential
end
block of code
c'est ..