我希望以下代码可以简单地生成两个AND门,但是该过程的门在输出处会得到一个锁存器。在我的原始代码中,删除(注释)直接路径会摆脱闩锁,但我无法隔离它。
是什么原因导致此闩锁,如何避免?
请注意,这是一个纯组合电路,没有if
,并且通常与闩锁推断相关。
我正在Linux Mint 19上使用Vivado 2018.3。
编辑1:将直接路径放在process
语句中可以摆脱闩锁。
编辑2:合成后,闩锁不再存在,因此(可能)不会引起问题。问题仍然是为什么首先要生成它。
library IEEE;
use IEEE.std_logic_1164.all;
entity mcve is
port (
a, b : in std_logic;
o : out std_logic_vector(1 downto 0)
);
end entity;
architecture rtl of mcve is
procedure and_proc (signal pa, pb : in std_logic; signal po : out std_logic) is
begin
po <= pa and pb;
end procedure;
begin
o(0) <= a and b;
and_proc(a, b, o(1));
end architecture;