インテルのみ表示可能 — GUID: mwh1409960002169
Ixiasoft
インテルのみ表示可能 — GUID: mwh1409960002169
Ixiasoft
2.10.3.2. RAMの推測
デザインで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_ramstyleをno_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;