等到VHDL仿真中<signal> = 1永远不会成立

Rus*_*ell 8 fpga vhdl modelsim

下面是我正在运行的代码.我的问题是为什么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;
Run Code Online (Sandbox Code Playgroud)

Mor*_*mer 12

行为在wait语句的细节中(Jim Lewis引用的等待细节).原因是这些wait陈述有三个部分:

wait
  [on sensitivity_list]
  [until condition]
  [for time_expression];  -- Only for timeout, and not relevant here
Run Code Online (Sandbox Code Playgroud)

wait在相关代码只具有一个until部分,所以将sensitivity_list根据VHDL标准创建的:"如果没有出现灵敏度子句,灵敏度组根据下列(递归)规则构造:...".在这种情况下,生成的sensitivity_list将包含r_CLK_TB.

VHDL标准有一个精确匹配代码的例子,这表明:

wait until r_CLK_TB = '1';
Run Code Online (Sandbox Code Playgroud)

与以下内容相同:

loop
  wait on r_CLK_TB;
  exit when r_CLK_TB = '1';
end loop;
Run Code Online (Sandbox Code Playgroud)

因此,即使wait没有明确包含wait until r_CLK_TB'event(写在评论),在等待,直到一个事件的执行结果r_CLK_TB,以通过第一waitwait on r_CLK_TB.这是直观的......自己判断;-)

所以也许原始代码应该改变:

wait until r_CLK_TB = '1';
Run Code Online (Sandbox Code Playgroud)

替换为:

if r_CLK_TB /= '1' then
  wait until r_CLK_TB = '1';
end if;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"GOT HERE"和"GOT HERE 2"都显示为20 ns,因为这里所有三种结构的条件都为TRUE.

  • 在`wait until r_CLK_TB'event and r_CLK_TB='1'`中,一旦评估`r_CLK_TB'event和r_CLK_TB='1'`,`r_CLK_TB'event`将是微不足道的TRUE,因为它是触发评估的事件你暗示,所以表达式可以简化为`r_CLK_TB='1'`。 (2认同)