下面是我正在运行的代码。我的问题是,为什么第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。

10-07 13:20
查看更多