相邻语句之间的 VHDL 过程延迟

Delay in VHDL process between adjacent statements

我正在尝试使用 VHDL,遇到了无法消除的延迟。

我正在尝试在测试平台上编写一个非常简单的 3 输入与门,它循环遍历 AND3 的所有可能输入和后续输出。我将一个输入连接到高电平以使其在模拟中的评估更简单。

我已经 运行 模拟在 3 个输入的 8 个值之间循环(忽略第 3 个输入)然而,在迭代数字和它对输入的分配之间,尽管这些语句紧随其后,有 100ns 的延迟——为什么?迭代之间 100ns 的延迟是可以理解的,因为这是故意的,但我不明白为什么下面指示的两条线之间有 100ns 的延迟,当它们 运行 顺序?

我把定义、测试台放在下面,

非常感谢!

--ENTITY AND3 (3 input AND gate) --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity and3 is
    port(
        a, b, c : in  std_logic;
        o       : out std_logic
    );
end entity and3;
architecture RTL of and3 is
begin
    o <= (a and b and c) after 5 ns;
end architecture RTL;

--TESTBENCH FOR AND3 with 3rd input left open (tied high)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity testAnd3 is
end entity testAnd3;                    -- no ports for a test bench

architecture io of testAnd3 is
    component And3 is
        port(x, y, z : in  std_logic:= '1'; --Sets default value if left open; 
             o       : out std_logic
        );
    end component And3;
    signal a, b, c   : std_logic:='0';
   signal iteration : unsigned(2 downto 0):= (others => '0');

begin
    g1 : And3 port map(x => a, y => b, z => open, o => c); --map signals to And ports 
    stim_process : process 
    begin
        iteration <= iteration + 1;     --//100 ns delay between here and next line!?
        a <= iteration(0);
        b <= iteration(1);
        wait for 100 ns;
    end process;

end architecture io;

问题是 <= 赋值于:

iteration <= iteration + 1;

这个<=直到delta延迟后才更新iteration的读取值,所以a <= iteration(0);不会立即看到增加的值,而是会先看到它在下一次迭代中,因此在 wait for 100 ns;.

之后

这可以通过以下任一方法解决:

  • 将分配移动到进程外的 ab(建议的解决方案,因为它符合可综合代码的编码风格)
  • iteration <= iteration + 1; 移动到 wait for 100 ns; 之前,由此 wait 将 "hide" 延迟更新 iteration 值(波形将是相同;见下方评论)
  • iteration 更改为 process 中的局部变量,因为使用 := 的变量分配会立即发生。

请注意,分配有 <= 的信号更新延迟是 VHDL 的一个关键特性,因为它确保所有计时进程将看到相同的值,与评估顺序无关。考虑阅读这个相关的好答案:Is process in VHDL reentrant?.