AR# 16233

|

6.2i/6.1i/5.2i/5.1i UniSim、SimPrim、シミュレーション - CLKA で CLKB に対してブロック RAM セットアップ違反が発生する (アドレスの競合)

説明

キーワード : RTL, RAMB4, RAMB16, violated, respect, Verilog, VHDL, BRAM, 違反

RTL シミュレーションを実行すると、デュアル ポート ブロック RAM で次のようなエラーが発生します。

ISE 6.2 以降でのメッセージ

VHDL および Verilog
''Memory Collision Error on RAMB16_S36_S36:<instance_name> at simulation time <time> ns
A write was requested to the same address simultaneously at both Port A and Port B of the RAM. The contents written to the RAM at address location <address> (hex) of Port A and address location <address> (hex) of Port B are unknown.''

ISE 6.2i 以前でのメッセージ

Verilog
''# Timing Violation Error: Setup time ## violated on RAMB instance <instance_name>.display_zero on CLKA port at simulation time ### ns with respect to CLKB port at simulation time ###. Expected setup time is 100.''

VHDL
"# ** Warning: */RAMB SETUP High VIOLATION ON CLKA WITH RESPECT TO CLKB;
# Expected := 0.1 ns; Observed := # ns; At : ### ns
# Time: ### ps Iteration: 1 Instance: <instance_name>"
これらの違反は、1 つのポートであるアドレスにデータを書き込み、もう 1 つのポートで同じアドレスから読み出す場合に発生します。 ハードウェアでは、読み出される値は古い値、新しい値、またはその組み合わせです。 シミュレーションの場合、読み出される値が不明なため、出力が X になります。 詳細は、『Virtex-II Platform FPGA ユーザー ガイド』を参照してください。
http://www.xilinx.co.jp/xlnx/xweb/xil_publications_display.jsp?sGlobalNavPick=&sSecondaryNavPick=&category=-1209831&iLanguageID=2

「デザインに関する注意事項」 -> 「ブロック SelectRAM メモリの使用」 -> 「同期デュアル ポートおよびシングル ポート RAM」 -> 「競合の解消」 を参照してください。

ソリューション

1

競合は、できる限り回避する必要があります。 1 つのポートにアドレスが書き込まれている場合、もう 1 つのポートの同じアドレスから読み出すことはできません。 ただし、アプリケーションによってはこのような状況を回避できません。 2 番目のポートに読み込まれた値をデザインで使用していなければ、この警告メッセージを無視しても問題ありません。

メモ : ISE 7.1i 以降については、(Xilinx Answer 21239) を参照してください。

2

VHDL での回避策
メモ : シミュレーションでの競合の警告は有効です。 この警告を無視しても問題ないと確実にわかっている場合以外は、競合チェックをディスエーブルにしないでください。 違反が発生した場合でも、2 番目のポートで読み出される値をデザインで使用しなければ、警告は無視しても問題ありません。 たとえば、FIFO アプリケーションでタイミングの理由から読み出しポートを常にイネーブルにしている場合、FIFO が空になりデータが書き込まれるたびに違反が発生します。 この違反は有効ですが、読み出される値はデザインで使用されないので、違反は無視できます。 同じ状況の場合は、次の回避策を行います。

1. 次の例に示すようにコンフィギュレーション文をテストベンチに追加して、ブロック RAM モデルのセットアップ を 0 に変更します。

例 :
configuration my_config of testbench is
for behavioral
for uut : top
for behavioral
for ram1, ram2, ram3 : RAMB4_S1_S1 use entity unisim.RAMB4_S1_S1
generic map (SETUP_ALL => 0 ns);
end for;
end for;
end for;
end for;
end my_config;

このコンフィギュレーション文で、ram1、ram2、ram3 インスタンスのセットアップ タイムが 0 に設定されます。 ほかのすべての BRAM ではセットアップ タイムが維持され、競合に対して警告メッセージが表示されます。 これらの 3 つの RAM では警告メッセージは表示されなくなります。

2. 上記のコンフィギュレーション文で、デザイン階層およびデザインのエンティティ名、アーキテクチャ名、インスタンス名を実際のデザインに合わせて変更してください。 一般的なフォーマットは次のとおりです。

configuration <any_config_name> of <entity name in testbench> is
for <architecture name in testbench>
for <instance name given to top level in the testbench> : <entity name of top level>
for <architecture name of top level>
for <instance name for next level of hierarchy> : <entity name in next level of hierarchy>
for <architecture name in next level of hierarchy>
:
:
for <BRAM instance name>, <BRAM instance name>, ... : <BRAM model name> use entity unisim.<BRAM model name>
generic map (SETUP_ALL => 0 ns);
end for;
:
:
end for;
end for;
end for;
end <config name>;

3. デザインをロードすると、アーキテクチャではなく、テストベンチ内のコンフィギュレーション文がロードされるはずです。

3

Verilog での回避策
競合を無視しても問題ないと確実にわかっている場合、選択したブロック RAM に対して警告メッセージが表示されないようにすることで、この問題を回避できます。

ISE 6.1i 以降の場合

次の中から 1 つ実行します。
- 各 RAM モデルをコンパイルし、DISABLE_COLLISION_CHECK を定義します。
- COMPXLIB が、コンパイルする RAM モデル競合チェックを無効にするようにコンフィギュレーション オプションを設定します。 ご使用のシミュレータに応じた方法を選択します。

MTI :
- コマンドライン : vlog +define+NO_COLLISION_CHECK
- compxlib の compxlib.cfg: OPTION:mti_se:verilog : -source -93 +define+NO_COLLISION_CHECK

VCS :
- コマンドライン : vcs +define+NO_COLLISION_CHECK
- compxlib の compxlib.cfg: OPTION:vcs:verilog : -Mupdate +define+NO_COLLISION_CHECK

NC-Sim
- コマンドライン : ncvlog -DEFINE NO_COLLISION_CHECK
- コマンドライン : ncverilog +define+NO_COLLISION_CHECK
- compxlib の compxlib.cfg: OPTION:ncsim:verilog : -MESSAGES -NOLOG -DEFINE DISABLE_COLLISION_CHECK

compxlib.cfg ファイルについての詳細は、次のサイトの 『合成/検証デザイン ガイド』 を参照してください。
http://www.xilinx.co.jp/support/sw_manuals/xilinx6/index.htm

ISE 6.1i 以前の場合

次のように、テストベンチに代入文を追加します。



initial begin

assign uut.ram_inst.data_collision = 0;
assign uut.ram_inst.memory_collision = 0;
assign uut.ram_inst.data_collision_a_b = 0;
assign uut.ram_inst.memory_collision_a_b = 0;
assign uut.ram_inst.data_collision_b_a = 0;
assign uut.ram_inst.memory_collision_b_a = 0;
assign uut.ram_inst.address_collision_a_b = 0;
assign uut.ram_inst.address_collision_b_a = 0;
assign uut.ram_inst.address_collision = 0;

end

これにより、ram_inst Block RAM インスタンスのクロック間でのセットアップ違反がディスエーブルになります。 ほかのすべてのブロック RAM では、クロック間でセットアップがチェックされます。 上記の例で、デザイン階層に合わせて uut.ram_inst を変更してください。 テストベンチのレベルから開始して、「inst.inst.inst.inst.<reg>」 のようにすべての階層のインスタンス名を記述します。

ram_inst は、最上位ファイルの RAMB のインスタンシエーション名と同じである必要があります。

この変更を行ってもエラー メッセージは表示されますが、ブロック RAM の出力は X になりません。
AR# 16233
日付 11/18/2008
ステータス アーカイブ
種類 一般
People Also Viewed