UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

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
ステータス アーカイブ
種類 一般
このページをブックマークに追加