下面是我正在运行的代码。我的问题是,为什么第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;
最佳答案
该行为在wait语句的详细信息中(
吉姆·刘易斯指的是)。原因是wait
语句具有三个
部分:
wait
[on sensitivity_list]
[until condition]
[for time_expression]; -- Only for timeout, and not relevant here
相关代码中的
wait
仅包含until
部分,因此根据VHDL标准创建了敏感度列表:“如果没有敏感度
子句出现,敏感度集是根据以下内容构造的
(递归)规则:...”。在这种情况下,生成的灵敏度列表
包含
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 untilr_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,因为
这三种构造的条件都将为TRUE。