AR# 24313

|

LogiCORE Block Memory Generator - 予期しない出力が出て「# ** Warning: Functional warning at simulation time ...」というシミュレーション警告が表示される

説明

キーワード : CORE Generator, ip3_im, mem, memory, asynch, asymmetric, nonsymmetric, non-symmetric, block RAM, RAMB, BRAM, RAMB16, RAMB, simulation, UniSim, SimPrim, unisims, simprims, NetGen, byte-write, メモリ, 非同期, 非対称, ブロック RAM, シミュレーション, バイト ライト

Virtex-4 および Virtex-5 用に、次の設定で、Block Memory Generator (すべてのバージョン) を使用する場合 :
.....Use Byte-write Enable
.....Write-First Operating Mode

シミュレーション中に次の警告メッセージが表示される場合があります。

# ** Warning: Functional warning at simulation time ( 1572 ns) : RAMB16( :top:bm_tb:test1_dut:bmg0:bmg0:bu2_u0_blk_mem_generator_valid_cstr_ramloop_0_ram_r_v4_ram_
true_dp_single_prim_tdp:) port A is in WRITE_FIRST mode requiring all bits of WEA to be all '1's or all '0's to guarantee valid outputs.
#
# Time: 1572 ns Iteration: 3 Instance:
/top/bm_tb/test1_dut/bmg0/bmg0/bu2_u0_blk_mem_generator_valid_cstr_ramloop_0_ram_r_v4_ram_
true_dp_single_prim_tdp

ソリューション

Block Memory Generator は、Virtex-4 または Virtex-5 で Block Memory プリミティブ の一部のみを使用する可能性のあるメモリを作成します。

いくつかの例をあげます (コンフィギュレーションはこの例に限りません)。

例 1:
メモリ ポート A 幅 (すべてのポート): 9
メモリ ポート A 深さ (すべてのポート): 256
メモリ ポート B 幅 (すべてのポート): 18
メモリ ポート B 深さ (すべてのポート): 128

この場合、Block Memory Generator は、バイト ライト イネーブル機能と 2:1 の非対称ポート比率を認めるプリミティブ コンフィギュレーション 2 つからメモリを作成します。 Virtex-4 の場合、この 2 つのコンフィギュレーションは 2048x9 x 1024x18 と 1024x18 x 512x36 です。 1024x18 x 512x36 プリミティブが使用されている場合、コアからのデータ ビットの一部のみがプリミティブに実際に接続されます。 このビヘイビアは、最小エリア アルゴリズム、または固定プリミティブ アルゴリズムが選択されているときに、起きます。

1024x18 x 512x36 プリミティブが使用されている場合、ユーザーが WEA=1 をアサートすると、ポート A で WE[3:0]=0001 の内部ライト イネーブル ベクタになります。このため、このプリミティブで書き込みが一部だけ行われます。 つまり、WRITE_FIRST モードでは、Block Memory の出力が無効になります。

この機能は、Block Memory Generator データシートの 13 ページに記載されています。
===Virtex-5 および Virtex-4 の Write First モード===
WRITE_FIRST モードで書き込みを実行するとき、同時書き込み操作は、コアの出力に新しく書き込まれたデータを示します。 しかし、バイト ライト機能または非対称アスペクト比を使用している場合、メモリの出力は保証できません。 アーキテクチャのハードウェア上の制限については、Virtex-4 または Virtex-5 のユーザー ガイドを参照してください。

UniSim プリミティブはこの状態になるとユーザーに警告を発し、データが書き込み操作中に無効になる可能性があることを知らせます。

例 2:
メモリ幅 (すべてのポート): 45
メモリ深さ (すべてのポート): 256
この例は 例 1 と似ていますが、この問題がほぼどの幅や深さでも発生することを示しています。 この場合、Block Memory Generator では 1 つのブロック RAM が部分的に使用される可能性があります。 例えば、512x36 プリミティブ 1 つと 1024x18 プリミティブ 1 つを使って、またはほかの組み合わせで、このメモリを作成することができます。 この場合、例 1 で示したように、プリミティブの 1 つにまったくデータ ビットが接続されていない可能性があります。 WRITE_FIRST モードがバイト ライト イネーブルで使用されている場合、コンフィギュレーションで部分的に使用されているプリミティブがあれば、警告が発生する可能性があります。

例 3:
メモリ幅 (すべてのポート): 9
メモリ深さ (すべてのポート): 256
この場合、Block Memory Generator は多くのプリミティブ コンフィギュレーションを使用することができます。 バイト ライト イネーブル機能が選択されているので、Virtex-4 のコンフィギュレーションは 2048x9、1024x18、512x36 になります。 (この例では、データは 1 バイト幅のみです。) 1024x18 または 512x36 プリミティブが使用されている場合は、コアからのデータ ビットの一部のみがプリミティブに実際に接続されます。

512x36 プリミティブが使用されている場合、ユーザーが WE=1 をアサートすると、WE[3:0]=1000 の内部ライト イネーブル ベクタになります。
このため、このプリミティブで書き込みが一部だけ行われます。 つまり、WRITE_FIRST モードでは、Block Memory の出力は無効になります。

例 4:
メモリ幅 (すべてのポート): 18
メモリ深さ (すべてのポート): 512
この場合、Block Memory Generator はいくつかのプリミティブ コンフィギュレーションを使用できます。 バイト ライト イネーブル機能が選択されているため、Virtex-4 のコンフィギュレーションは 1024x18 と 512x36 になります。 512x36 プリミティブが使用されている場合、コアからのデータ ビットの一部のみがプリミティブに実際に接続されます。

512x36 プリミティブが使用されている場合、ユーザーが WE[1:0]=10 をアサートすると、WE[3:0]=1010 の内部ライト イネーブル ベクタになります。
このため、このプリミティブで書き込みが一部だけ行われます。 つまり、WRITE_FIRST モードでは、Block Memory の出力は無効になります。

ソリューション :

これはコアの問題ではありません。 WRITE_FIRST モードでバイト ライト イネーブルまたは非対称ポートを使用する場合、書き込み操作中に読み出されたデータが有効であると保証できないので、このデータに頼らないようにしてください。

この警告を防ぐには、コンフィギュレーションを修正し、この状態を作っているパラメータの組み合わせを避けます。 また、幅、深さ、アルゴリズムを変更することでメモリ構造を変更することもできます。 上述の例 1 で、ユーザーが最小エリア アルゴリズムを使用し、深さを 2048 にまで増加すると、2048x9 プリミティブが使用され、この問題を避けることができます。 また、例 1 で、固定プリミティブ アルゴリズムを使用し、2048x9 プリミティブを使用すると、この警告を避けることができます。

AR# 24313
日付 12/15/2012
ステータス アクティブ
種類 一般
People Also Viewed