Szukaj…


Składnia

  • poczekaj [na SIGNAL1 [, SIGNAL2 [...]]] [do WARUNKU] [dla TIMEOUT];
  • czekać; - Wieczne czekanie
  • poczekaj na s1, s2; - Poczekaj, aż zmienią się sygnały s1 lub s2 (lub oba)
  • poczekaj, aż s1 = 15; - Poczekaj, aż sygnał s1 zmieni się, a jego nowa wartość to 15
  • poczekaj, aż s1 = 15 przez 10 ns; - Poczekaj, aż sygnał s1 zmieni się, a jego nowa wartość to 15 przez co najwyżej 10 ns

Wieczne czekanie

Najprostszą formą wait jest po prostu:

wait;

Ilekroć proces to wykonuje, zostaje zawieszony na zawsze. Harmonogram symulacji nigdy go nie wznowi. Przykład:

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;

Listy wrażliwości i instrukcje oczekiwania

Proces z listą wrażliwości nie może również zawierać instrukcji oczekiwania. Jest to równoważne z tym samym procesem, bez listy wrażliwości i z jeszcze jednym ostatnim stwierdzeniem, które jest:

wait on <sensitivity_list>;

Przykład:

  process(clock, reset)
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
  end process;

jest równa:

  process
  begin
    if reset = '1' then
      q <= '0';
    elsif rising_edge(clock) then
      q <= d;
    end if;
    wait on clock, reset;
  end process;

VHDL2008 wprowadził all słowa kluczowe na listach wrażliwości. Jest to równoważne ze wszystkimi sygnałami odczytywanymi gdzieś w trakcie procesu . Szczególnie przydatne jest unikanie niepełnych list wrażliwości przy projektowaniu procesów kombinatorycznych do syntezy. Przykład niepełnej listy wrażliwości:

  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;

sygnał ci nie jest częścią listy czułości i jest to bardzo prawdopodobne błąd kodowania, który doprowadzi do niedopasowań symulacji przed i po syntezie. Prawidłowy kod to:

  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;

W VHDL2008 all słowa kluczowe upraszczają to i zmniejszają ryzyko:

  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;

Poczekaj na warunek

Można pominąć klauzule on <sensitivity_list> i for <timeout> , jak w:

    wait until CONDITION;

co jest równoważne z:

    wait on LIST until CONDITION;

gdzie LIST to lista wszystkich sygnałów pojawiających się w CONDITION . Jest to również równoważne z:

    loop
      wait on LIST;
      exit when CONDITION;
    end loop;

Ważną konsekwencją jest to, że jeśli CONDITION nie zawiera sygnałów, wówczas:

    wait until CONDITION;

jest równa:

    wait;

Klasycznym tego przykładem jest słynny:

    wait until now = 1 sec;

to nie robi tego, co można by pomyśleć: ponieważ now jest funkcją, a nie sygnałem, wykonanie tej instrukcji zawiesza proces na zawsze.

Poczekaj na określony czas

przy użyciu tylko klauzuli for <timeout> można uzyskać bezwarunkowe oczekiwanie, które trwa przez określony czas. Nie można tego syntetyzować (żaden prawdziwy sprzęt nie może tak łatwo wykonać tego zachowania), ale często jest wykorzystywany do planowania zdarzeń i generowania zegarów w środowisku testowym.

Ten przykład generuje zegar 100 MHz, 50% cyklu pracy w symulacyjnym stanowisku testowym do napędzania testowanego urządzenia:

constant period : time := 10 ns;
...
process
begin
   loop
      clk <= '0';
      wait for period/2;
      clk <= '1';
      wait for period/2;
   end loop;
end process;

Ten przykład pokazuje, jak można użyć literału czasu oczekiwania na sekwencjonowanie procesu bodźca / analizy testu:

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;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow