构建一个包含您的流程的最小、完整且可验证的示例:
library ieee;
use ieee.std_logic_1164.all;
entity sequent_exec is
end entity;
architecture foo of sequent_exec is
signal a: std_ulogic := '1';
signal b, c: std_ulogic := '0';
signal clk: std_ulogic := '0';
begin
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
if now > 200 ns then
wait;
end if;
end process;
DUT:
process(clk) is
begin
if rising_edge(clk) then
a <= b ;
b <= c ;
c <= a;
end if;
end process;
end architecture;
我们将 a、b 和 c 的值从一个移位到另一个移位寄存器视为循环移位寄存器:
出现这种情况的原因与 VHDL 仿真周期的运行方式有关。
参见 IEEE 标准 1076-2008
10.5 简单信号分配(10.5.1 概述):
信号分配语句修改一个或多个信号的驱动器中包含的预计输出波形(见 14.7.2),安排一个或多个信号的强制,或安排一个或多个信号的释放(见 14.7.3)。
信号分配将新值排队以进行信号更新。 10.5.2.2 执行简单赋值语句描述了如何操作投影输出波形队列:
波形元素的评估产生单个事务。事务的时间分量由当前时间添加到波形元素中的时间表达式的值来确定。对于波形元素的第一种形式,交易的价值成分由波形元素中的价值表达来确定。
没有时间表达式的赋值是当前模拟时间。 (将发生增量周期 - 不提前仿真时间的仿真周期)。中描述的交易顺序
10.5.2.2 告诉我们同一模拟时间的旧交易被删除。
这意味着任何模拟时间都只有一个队列条目,并解释了为什么对特定信号的最后一次分配会导致事务(并为进程敏感的信号生成事件)。
14.7 模型的执行包含有关模拟周期如何运行的信息(14.7.5 模型执行)。
14.7.5.1 概述:
模型的执行由初始化阶段组成,随后重复执行该模型描述中的流程语句。每次这样的重复被称为一个模拟周期。在每个周期中,计算描述中的所有信号的值。如果计算结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为模拟周期的一部分执行。
14.7.5.3 模拟周期描述了模拟周期,这里使用 IEEE Std 1076-1993 是为了简单起见,不与 VHPI 操作混淆:
12.6.4 模拟周期
模型的执行由初始化阶段组成,随后重复执行该模型描述中的流程语句。每次这样的重复被称为一个模拟周期。在每个周期中,计算描述中的所有信号的值。如果计算结果是在给定信号上发生事件,则对该信号敏感的过程语句将恢复并作为模拟周期的一部分执行。
在初始化开始时,当前时间 Tc 假设为 0 ns。
初始化阶段包括以下步骤:
-- 计算每个显式声明的信号的驱动值和有效值,并将信号的当前值设置为有效值。假定该值是仿真开始之前无限长时间内的信号值。
-- S'Stable(T) 或 S'Quiet(T) 形式的每个隐式信号的值设置为 True。 S'Delayed(T) 形式的每个隐式信号的值被设置为其前缀 S 的初始值。
-- 每个隐式 GUARD 信号的值设置为计算相应的 Guard 表达式的结果。
-- 模型中的每个非推迟进程都会执行,直到其挂起为止。
-- 模型中每个推迟的进程都会被执行,直到它挂起为止。
-- 下一个仿真周期(在本例中为第一个仿真周期)的时间 Tn 根据下面仿真周期步骤 f 的规则计算。
一个仿真周期由以下步骤组成:
A。当前时间 Tc 设置为等于 Tn。当 Tn= TIME'HIGH 并且 Tn 处没有活动驱动程序或进程恢复时,仿真完成。
b.模型中的每个活动显式信号都会更新。 (结果可能会在信号上发生事件。)
C。模型中的每个隐式信号都会更新。 (结果可能会在信号上发生事件。)
d.对于每个进程P,如果P当前对信号S敏感并且如果在该模拟周期中S上发生了事件,则P恢复。
e.在当前模拟周期中恢复的每个非推迟进程都会被执行,直到它挂起为止。
F。下一个仿真周期的时间 Tn 通过将其设置为最早的时间来确定
- 时间高,
- 下次驱动程序变得活跃时,或者
- 进程下次恢复的时间。
- 如果 Tn = Tc,则下一个模拟周期(如果有)将是 delta 周期。
G。如果下一个模拟周期是增量周期,则跳过此步骤的剩余部分。否则,每个已恢复但自上次恢复以来尚未执行的推迟进程将被执行,直到其挂起。然后根据步骤f的规则重新计算Tn。如果任何推迟进程的执行导致在当前模拟周期之后立即发生增量周期,则这是一个错误。
信号值在进程执行期间不会改变。它们的更新被排队并在模拟周期执行的不同步骤中应用。
回到-2008年:
- 顺序语句,10.1 概述
本节描述了顺序语句的各种形式。顺序语句用于定义子程序或进程执行的算法;它们按照出现的顺序执行。
我们看到顺序信号分配执行的顺序与信号更新的顺序无关。