インテル® Quartus® Prime プロ・エディション ユーザーガイド: サードパーティー合成

ID 683122
日付 9/24/2018
Public
ドキュメント目次

2.10.3.2. RAMの推測

HDLデザインからRAMブロックが推測された場合、Synplifyソフトウェアは、インテル FPGA IPコアを使用してデバイスのメモリー・アーキテクチャーをターゲットにします。 一部のデバイスでは、Synplifyソフトウェアは.vqmファイル内でIPコアをインスタンス化する代わりに、メモリーブロックのデバイス・プリミティブに直接マップします。

デザインでRAMを正常に推測するために、Synplifyソフトウェアに対する次のガイドラインに従ってください。

  • アドレス行の幅は2ビット以上でなければなりません。
  • メモリーでのリセットはサポートされていません。読み取り/書き込みポートを同期する必要があるか否かについては、デバイスファミリーのマニュアルを参照してください。
  • ブロック割り当てを持つVerilog HDLステートメントの中には、RAMブロックにマップされないものがあります。したがって、Verilog HDLでRAMをモデル化するときはステートメントをブロックしないようにしてください。

一部のデバイスファミリーでは、syn_ramstyle属性で、推測されたRAMに使用する実装が指定されます。 syn_ramstyle属性をモジュールまたはRAMインスタンスにグローバルに適用して、registerまたはblock_ram値を指定することができます。 RAMの推測をオフにするには、属性値をregisterに設定します。

一部のインテル デバイスファミリーのRAMを推測する場合、Synplifyソフトウェアが追加のバイパスロジックを生成します。このロジックは、RTLシミュレーションと合成後シミュレーションとの間のハーフサイクル読み取り/書き込み動作の違いを解消するために生成されます。 RTLシミュレーションは、更新中のメモリーをクロックの正のエッジで示し、合成後シミュレーションは、更新中のメモリーをクロックの負のエッジで示します。バイパスロジックをなくすには、RAMの出力がレジスター化されている必要があります。このレジスターを追加することによって、RAMの出力はフル・クロック・サイクル後に現れますが、この時点までに更新が行われるので、バイパスロジックは不要になります。

TriMatrixメモリーブロックを備えたデバイスの場合、syn_ramstyle値をno_rw_checkに設定することで、グルーロジックの作成を無効にできます。syn_ramstyleno_rw_checkに設定して、デュアルポート・モードでのグルーロジックの作成を無効にします。

推測されたデュアルポートRAMのVHDLコード

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;

ENTITY dualport_ram IS
PORT ( data_out: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
    data_in: IN STD_LOGIC_VECTOR (7 DOWNTO 0)
    wr_addr, rd_addr: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
    we: IN STD_LOGIC);
    clk: IN STD_LOGIC);
END dualport_ram;

ARCHITECTURE ram_infer OF dualport_ram IS
TYPE Mem_Type IS ARRAY (127 DOWNTO 0) OF STD_LOGIC_VECOR (7 DOWNTO 0);
SIGNAL mem; Mem_Type;
SIGNAL addr_reg: STD_LOGIC_VECTOR (6 DOWNTO 0);

BEGIN
    data_out <= mem (CONV_INTEGER(rd_addr));
    PROCESS (clk, we, data_in) BEGIN
        IF (clk='1' AND clk'EVENT) THEN
            IF (we='1') THEN
                mem(CONV_INTEGER(wr_addr)) <= data_in;
            END IF;
        END IF;
    END PROCESS;
END ram_infer;

バイパスロジックを回避する推測されたデュアルポートRAMのVHDLコード

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;

ENTITY dualport_ram IS
PORT ( data_out: OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
    data_in: IN STD_LOGIC_VECTOR (7 DOWNTO 0)
    wr_addr, rd_addr: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
    we: IN STD_LOGIC);
    clk: IN STD_LOGIC);
END dualport_ram;

ARCHITECTURE ram_infer OF dualport_ram IS
TYPE Mem_Type IS ARRAY (127 DOWNTO 0) OF STD_LOGIC_VECOR (7 DOWNTO 0);
SIGNAL mem; Mem_Type;
SIGNAL addr_reg: STD_LOGIC_VECTOR (6 DOWNTO 0);

BEGIN
    data_out <= mem (CONV_INTEGER(rd_addr));
    PROCESS (clk, we, data_in) BEGIN
        IF (clk='1' AND clk'EVENT) THEN
            IF (we='1') THEN
                mem(CONV_INTEGER(wr_addr)) <= data_in;
            END IF;
        END IF;
    END PROCESS;
END ram_infer;