수색…
통사론
- 대기 [신호 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;
여기서 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 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;