为什么在仿真开始的时候执行这个过程

Why this process is executed when the simulation starts

这是一个简单的实体,只是为了了解“进程”的用法

我的问题是: 为什么在仿真刚开始的时候就执行了进程?我认为当敏感列表中的信号发生变化时进程会被唤醒,但在这个例子中,对信号 'a' 的分配是在模拟开始后 3ns.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;  
use ieee.numeric_std.all;         
use ieee.math_real.all;           

entity test4 is
    port (
        a : in bit;
        f : out bit
    );

end test4;

architecture test4_arc of test4 is
    signal b : bit;
begin

    process(a)
    begin
        report "process triggered";
        
        b <= a;
        f <= not a;
    end process;

end test4_arc;

这是测试平台

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
use ieee.std_logic_textio.all;
-----------------------------------------------------------
entity test4tb is
end entity ;
-----------------------------------------------------------
architecture testbench of test4tb  is

   component test4
    port (
        a : in bit;
        f : out bit
    );
   end component;

signal atest,ftest : bit;

begin
    -----------------------------------------------------------
    process
    begin
        wait for 3ns;
        atest <= '0';
        wait for 5ns;
        atest <= '1';
        wait for 5ns;
    end process ;

    dut : test4 port map (
        a => atest,
        f => ftest
    );

end architecture testbench;

来自 Modelsim 控​​制台的消息

# ** Note: process triggered
#    Time: 0 ns  Iteration: 0  Instance: /test4tb/dut
# ** Note: process triggered
#    Time: 8 ns  Iteration: 1  Instance: /test4tb/dut
# ** Note: process triggered
#    Time: 16 ns  Iteration: 1  Instance: /test4tb/dut
# ** Note: process triggered

所有进程都将在时间 0 至少执行一次。假定具有敏感列表的 processwait on <list> 作为进程中的最后一条语句。 您可以在 VHDL LRM 第 11.3 节过程语句:

中阅读此内容

如果保留字process后面出现process sensitivity list,则process语句为 假定包含一个隐式等待语句作为过程语句部分的最后一个语句;此隐式等待语句的形式为

wait on sensitivity_list;

并进一步在 LRM 部分 14.7.5.2 初始化:

f) 对于模型中的每个非延迟进程 P,以下操作按指示的顺序发生:1) 进程执行直到挂起。

因此所有进程都将 运行 直到它们在模拟的第一个增量循环中首次挂起。因为进程实际上是无限循环,所以它们必须从某个地方开始。