2

複数のレジスタを並列に書き込み、単一の MUX を介して読み取ることができる「分散 RAM」を表すモジュールがあります。最小限の例は次のとおりです。

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 プロセス ステートメントの警告: シグナルまたは変数「ram」のラッチを推測しています。これは、プロセスの 1 つ以上のパスで以前の値を保持しています。

RTL およびテクノロジー マップ ビューを見ると、エッジ トリガーフリップフロップしか表示されません。ここでの「ラッチ推論」が「フリップフロップ推論」を意味する場合、それはまさに私が意図したものです。しかし、「ラッチ」が「トランスペアレント ラッチ」、つまりレベル センシティブストレージ エレメントを意味しないことをどのように確認できますか? 警告メッセージでこれをどのように区別できますか?

(この質問は関連していますが、なぜこれが起こっているのかを尋ねます。用語と「ラッチ」という言葉の使用について尋ねています。)

4

1 に答える 1