等到<signal> = 1,在VHDL模拟</signal>中永远不会出现

时间:2013-12-09 22:02:46

标签: vhdl fpga modelsim

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

3 个答案:

答案 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';