如果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
发生变化时,该过程才会被激活。这意味着 b
在 c
更改时采用新值,但在 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;
为了在设计中使用 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
发生变化时,该过程才会被激活。这意味着 b
在 c
更改时采用新值,但在 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;