수색…


통사론

  • 대기 [신호 1 [, 신호 2 [...]]] [조건까지] [시간 초과 용];
  • 기다림; - 영원한 대기
  • s1, s2를 기다린다. - 신호 s1 또는 s2 (또는 둘 다)가 변경 될 때까지 기다립니다.
  • s1 = 15가 될 때까지 기다리십시오. - 신호 s1이 변경되고 새 값이 15가 될 때까지 기다립니다.
  • 10 ns 동안 s1 = 15가 될 때까지 기다리십시오. - 신호 s1이 변경되고 새 값이 최대 10 ns 동안 15가 될 때까지 기다립니다.

영원한 대기

가장 간단한 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 문도 포함될 수 없습니다. 그것은 동일한 프로세스와 동일합니다. 민감도 목록이없고 마지막 문장이 하나 더 있습니다.

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;

여기서 LISTCONDITION 나타나는 모든 신호 목록입니다. 또한 다음과 같습니다.

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

중요한 결과는 CONDITION 에 신호가없는 경우 다음과 같습니다.

    wait until CONDITION;

다음과 같습니다.

    wait;

이 고전적인 예는 유명한 것입니다 :

    wait until now = 1 sec;

그것은 사람이 생각할 수있는 것을하지 않습니다. now 은 신호가 아닌 함수이기 때문에이 명령문을 실행하면 프로세스가 영원히 정지됩니다.

특정 기간을 기다리십시오.

for <timeout> 절만 사용하면 특정 기간 동안 지속되는 무조건 대기를 얻을 수 있습니다. 이것은 합성 가능하지 않습니다 (실제 하드웨어가이 동작을 그렇게 간단하게 수행 할 수는 없습니다).하지만 이벤트를 스케줄하고 테스트 벤치에서 클록을 생성하는 데 자주 사용됩니다.

이 예제는 테스트중인 유닛을 구동하기 위해 시뮬레이션 테스트 벤치에서 100 MHz, 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;

이 예제는 테스트 벤치 자극 / 분석 프로세스의 시퀀스를 위해 리터럴 지속 시간 대기를 사용하는 방법을 보여줍니다.

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