Sök…


Syntax

  • vänta [på SIGNAL1 [, SIGNAL2 [...]]] [tills CONDITION] [för TIMEOUT];
  • vänta; - Evig vänta
  • vänta på s1, s2; - Vänta tills signalerna s1 eller s2 (eller båda) ändras
  • vänta tills s1 = 15; - Vänta tills signalen s1 ändras och dess nya värde är 15
  • vänta tills s1 = 15 i 10 ns; - Vänta tills signalen s1 ändras och dess nya värde är 15 för högst 10 ns

Evig vänta

Den enklaste formen av wait uttalande är helt enkelt:

wait;

Varje gång en process körs avbryts den för alltid. Simuleringsschemaläggaren kommer aldrig att återuppta den igen. Exempel:

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;

Känslighetslistor och väntande uttalanden

En process med en känslighetslista kan inte också innehålla väntande uttalanden. Det motsvarar samma process, utan en känslighetslista och med ett sista påstående som är:

wait on <sensitivity_list>;

Exempel:

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

är ekvivalent med:

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

VHDL2008 introducerade all sökord i känslighetslistor. Det motsvarar alla signaler som läses någonstans i processen . Det är särskilt praktiskt att undvika ofullständiga känslighetslistor när man utformar kombinatoriska processer för syntes. Exempel på ofullständig känslighetslista:

  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 signalen är inte en del av känslighetslistan och detta är mycket troligt ett kodningsfel som kommer att leda till simuleringsmatchningar före och efter syntes. Rätt kod är:

  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;

I VHDL2008 förenklar all sökord detta och minskar risken:

  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;

Vänta tills tillstånd

Det är möjligt att utelämna klausulerna on <sensitivity_list> och for <timeout> , som i:

    wait until CONDITION;

vilket motsvarar:

    wait on LIST until CONDITION;

där LIST är listan över alla signaler som visas i CONDITION . Det motsvarar också:

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

En viktig konsekvens är att om CONDITION innehåller några signaler, så:

    wait until CONDITION;

är ekvivalent med:

    wait;

Ett klassiskt exempel på detta är det berömda:

    wait until now = 1 sec;

det gör inte vad man skulle kunna tänka: som now är en funktion, inte en signal, att genomföra detta uttalande stoppar processen för evigt.

Vänta på en viss tid

med endast for <timeout> -klausulen är det möjligt att få en ovillkorlig vänta som varar under en viss tid. Detta är inte syntetiserbart (ingen riktig maskinvara kan utföra detta beteende så enkelt), men används ofta för att schemalägga händelser och generera klockor i en testbänk.

Detta exempel genererar en 100 MHz, 50% arbetscykelklocka i simuleringstestbänken för att köra enheten under 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;

Detta exempel visar hur man kan använda en bokstavlig varaktighet vänta med att sekvensera testbänkens stimulans / analysprocess:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow