在进程内部分配信号与分配实际输出之间的区别
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 规则下发生了什么。
所以通过我自己的研究我了解到,如果我们在一个进程中分配一个信号,它会在进程结束后更新。现在,如果我们直接为输出分配一个值,它是否也会在处理后得到更新? 我附上两个版本作为一个简单的例子来说明我的意思。
版本 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 规则下发生了什么。