Merci

Le langage (Verilog ici) en lui-même n'est pas très compliqué : des affectations, des assignations de signaux, des if/else ou switch/case et on a l'essentiel

Alors c'est vrai qu'il faut penser différemment, par exemple dans ce test (la coloration syntaxique Verilog n'est pas active sur le forum, donc copie d'écran) :

Le bloc
always est évalué à chaque front montant de l'horloge (synchronisme).
Le programmeur (non avisé) pourrait croire que si l'entrée
in est à 1, la valeur
out est d'abord mise à 1 (ligne 9), puis ensuite mise à 3 (ligne 10).
Et donc si l'entrée
in est maintenu à 1, la valeur
out "clignote" en étant constamment rabaissée à 1 (ligne 9) avant de remonter à 3 (ligne 10).
Que nenni

, un FPGA
n'est pas un CPU qui exécute séquentiellement l'instruction de la ligne 9, suivie de l'instruction de la ligne 10.
L'ordre des lignes est important, mais seulement pour donner des priorités.
Quand une variable est affectée plusieurs fois, c'est la dernière affectation qui est prioritaire.
Ainsi, si
in est à 1 :
- la ligne 9 voudrait affecter 1 à
out;
- la ligne 10 voudrait affecter 3 à
out;
C'est donc la dernière affectation de la ligne 10 qui est prioritaire sur l'affectation de la ligne 9, et le circuit configuré fera en sorte que
out prenne la valeur 3 si l'entrée
in est à 1.

C'est un peu fatigant au début ces subtilités
(et à la fin aussi d'ailleurs
)Edit 20/09/22 :
Je précise que le code précédent est rédigé pour illustrer un phénomène, mais du point de vue du style de codage, il est mauvais
On écrira plutôt avec un else :
1 2
| if (in) out <= 3;
else out <= 1; |
4 |
0 |