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;


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow