如果VHDL中的敏感列表是不可综合的,为什么会因为分析和综合而报错?

If sensitivity list in VHDL is not synthesizable, why does it gives an error due the Analysis and Synthesis?

为了在设计中使用 VHDL 提供时序逻辑,我必须使用过程语句,它有 sensitivity_list。从不同的来源我知道,敏感度列表是不可合成的结构,也就是说,如果我要合成这段代码:

    ...
    process(c)
    b <= a and c;
    end process;
    ...

我不会通过 c 信号进行任何锁存,它只是一个普通的与门。但是,当我在没有敏感列表的情况下合成代码时:

    ...
    process
    b <= a and c;
    end process;
    ...

无论我选择什么版本的VHDL,我都会遇到同样的问题:

Error (10442): VHDL Process Statement error at process_test.vhd(79): Process Statement must contain either a sensitivity list or a Wait Statement

我的问题是:为什么合成器关心灵敏度列表?我的理解是过度关注客户,这不可能是错误,而是严重警告,甚至什么都没有,只有在模拟时才会警告。

更新。这是完整的代码和一些图像。我用的是 Quartus Prime Standard 16.1

    library ieee;
    use ieee.std_logic_1164.all;
    entity stck_ovflw is
        port 
        (
            a       : in std_logic;
            c       : in std_logic;
            b       : out std_logic
        );
    end entity;
    architecture rtl of stck_ovflw  is
    begin
        process(c)
        begin
            b <= a AND c;
        end process;
    end rtl;

RTL综合: 造型:

逻辑合成器的工作是生成一个与您的 RTL 完全相同的电路。没有敏感列表的进程或无限循环等无法模拟的等待。因此,鉴于我的第一句话,逻辑合成器怎么可能生成一个与您的 RTL 行为完全相同的电路?

这应该永远不会成为问题,因为您应该始终在综合之前进行模拟。所以,你应该在逻辑合成器看到你的代码之前解决这个问题。

我认为您对 sensitivity_list 有点困惑。 sensitivity_list 是触发 process 激活的信号列表。每次 sensitivity_list 中的一个信号发生变化时,process 就会被激活并对语句求值。

在你的例子中:

process(c) begin
    b <= a and c;
end process;

仅当 c 发生变化时,该过程才会被激活。这意味着 bc 更改时采用新值,但在 a 更改时保留旧值。这不是简单的组合与门的行为,合成需要某种存储元素来存储 b.

的值

为了推断一个简单的与门,您必须在sensitivity_list中包含所有输入信号。这可以手动完成:

process(a, c) begin
    b <= a and c;
end process;

或者在 VHDL 2008 中自动使用关键字 all:

process(all) begin
    b <= a and c;
end process;