Chaque fois qu’un comportement devra
être décrit, ceci se fera sous la forme de
conditions. Les conditions pourront être
vraies ou fausses et les traitements seront
effectués ou non. Tout état doit être défini par une équation.
Les alternatives ou aiguillages multiples pouvant être
incomplets, la notion de variable à mémoire
est obligatoire. Conséquence : une
variable conservera son état tant que l'on ne le
changera pas. On ne pourra pas avoir de variables du type
wire ou output affectés dans un bloc always qui ne peut pas être exécuté à
chaque fois.
Les déclarations
sur les comportements devront être effectuées
dans des bloc always.
Il est interdit d'imbriquer
des blocs always.
Cette variable mémoire
capable de mémoriser un état est un registre
(register en anglais) et sera déclarée avec
le mot clé reg.
Elle pourra être
déclarée sur un bit, un bus (tableau à
1 dimension) ou encore sous la forme d’une mémoire
(tableau à 2 dimensions).
Une variable en registre
ne peut être l’objet d’une assignation
continue (assign).
Une grandeur de sortie
homonyme d’un registre est automatiquement et implicitement
affectée par le contenu de ce registre.
Toute variable affectée
dans un bloc always doit être déclarée
en registre (reg).
Une variable en registre
ne peut être affectée que dans un seul bloc
always.
Dans un bloc always,
les instructions sont délimitées par les mots-clés
begin et end
Soit sur un exemple :
module memoire1 (a, b, c, Q1, Q2);
input a, b, c;
output Q1, Q2;
reg Q1;
always
begin
Q1 = ...
end
assign Q2 = ...
endmodule
Avec la fonction mémoire
apparaît la notion de temps et la nécessité de synchronisation des
tâches par une ou plusieurs horloges. Le langage a prévu
que le bloc « always » puisse être événementiel.
Les
événements seront précisés à la
suite du mot « always » par une condition
exprimée entre parenthèses :
@ (condition)
La condition peut être
liée à un changement de niveau ou à
un front :
- front montant --> posedge
- front descendant --> negedge
Exemples :
always // bloc toujours traité
......
always @ ( f) // traité seulement
au changement d'état de f
.........
always @ ( f or g) // traité à
chaque changement d'état de f ou g
.....
always @ (posedge clock) // traité
au front montant de clock
........
Remarque : le langage ne
permet pas de gérer 2 fronts différents dans
une condition.
always @ (posedge clock or negedge clk2)
// n'est pas compilable
........