I have a module that should represent a "distributed RAM", where multiple registers can be written in parallel and read through a single MUX. A minimal example would be:
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;
Now Quartus II (14.1 Web Edition) warns that
Warning (10631): VHDL Process Statement warning at memory.vhd(21): inferring latch(es) for signal or variable "ram", which holds its previous value in one or more paths through the process
If I look at the RTL and technology map view, I see only edge triggered flip-flops. If "latch inference" here means "flip flop inference", then that is exactly what I intended. But how can I be sure that "latch" does not mean "transparent latch", i.e. a level sensitiv storage element? How could I distinguish this in the warning messages?
(This question is related, but asks why this is happening, I'm asking about the terminology and use of the word "latch".)