Я ожидаю, что следующий код просто сгенерирует два элемента И, но ворота процедуры получат защелку на выходе. В моем исходном коде удаление (комментирование) прямого пути избавляет от защелки, но я не смог изолировать это.
Что вызывает эту защелку и как ее избежать?
Обратите внимание, что это чисто комбинаторная схема без if
с, которая обычно связана с выводом защелки.
Я использую Vivado 2018.3 на Linux Mint 19.
Редактировать 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;