11

下面是我正在运行的代码。我的问题是为什么wait untilmodelsim中的第三个触发器没有?控制台输出很简单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;
4

3 回答 3

18

行为在等待语句的细节中(Jim Lewis 所指的等待细节)。原因是wait语句包含三个部分:

wait
  [on sensitivity_list]
  [until condition]
  [for time_expression];  -- Only for timeout, and not relevant here

相关wait代码中只有until一部分,所以根据VHDL标准创建了灵敏度列表:“如果没有出现灵敏度子句,则根据以下(递归)规则构造灵敏度集:...”。在这种情况下,生成的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没有明确包含 a wait until r_CLK_TB'event(如注释中所写),执行结果也会等到一个事件 onr_CLK_TB才能传递第一个waitin 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。

于 2013-12-10T06:57:40.397 回答
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 ; 
于 2013-12-09T23:13:34.410 回答
2

我坚持同样的问题。
我可能的解决方法是将全局时钟添加到敏感度列表中:

nClk <= NOT nClk AFTER 10 ns;

WAIT ON nClk UNTIL signalToCheck = '1';
于 2020-09-02T07:55:05.573 回答