Process 何时必须将信号插入过程的灵敏度列表

Process 何时必须将信号插入过程的灵敏度列表,process,vhdl,Process,Vhdl,我不知道架构中声明的信号何时必须插入到进程的敏感度列表中 是否有一条在任何情况下都可以遵循的一般规律 当我必须在过程灵敏度列表中包含信号时,我很难理解。如果信号在过程的灵敏度列表中,则该过程将“唤醒”,并在该信号的值发生变化时进行评估。如果不在灵敏度列表中,信号可能会改变,但不会重新评估过程以确定新的输出 对于组合逻辑:您可能希望所有输入信号都包含在灵敏度列表中。如果它们不包括在灵敏度列表中,那么即使输入信号发生变化,输出也不会发生变化。这是一个常见的错误(由于粗心)。请注意,在VHDL 200

我不知道架构中声明的信号何时必须插入到进程的敏感度列表中

是否有一条在任何情况下都可以遵循的一般规律


当我必须在过程灵敏度列表中包含信号时,我很难理解。如果信号在过程的灵敏度列表中,则该过程将“唤醒”,并在该信号的值发生变化时进行评估。如果不在灵敏度列表中,信号可能会改变,但不会重新评估过程以确定新的输出

对于组合逻辑:您可能希望所有输入信号都包含在灵敏度列表中。如果它们不包括在灵敏度列表中,那么即使输入信号发生变化,输出也不会发生变化。这是一个常见的错误(由于粗心)。请注意,在VHDL 2008中,您可以使用“all”关键字在进程中自动包含所有必要的信号,并避免创建锁存

对于同步逻辑:您可能只希望在灵敏度列表中显示时钟(可能还有重置)信号。这是因为当系统时钟发生变化时,您只关心信号的值(而不是时钟)。这是因为您通常描述的寄存器(由触发器组成)只允许在时钟边缘更改其输出值


在使用HDL进行合成的情况下,所有这些都可能令人困惑,因为在FPGA中实际上只能实现VHDL中描述的电路子集。例如,您不能拥有对两个独立时钟边缘敏感的基本内存元素,即使您可以通过在灵敏度列表中包含两个时钟来描述这样的电路。

此外,合成工具(在本例中谈论Xilinx XST)也不一定总是尊重进程灵敏度列表。如果未能在进程主体中列出其值被评估的所有进程,XST将发出警告,表示它将假定其值被评估的信号在灵敏度列表中。这可能会导致行为模拟和实际硬件之间的差异。请记住。

…此外,请注意,灵敏度列表在合成后不会影响您的设计行为。它仅在模拟期间使用。因此,通过更改敏感度列表,很容易在RTL和合成代码之间引入行为差异

Josh给出的规则很好,但最重要的是,阅读工具给你的警告,并采取行动。他们通常检查灵敏度列表是否正确,并将标记任何问题。Emacs VHDL模式也有一个更新敏感度列表的命令,它通常非常擅长


嗯,忍者的“一般法则”是

您的流程需要了解的关于变更的任何信息都需要在敏感度列表中


对于具有同步复位的典型可合成寄存器:

process (clk) is
begin
    if rising_edge(clk) then
        if reset = '1' then
             -- do reset things
        else
             -- read some signals, assign some outputs
        end if;
    end if;
end process;
只有时钟需要在列表中,因为只有当时钟发生变化时(由于
if rising_edge(clk)
语句),才会查看其他所有内容


如果需要异步重置:

process (clk) is
begin
    if rising_edge(clk) then
        if reset = '1' then
             -- do reset things
        else
             -- read some signals, assign some outputs
        end if;
    end if;
end process;
然后,
重置
信号也必须在灵敏度列表中,因为您的设计需要在每次改变时检查它的值,而不管时钟在做什么


对于组合逻辑,我完全避免使用进程,因为保持灵敏度列表最新的问题,以及模拟的潜在行为与合成代码不同。VHDL-2008中的
all
关键字缓解了这一问题,但我仍然不想编写长时间复杂的com二进制逻辑,这样一个过程会有所帮助。

不正确!“灵敏度列表在合成后不会影响设计的行为。”根据合成工具的不同,灵敏度列表可能会被忽略,或者可能会推断出锁存。好的,“在许多*合成工具中没有影响”,其中“许多”是我使用过的。