为什么在仿真开始的时候执行这个过程
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 至少执行一次。假定具有敏感列表的 process
将 wait on <list>
作为进程中的最后一条语句。
您可以在 VHDL LRM 第 11.3 节过程语句:
中阅读此内容
如果保留字process后面出现process sensitivity list,则process语句为
假定包含一个隐式等待语句作为过程语句部分的最后一个语句;此隐式等待语句的形式为
wait on sensitivity_list;
并进一步在 LRM 部分 14.7.5.2 初始化:
f) 对于模型中的每个非延迟进程 P,以下操作按指示的顺序发生:1) 进程执行直到挂起。
因此所有进程都将 运行 直到它们在模拟的第一个增量循环中首次挂起。因为进程实际上是无限循环,所以它们必须从某个地方开始。
这是一个简单的实体,只是为了了解“进程”的用法
我的问题是: 为什么在仿真刚开始的时候就执行了进程?我认为当敏感列表中的信号发生变化时进程会被唤醒,但在这个例子中,对信号 '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 至少执行一次。假定具有敏感列表的 process
将 wait on <list>
作为进程中的最后一条语句。
您可以在 VHDL LRM 第 11.3 节过程语句:
如果保留字process后面出现process sensitivity list,则process语句为 假定包含一个隐式等待语句作为过程语句部分的最后一个语句;此隐式等待语句的形式为
wait on sensitivity_list;
并进一步在 LRM 部分 14.7.5.2 初始化:
f) 对于模型中的每个非延迟进程 P,以下操作按指示的顺序发生:1) 进程执行直到挂起。
因此所有进程都将 运行 直到它们在模拟的第一个增量循环中首次挂起。因为进程实际上是无限循环,所以它们必须从某个地方开始。