下面是我正在运行的代码.我的问题是为什么wait until
在modelsim 中没有第三个触发器?控制台输出很简单GOT HERE
.它从来没有上线GOT HERE 2
.我认为wait until
连续两次相同会很好,因为两次都是正确的.我没有在那里添加'事件,所以我不认为模拟器需要看到边缘.谁能解释这种行为?
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;
Morten Zilme.. 12
行为在wait语句的细节中(Jim Lewis引用的等待细节).原因是这些wait
陈述有三个部分:
wait [on sensitivity_list] [until condition] [for time_expression]; -- Only for timeout, and not relevant here
的wait
在相关代码只具有一个until
部分,所以将sensitivity_list根据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
没有明确包含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,因为这里所有三种结构的条件都为TRUE.