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 regvariable ne peut être affectée qu'à au plus une alwaysinstruction. En d'autres termes, les regs ont une affinité avec les alwaysblocs.
Les types de alwaysblocs 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 regs qui ont une affinité pour les alwaysblocs 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 alwaysblocs 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 negedgeutilisé). 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_nest associé au premier alwaysbloc, outau second. out_nsera implémenté avec une seule porte NOT qui pilotera out_net sera pilotée out(notez qu'il s'agit d'une pure logique combinatoire). D'autre part, outsera 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 codec'est ..