以下是我正在运行的代码。我的问题是为什么第3 wait until
次触发于modelsim?控制台输出只是GOT HERE
。它永远不会到达GOT HERE 2
行。我认为连续两次使用相同的wait until <SIGNAL> = 1
会很好,因为两次都是正确的。我没有在那里添加'事件,所以我不认为模拟器需要看到边缘。任何人都可以解释这种行为吗?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity example_wait_failure is
end example_wait_failure;
architecture behave of example_wait_failure is
signal r_CLK_TB : std_logic := '0';
begin
r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;
p_TEST : process
begin
wait until r_CLK_TB = '1';
report "GOT HERE" severity note;
wait until r_CLK_TB = '1';
wait until r_CLK_TB = '1';
report "GOT HERE 2 " severity note;
end process p_TEST;
end behave;
答案 0 :(得分:11)
行为在wait语句的详细信息中(等待的详细信息)
吉姆刘易斯指的是)。原因是wait
语句有三个
部分:
wait
[on sensitivity_list]
[until condition]
[for time_expression]; -- Only for timeout, and not relevant here
相关代码中的wait
只有until
部分,所以
根据VHDL标准创建sensitivity_list:“如果没有灵敏度
出现条款,灵敏度集合根据以下内容构建
(递归)规则:......“。在这种情况下生成的sensitivity_list
包含r_CLK_TB
。
VHDL标准有一个与代码精确匹配的例子 说:
wait until r_CLK_TB = '1';
与:
相同loop
wait on r_CLK_TB;
exit when r_CLK_TB = '1';
end loop;
所以即使wait
没有显式包含wait until
r_CLK_TB'event
(如注释中所写),执行也会等到
r_CLK_TB
上的活动,以传递wait
中的第一个wait on r_CLK_TB
。
这是直觉的......自己判断; - )
所以也许原始代码应该改变:
wait until r_CLK_TB = '1';
替换为:
if r_CLK_TB /= '1' then
wait until r_CLK_TB = '1';
end if;
在这种情况下,“GOT HERE”和“GOT HERE 2”都显示在20 ns,因为 这里所有三种结构的条件都是正确的。
答案 1 :(得分:3)
作业?考试?
您需要了解等待的详细信息。等待总是暂停至少一个增量循环。等待直到仅在状态中的信号改变且表达式为真时才恢复。那么在这里需要多少转换为'1'才能进入第二次报告声明?
你有多少次转换为'1':
signal r_CLK_TB : std_logic := '0';
...
r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;
您需要了解等待的详细信息。等待总是暂停至少一个增量循环。等到状态中的信号发生变化且表达式为真时才恢复。那么你需要多少次转换为'1'?
如果将r_CLK_TB更改为以下内容会怎样?
r_CLK_TB <= not r_CLK_TB after 20 ns ;
答案 2 :(得分:0)
我坚持同样的问题。
我可能的解决方法是将全局时钟添加到灵敏度列表中:
nClk <= NOT nClk AFTER 10 ns;
WAIT ON nClk UNTIL signalToCheck = '1';