在进程内部分配信号与分配实际输出之间的区别

Difference between assigning signal inside process vs assigning actual ouput

所以通过我自己的研究我了解到,如果我们在一个进程中分配一个信号,它会在进程结束后更新。现在,如果我们直接为输出分配一个值,它是否也会在处理后得到更新? 我附上两个版本作为一个简单的例子来说明我的意思。

版本 1:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity testing is
port(
    clk : in std_logic;
    a   : in std_logic;
    b   : in std_logic;
    c   : out std_logic
);

end testing;

architecture arch of testing is

signal temp: std_logic;

begin

process(clk)

begin

    if(rising_edge(clk)) then

        if(a = '1' and b = '1') then

            temp <= '1'

        end if;

    end if;

end process;

c <= temp;

end arch;

现在另一个版本:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity testing is
port(
    clk : in std_logic;
    a   : in std_logic;
    b   : in std_logic;
    c   : out std_logic
);

end testing;

architecture arch of Intermediate is

begin

process(clk)

begin

    if(rising_edge(clk)) then

        if(a = '1' and b = '1') then

            C <= '1';

        end if;

    end if;

end process;

end arch;

这里有时间差吗?与第一个版本相比,第二个版本中的 C 会更快变高吗?

C 与第一个示例相比,第二个示例中的分配(稍微)早一些。此外,使用的资源较少,因为在您的第二个示例中没有中间寄存器 (temp)。

在您的第一个示例中,temp 将在时钟的下降沿分配,而 C 是并发分配(即。一旦 temp 更改,C 变化)。但是,实际上,由于信号传播,此分配在 temp 更改后发生了一些 "small amount of time"。

在您的第二个示例中,您直接分配给 C,这将发生在时钟下降沿。

我知道您提供的示例有些做作,但您可以通过以下方式实现同​​样的效果:

process(clk)
begin
    if rising_edge(clk) then
        c <= a and b;
    end if;
end process;

模拟循环会恢复执行每个进程的每个进程,直到被等待挂起。当前时间的其他事件会导致增量循环,否则仿真时间会提前到下一个预定事件。模拟循环一直持续到事件结束或停止为止。

并发语句具有等效的详细过程或块和过程。精心设计的层次结构是通过信号事件进行通信的进程集合。

c 可以在第一个示例中晚出现一个增量周期,因为连续的信号分配没有中间延迟。 Delta 循环不消耗 simulation time,而是为顺序语句产生类似的并发。

版本 1 具有来自并发信号分配语句的第二个过程并使用额外的信号,代表模型的执行时间更长并使用更多资源。版本 1 本身并不代表重大负担。在大量此类进程或大量事件中,可以测量模型执行时间和内存利用率的差异。

您通常看到 中间信号的地方 是除了驱动端口外还对信号值进行本地评估的地方。不允许读取 mode out 接口信号的值。 (设计单元是独立分析的,实际有效值的位置在分析时是未知的。实际是在细化时关联的。端口代表端口关联中的形式。)

参见 IEEE Std 1076-2008,11。并发语句 10.5.2 简单信号赋值语句; 10.2 等待语句; 14. 制定和执行;特别是 14.5 声明部分的阐述和 14.5.5 其他并发声明; 14.7 模型的执行,特别是 14.7.5 模型执行; 6.5.2 接口对象声明; 6.5.7.3 端口映射方面; 14.3.5 端口映射方面。

首先,以下内容不太正确,但对于大多数 RTL 过程都是正确的:

A signal inside a process does not update until after the process finishes

实际规则是:

A signal does not update until the next delta cycle.

WRT 一个进程,一个进程不允许增量循环通过,除非该进程在等待时挂起或退出并在敏感列表处挂起。大多数 RTL 进程要么具有敏感性列表,要么在顶部只有一个等待语句,因此,对于 RTL 代码,我们到达您的 "not quite the truth".

WRT 到你分配给 C:

c <= temp;

该作业中仍有增量循环。如果有帮助,该语言通过以下转换定义并发分配的执行:

process (temp) is
begin
  c <= temp;
end process ; 

这将帮助您了解在您的简单 RTL 规则下发生了什么。