Ricerca…
Sintassi
- attendere [su SEGNALE1 [, SEGNALE2 [...]]] [fino a CONDIZIONE] [per TIMEOUT];
- aspettare; - Eterno aspetta
- aspetta su s1, s2; - Attendere fino a quando i segnali s1 o s2 (o entrambi) cambiano
- attendere fino a s1 = 15; - Attendere fino a quando il segnale s1 cambia e il suo nuovo valore è 15
- attendere fino a s = 15 per 10 ns; - Attendere fino a quando il segnale s1 cambia e il suo nuovo valore è 15 per un massimo di 10 ns
Eterno aspetta
La forma più semplice di dichiarazione di wait
è semplicemente:
wait;
Ogni volta che un processo viene eseguito, viene sospeso per sempre. Lo scheduler di simulazione non lo riprenderà mai più. Esempio:
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;
Elenchi di sensibilità e dichiarazioni di attesa
Un processo con un elenco di sensibilità non può contenere anche dichiarazioni di attesa. È equivalente allo stesso processo, senza una lista di sensibilità e con un'altra ultima affermazione che è:
wait on <sensitivity_list>;
Esempio:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
è equivalente a:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 ha introdotto la parola chiave all
in elenchi di sensibilità. È equivalente a tutti i segnali che vengono letti da qualche parte nel processo . È particolarmente utile evitare liste di sensibilità incomplete quando si progettano processi combinatori per la sintesi. Esempio di elenco di sensibilità incompleto:
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;
il segnale ci
non fa parte della lista di sensibilità e questo è molto probabilmente un errore di codifica che porterà a simmetrie di simulazione prima e dopo la sintesi. Il codice corretto è:
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;
In VHDL2008 la parola chiave all
semplifica e riduce il rischio:
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;
Aspetta le condizioni
È possibile omettere le clausole on <sensitivity_list>
e for <timeout>
come in:
wait until CONDITION;
che è equivalente a:
wait on LIST until CONDITION;
dove LIST
è l'elenco di tutti i segnali visualizzati in CONDITION
. È anche equivalente a:
loop
wait on LIST;
exit when CONDITION;
end loop;
Una conseguenza importante è che se la CONDITION
non contiene segnali, allora:
wait until CONDITION;
è equivalente a:
wait;
Un classico esempio di questo è il famoso:
wait until now = 1 sec;
ciò non fa ciò che si potrebbe pensare: poiché now
è una funzione, non un segnale, l'esecuzione di questa dichiarazione sospende il processo per sempre.
Attendi una durata specifica
utilizzando solo la clausola for <timeout>
, è possibile ottenere un'attesa incondizionata che dura per una durata specifica. Questo non è sintetizzabile (nessun vero hardware può eseguire questo comportamento in modo così semplice), ma viene spesso usato per pianificare eventi e generare orologi all'interno di un banco di prova.
Questo esempio genera un ciclo di lavoro duty cycle a 100 MHz, 50% nel banco di prova di simulazione per il pilotaggio dell'unità sottoposta a test:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
Questo esempio dimostra come si possa usare un'attesa di durata letterale per sequenziare il processo di stimolo / analisi del testbench:
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;