Suche…
Syntax
- warten [auf SIGNAL1 [, SIGNAL2 [...]]] [bis CONDITION] [für TIMEOUT];
- warten; - Ewiges Warten
- warte auf s1, s2; - Warten Sie, bis sich die Signale s1 oder s2 (oder beide) ändern
- warte bis s1 = 15; - Warten Sie, bis sich das Signal s1 ändert und der neue Wert 15 ist
- warte bis s1 = 15 für 10 ns; - Warten Sie, bis sich das Signal s1 ändert und der neue Wert höchstens 10 ns beträgt
Ewiges Warten
Die einfachste Form der wait
Anweisung ist einfach:
wait;
Wenn ein Prozess dies ausführt, wird er für immer ausgesetzt. Der Simulationsplaner wird ihn nie wieder aufnehmen. Beispiel:
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;
Empfindlichkeitslisten und Warteanweisungen
Ein Prozess mit einer Sensitivitätsliste kann auch keine wait-Anweisungen enthalten. Es entspricht dem gleichen Prozess, ohne Sensitivitätsliste und mit einer weiteren letzten Anweisung:
wait on <sensitivity_list>;
Beispiel:
process(clock, reset)
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
end process;
ist äquivalent zu:
process
begin
if reset = '1' then
q <= '0';
elsif rising_edge(clock) then
q <= d;
end if;
wait on clock, reset;
end process;
VHDL2008 führte das Schlüsselwort all
in Sensitivitätslisten ein. Es entspricht allen Signalen, die irgendwo im Prozess gelesen werden . Es ist besonders praktisch, unvollständige Sensitivitätslisten zu vermeiden, wenn kombinatorische Prozesse für die Synthese entworfen werden. Beispiel für eine unvollständige Sensitivitätsliste:
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;
Das ci
Signal ist nicht Teil der Sensitivitätsliste, und dies ist sehr wahrscheinlich ein Codierungsfehler, der zu Simulationsfehlanpassungen vor und nach der Synthese führt. Der korrekte Code lautet:
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 vereinfacht das all
Schlüsselwort dies und reduziert das Risiko:
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;
Warten Sie auf den Zustand
Es ist möglich, die Klauseln on <sensitivity_list>
und for <timeout>
wegzulassen, wie in:
wait until CONDITION;
was äquivalent ist zu:
wait on LIST until CONDITION;
Dabei ist LIST
die Liste aller Signale , die in CONDITION
. Es ist auch äquivalent zu:
loop
wait on LIST;
exit when CONDITION;
end loop;
Eine wichtige Konsequenz ist, dass wenn die CONDITION
keine Signale enthält, dann:
wait until CONDITION;
ist äquivalent zu:
wait;
Ein klassisches Beispiel dafür ist das berühmte:
wait until now = 1 sec;
Das tut nicht das, was man denken könnte: Da es sich now
um eine Funktion und nicht um ein Signal handelt, wird die Ausführung dieser Anweisung für immer unterbrochen.
Warten Sie eine bestimmte Zeit
Wenn Sie nur die Klausel for <timeout>
, ist es möglich, eine bedingungslose Wartezeit zu erhalten, die für eine bestimmte Dauer andauert. Dies ist nicht synthetisierbar (keine echte Hardware kann dieses Verhalten so einfach ausführen), wird jedoch häufig zum Planen von Ereignissen und zum Erzeugen von Uhren in einer Testbench verwendet.
In diesem Beispiel wird in der Simulationstestbank ein Takt von 100 MHz mit einem Tastverhältnis von 50% erzeugt, um das zu testende Gerät zu betreiben:
constant period : time := 10 ns;
...
process
begin
loop
clk <= '0';
wait for period/2;
clk <= '1';
wait for period/2;
end loop;
end process;
In diesem Beispiel wird veranschaulicht, wie eine Literaldauerwartung verwendet werden kann, um den Testbench-Stimulus- / Analyseprozess zu sequenzieren:
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;