トランシーバー・リコンフィグレーション \'reconfig_busy\' 出力ポートが立ち往生し、リセット後に高く主張される場合があります。 また、影響を受けるリコンフィグレーション・コントローラーに接続されているトランシーバー・チャネルがリセットされて動かなくなる場合があります。 \'reconfig_busy\' 出力ポートは、リコンフィグレーション・コントローラーをリセットしてもスタックしたままです。デバイスを再プログラムするだけで問題を解決できます。
この現象は、トランシーバー・リコンフィグレーション・コントローラーの内部リセット構造が原因である可能性があります。 M20K RAM のアドレスバスを駆動するロジックに非同期リセットを実行すると、非同期ロジックの伝達を引き起こす可能性があります。 これにより、M20K 内の複数のアドレスラインが同時に主張される可能性があり、ビットセル間で充電共有が発生し、M20K のコンテンツが破損する可能性があります。
この破損は、STRATIX® V および Arria® V GZ デバイスのトランシーバー・リコンフィグレーション・コントローラーに影響を与えます。これは、PMA キャリブレーションに使用されるNios® II・プロセッサーと、プロセッサーのプログラムコードが M20K RAM に格納されているためです。 Nios® IIプログラムのメモリー内で破損が生じた場合、プロセッサーがロック状態になる可能性があります。その結果、reconfig_busy出力ポートが高く立ち往生します。 M20K コンテンツはデバイスのプログラミング中にのみ読み込まれるので、このような状況からのリカバリーはデバイスの再プログラムによってのみ可能です。
この問題の修正により、トランシーバー・リコンフィグレーション・コントローラーの内部リセット・コントローラーとリセット構造が変更され、同期リセットが使用されます。また、リセット条件中に M20K clock_enableポートを事前に取り外します。
この修正は、Quartus® II ソフトウェアの今後のバージョンで利用可能になります。 以前のバージョンの Quartus® II ソフトウェアには、mySupport でサービスリクエストを送信することでパッチを提供できます。 ソリューションが直ちに必要な場合は、以下の手順に従って手動で修正を適用できます。
追加または変更する必要があるファイルは 9 つあります。
-
altera_reset_controller_early_ce_mod.v (追加)
-
altera_reset_synchronizer_early_ce_mod.v (追加)
-
トランシーバー・リコンフィグレーション・コントローラーに関連する QIP ファイル (変更)
-
alt_xcvr_reconfig.sv (変更)
-
alt_xcvr_reconfig_soc.sv (変更)
-
alt_xcvr_reconfig_cpu.v (変更)
-
alt_xcvr_reconfig_cpu_ram.sv (変更)
-
sv_xrbasic_lif_csr.sv (変更)
-
sv_xcvr_reconfig_mif_avmm.sv (変更)
これらの 9 つのファイルは、トランシーバー・リコンフィグレーション・コントローラーが生成されたディレクトリーに配置する必要があります。
altera_reset_controller_early_ce_mod.v をダウンロードして、トランシーバー・リコンフィグレーション・ファイルが保存されているディレクトリーに配置します。
ダウンロード altera_reset_synchronizer_early_ce_mod.v トランシーバー・リコンフィグレーション・ファイルが保存されているディレクトリーに配置します。
この 2 つのファイルをデザインに追加するには、トランシーバー・リコンフィグレーション・コントローラー・インスタンスに関連付けられている .qip ファイルを見つけて変更し、次の 2 行をファイルに追加します。
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [file join $::quartus(qip_path) "LIBRARY_PATH/altera_reset_controller_early_ce_mod.v"]
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [file join $::quartus(qip_path) "LIBRARY_PATH/altera_reset_synchronizer_early_ce_mod.v"]
上記の 2 行で、LIBRARY_NAMEを変更してLIBRARY_PATHして、トランシーバー・リコンフィグレーション・コントローラーの .qip ファイルの他のエントリーと一致させます。
alt_xcvr_reconfig.svでは、次の変更を加えています。
-
alt_xcvr_resyncモジュールのインスタンス化を見つけ、「d」ポートと「リセット」ポートの接続を元に戻します。 変更が完了すると、インスタンス化は次のようになります。
alt_xcvr_resync #(
.INIT_VALUE (1)
) inst_reconfig_reset_sync (
.clk (mgmt_clk_clk)
.d (mgmt_rst_reset)
.reset (1\'b0)
.q (r_mgmt_rst_reset)
);
alt_xcvr_reconfig_soc.svでは、次の変更を行ってください。
モジュールの上部近くに次のワイヤー定義を追加します。
ワイヤー cpu_reset_req;
alt_xcvr_reconfig_cpu モジュールのインスタンス化を見つけて、次のポートを追加します。
.ram_ce (cpu_reset_req)
alt_xcvr_reconfig_cpu_ram モジュールのインスタンス化を見つけて、次のポートを追加します。
.ram_ce (cpu_reset_req)
alt_xcvr_reconfig_cpu.vでは、以下の変更を加えています。
-
次のポートをトップレベルに追加します。
出力ワイヤー ram_ce
-
モジュールに次のコードを追加します。
ワイヤー m20k_gate;
ワイヤー altera_ram_clock_enable;
altera_ram_clock_enable = ~ m20k_gateを割り当てます。
ram_ce = altera_ram_clock_enableを割り当てます。
-
altera_reset_controllerのインスタンス化を見つけ、これをaltera_reset_controller_early_ce_modのインスタンス化に変更します。 このインスタンス化にm20k_gateポートを追加して、m20k_gate信号に接続します。 これらの変更を加えた後、インスタンス化は次のようになります。
altera_reset_controller_early_ce_mod #(
.NUM_RESET_INPUTS (1)
.OUTPUT_RESET_SYNC_EDGES (「deassert」)
.SYNC_DEPTH (2)
) rst_controller (
.reset_in0 (~reset_reset_n)、// reset_in0.reset
.clk (clk_clk)、// clk.clk
.reset_out (reconfig_ctrl_reset_reset)、// reset_out.reset
.m20k_gate (m20k_gate)
.reset_in1 (1\'b0)、// (終了)
.reset_in2 (1\'b0)、// (終了)
.reset_in3 (1\'b0)、// (終了)
.reset_in4 (1\'b0)、// (終了)
.reset_in5 (1\'b0)、// (終了)
.reset_in6 (1\'b0)、// (終了)
.reset_in7 (1\'b0)、// (終了)
.reset_in8 (1\'b0)、// (終了)
.reset_in9 (1\'b0)、// (終了)
.reset_in10 (1\'b0)、// (終了)
.reset_in11 (1\'b0)、// (終了)
.reset_in12 (1\'b0)、// (終了)
.reset_in13 (1\'b0)、// (終了)
.reset_in14 (1\'b0)、// (終了)
.reset_in15 (1\'b0) // (終了)
);
alt_xcvr_reconfig_cpu_ram.svファイルでは、次の変更を加えています。
-
次の入力ポートを追加します。
入力ram_ce
-
altsyncram のインスタンス化を確認し、clocken0 ポートを変更して新しいram_ce入力ポートに接続します。
.clocken0 (ram_ce)
-
defparam clock_enable_input/ output_a / b の定義を次のように変更します。
altsyncram_component.clock_enable_input_a = "NORMAL"、
altsyncram_component.clock_enable_input_b = "NORMAL"、
altsyncram_component.clock_enable_output_a = "NORMAL"、
altsyncram_component.clock_enable_output_b = "NORMAL"、
sv_xrbasic_lif_csr.svファイルでは、次の変更を加えています。
-
論理チャネルアドレスを制御するシーケンシャル・ブロックを常に見つけます。 このブロックは常に、その上にある「//論理チャネルレジスター」のコメントで識別できます。 感度リストからリセット条件を削除します。 変更が完了すると、always block の先頭は次のようになります。
論理チャネル・レジスター
常に @(posedge reconfig_clk) が始まる
if (reset == 1) が始まる
...
-
ネイティブのリコンフィグレーション・アドレス・レジスターを制御するシーケンシャル・ブロックを常に見つけます。 このブロックは、常にコメント「//ネイティブ reconfig アドレスレジスター、チャネル・オフセット・アドレス、または物理アドレス」で識別できます。 感度リストからリセット条件を削除します。 変更が完了すると、always block の先頭は次のようになります。
ネイティブのリコンフィグレーション・アドレス・レジスターは、チャネル・オフセット・アドレスまたは物理アドレスとして解釈できます
常に @(posedge reconfig_clk) が始まる
if (reset == 1) が始まる
...
sv_xcvr_reconfig_mif_avmm.svファイルの場合、この変更はトランシーバー・リコンフィグレーション・コントローラー Megawizard GUI でチャネルまたは PLL のリコンフィグレーションが有効になっている場合にのみ必要です。 次の変更を加える:
-
「//Avalon出力と内部ストレージ」のコメントが付くシーケンシャル・ブロックを常に見つけ、感度リストからリセット条件を削除します。 変更が完了すると、always block の先頭は次のようになります。
Avalon出力と内部ストレージ
常に @(posedge clk)
開始
もし (リセット) が始まる場合
...
これらの変更がすべて行われたら、デザインを再コンパイルする必要があります。