我有一个应该代表“分布式 RAM”的模块,其中多个寄存器可以并行写入并通过单个 MUX 读取。一个最小的例子是:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity memory is
port
(
i_clk : in std_logic;
i_reset_n : in std_logic;
i_write_en : in std_logic;
i_some_condition : in std_logic;
i_other_condition : in std_logic;
i_data : in std_logic_vector(15 downto 0);
i_addr : in std_logic_vector(3 downto 0);
o_data : out std_logic_vector(15 downto 0)
);
end memory;
architecture synthesis of memory is
type RAM_T is array (15 downto 0) of std_logic_vector(15 downto 0);
signal ram : RAM_T;
begin
p: process(i_clk, i_reset_n)
begin
if i_reset_n = '0' then
ram <= (others => (others => '0'));
elsif i_clk'event and i_clk = '1' then
if i_write_en = '1' then
if i_some_condition = '1' then
ram(1) <= i_data;
end if;
if i_other_condition = '1' then
ram(2) <= i_data;
end if;
-- and so on
end if;
end if;
end process p;
o_data <= ram(to_integer(unsigned(i_addr)));
end;
现在 Quartus II (14.1 Web Edition) 警告说
警告 (10631):memory.vhd(21) 处的 VHDL Process Statement 警告:推断信号或变量“ram”的锁存器,它在通过进程的一个或多个路径中保持其先前的值
如果我查看 RTL 和技术图视图,我只会看到边沿触发的触发器。如果这里的“闩锁推断”是指“触发器推断”,那么这正是我的本意。但是我怎么能确定“锁存器”并不意味着“透明锁存器”,即电平敏感存储元件?我如何在警告消息中区分这一点?
(这个问题是相关的,但问为什么会这样,我问的是术语和“闩锁”这个词的使用。)