Recherche…
Syntaxe
- wait [on SIGNAL1 [, SIGNAL2 [...]]] [jusqu'à CONDITION] [pour TIMEOUT];
- attendez; - Eternal wait
- attendre s1, s2; - Attendez que les signaux s1 ou s2 (ou les deux) changent
- attendre que s1 = 15; - Attendez que le signal s1 change et sa nouvelle valeur est 15
- attendre que s1 = 15 pendant 10 ns; - Attendez que le signal s1 change et que sa nouvelle valeur soit 15 pendant au plus 10 ns
Éternel attendre
La forme la plus simple de déclaration d' wait
est simplement:
wait;
Chaque fois qu'un processus l'exécute, il est suspendu pour toujours. Le planificateur de simulation ne le reprendra jamais. Exemple:
signal end_of_simulation: boolean := false;
...
process
begin
clock <= '0';
wait for 500 ps;
clock <= '1';
wait for 500 ps;
if end_of_simulation then
wait;
end if;
end process;
Listes de sensibilité et déclarations d'attente
Un processus avec une liste de sensibilité ne peut pas également contenir des instructions d'attente. Cela équivaut au même processus, sans liste de sensibilité et avec une dernière déclaration:
wait on <sensitivity_list>;
Exemple:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
est équivalent à:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 a introduit le mot-clé all
dans les listes de sensibilité. C'est équivalent à tous les signaux qui sont lus quelque part dans le processus . Il est particulièrement utile d'éviter les listes de sensibilité incomplètes lors de la conception de processus combinatoires pour la synthèse. Exemple de liste de sensibilité incomplète:
process(a, b)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
le signal ci
ne fait pas partie de la liste de sensibilité et il s'agit très probablement d'une erreur de codage qui conduira à des erreurs de simulation avant et après la synthèse. Le code correct est:
process(a, b, ci)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
Dans VHDL2008, le mot clé all
simplifie cela et réduit le risque:
process(all)
begin
if ci = '0' then
s <= a xor b;
co <= a and b;
else
s <= a xnor b;
co <= a or b;
end if;
end process;
Attendez que la condition
Il est possible d'omettre les clauses on <sensitivity_list>
et for <timeout>
, comme dans:
wait until CONDITION;
ce qui équivaut à:
wait on LIST until CONDITION;
où LIST
est la liste de tous les signaux qui apparaissent dans CONDITION
. C'est aussi équivalent à:
loop
wait on LIST;
exit when CONDITION;
end loop;
Une conséquence importante est que si la CONDITION
ne contient pas de signaux, puis:
wait until CONDITION;
est équivalent à:
wait;
Un exemple classique de ceci est le célèbre:
wait until now = 1 sec;
cela ne fait pas ce que l'on pourrait penser: comme c'est now
une fonction, pas un signal, l'exécution de cette instruction suspend le processus pour toujours.
Attendez une durée spécifique
En utilisant uniquement la clause for <timeout>
, il est possible d'obtenir une attente inconditionnelle d'une durée spécifique. Ce n'est pas synthétisable (aucun matériel réel ne peut effectuer ce comportement aussi simplement), mais il est fréquemment utilisé pour planifier des événements et générer des horloges dans un banc de test.
Cet exemple génère une horloge cyclique à 100 MHz et 50% dans le banc de test de simulation pour piloter l'unité testée:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Cet exemple montre comment utiliser une durée littérale pour séquencer le processus de test / analyse du banc d'essai:
process
begin
rst <= '1';
wait for 50 ns;
wait until rising_edge(clk); --deassert reset synchronously
rst <= '0';
uut_input <= test_constant;
wait for 100 us; --allow time for the uut to process the input
if uut_output /= expected_output_constant then
assert false report "failed test" severity error;
else
assert false report "passed first stage" severity note;
uut_process_stage_2 <= '1';
end if;
...
wait;
end process;