Buscar..


Sintaxis

  • espere [en SIGNAL1 [, SIGNAL2 [...]]] [hasta CONDITION] [para TIMEOUT];
  • Espere; - eterna espera
  • espera en s1, s2; - Espere hasta que las señales s1 o s2 (o ambas) cambien
  • esperar hasta que s1 = 15; - Espere hasta que la señal s1 cambie y su nuevo valor sea 15
  • esperar hasta que s1 = 15 por 10 ns; - Espere hasta que la señal s1 cambie y su nuevo valor sea 15 para un máximo de 10 ns

Espera eterna

La forma más simple de declaración de wait es simplemente:

wait;

Cada vez que un proceso ejecuta esto se suspende para siempre. El programador de simulación nunca lo reanudará de nuevo. Ejemplo:

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;

Listas de sensibilidad y frases de espera.

Un proceso con una lista de sensibilidad tampoco puede contener sentencias de espera. Es equivalente al mismo proceso, sin una lista de sensibilidad y con una última declaración más que es:

wait on <sensitivity_list>;

Ejemplo:

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

es 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 introdujo all palabras clave en las listas de sensibilidad. Es equivalente a todas las señales que se leen en algún lugar del proceso . Es especialmente útil evitar listas de sensibilidad incompletas cuando se diseñan procesos combinatorios para la síntesis. Ejemplo de lista de sensibilidad incompleta:

  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;

La señal ci no es parte de la lista de sensibilidad y esto es muy probable que sea un error de codificación que llevará a desajustes de simulación antes y después de la síntesis. El código correcto es:

  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;

En VHDL2008, la palabra clave all simplifica esto y reduce el riesgo:

  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;

Esperar hasta que la condicion

Es posible omitir las cláusulas on <sensitivity_list> y for <timeout> , como en:

    wait until CONDITION;

que es equivalente a:

    wait on LIST until CONDITION;

donde LIST es la lista de todas las señales que aparecen en CONDITION . También es equivalente a:

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

Una consecuencia importante es que si la CONDITION no contiene señales, entonces:

    wait until CONDITION;

es equivalente a:

    wait;

Un ejemplo clásico de esto es el famoso:

    wait until now = 1 sec;

eso no hace lo que uno podría pensar: como now es una función, no una señal, la ejecución de esta declaración suspende el proceso para siempre.

Espera una duración específica

utilizando solo la cláusula for <timeout> , es posible obtener una espera incondicional que dure por una duración específica. Esto no es sintetizable (ningún hardware real puede realizar este comportamiento de manera tan simple), pero se usa frecuentemente para programar eventos y generar relojes dentro de un banco de pruebas.

Este ejemplo genera un reloj de ciclo de trabajo de 100 MHz, 50% en el banco de pruebas de simulación para conducir la unidad bajo prueba:

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

Este ejemplo demuestra cómo se podría usar una espera de duración literal para secuenciar el proceso de análisis / estímulo de prueba:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow