Поиск…


Синтаксис

  • wait [on SIGNAL1 [, SIGNAL2 [...]]] [до СОСТОЯНИЯ] [для TIMEOUT];
  • Подождите; - Вечное ожидание
  • подождите на s1, s2; - Подождите, пока не будут изменены сигналы s1 или s2 (или оба)
  • дождитесь, пока s1 = 15; - Подождите, пока сигнал s1 не изменится, и его новое значение равно 15
  • дождитесь, пока s1 = 15 на 10 нс; - Подождите, пока сигнал s1 не изменится, и его новое значение равно 15 в течение не более 10 нс

Вечный дождик

Простейшая форма wait выглядит просто:

wait;

Всякий раз, когда процесс выполняет это, он временно приостанавливается. Планировщик моделирования никогда больше не возобновит его. Пример:

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;

Списки чувствительности и ожидания ожидания

Процесс с списком чувствительности также не может содержать команды ожидания. Это эквивалентно одному и тому же процессу, без списка чувствительности и еще с одним последним утверждением:

wait on <sensitivity_list>;

Пример:

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

эквивалентно:

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

VHDL2008 представила ключевое слово all в списках чувствительности. Это эквивалентно всем сигналам, которые читаются где-то в этом процессе . Особенно удобно избегать неполных списков чувствительности при разработке комбинаторных процессов синтеза. Пример неполного списка чувствительности:

  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;

ci сигнал не является частью списка чувствительности, и это, скорее всего, ошибка кодирования, которая приведет к несоответствиям моделирования до и после синтеза. Правильный код:

  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;

В VHDL2008 all ключевые слова упрощают это и уменьшают риск:

  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;

Подождите, пока условие

Можно опустить в on <sensitivity_list> и предложения for <timeout> , например, в:

    wait until CONDITION;

что эквивалентно:

    wait on LIST until CONDITION;

где LIST - это список всех сигналов, которые появляются в CONDITION . Это также эквивалентно:

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

Важным следствием является то, что если CONDITION содержит сигналов, то:

    wait until CONDITION;

эквивалентно:

    wait;

Классическим примером этого является знаменитый:

    wait until now = 1 sec;

что не делает то, что можно было бы подумать: поскольку now это функция, а не сигнал, выполнение этого утверждения приостанавливает процесс навсегда.

Подождите определенную продолжительность

используя только условие for <timeout> , можно получить безусловное ожидание, которое длится в течение определенной продолжительности. Это не синтезируемо (никакое реальное оборудование не может так просто выполнять такое поведение), но часто используется для планирования событий и генерации часов в тестовом банке.

В этом примере генерируется тактовый импульс рабочего времени 100 МГц, 50% в испытательном стенде моделирования для управления тестируемым устройством:

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

Этот пример демонстрирует, как можно использовать длительность литерала для последовательности процесса стимуляции / анализа 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;


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow