インテル® Quartus® Primeプロ・エディション ユーザーガイド: パーシャル・リコンフィグレーション

ID 683834
日付 5/11/2020
Public
ドキュメント目次

1.9.1.1. PRペルソナ置き換えのシミュレーション

PRパーティションのロジック動作が変更されるのは、パーシャル・リコンフィグレーションのプロセス中に新しいペルソナがロードされた場合です。ペルソナ置き換えのシミュレーションには、シミュレーション中のペルソナの出入力のマルチプレクサを使用します。ペルソナの最上位を表すRTLラッパーロジックを作成します。ラッパーにより、デフォルトのペルソナがコンパイル時にインスタンス化されます。シミュレーション中、ラッパーでは、アクティブなペルソナを別のペルソナに置き換えることができます。各ペルソナをIntel Quartus Prime EDA Netlist Writerによって生成されるPRシミュレーション・モデルの動作RTLとしてインスタンス化します。 インテル® Quartus® Prime開発ソフトウェアに含まれているシミュレーション・モジュールは、シミュレーション・テストベンチにインターフェイス接続します。
  • altera_pr_wrapper_mux_in
  • altera_pr_wrapper_mux_out
  • altera_pr_persona_if (SystemVerilogインターフェイスを使用すると、ラッパー・マルチプレクサをテストベンチ・ドライバーに接続できます。)
図 32. PRペルソナ切り替えのシミュレーション

PRペルソナ切り替えシミュレーション用RTLラッパー

altera_pr_wrapper_mux_out モジュールの pr_activate 入力によって、出力XへのMUXがイネーブルされます。この機能により、PRペルソナからの未知の出力のシミュレーションが可能になります。また、デザインのフリーズロジックの通常動作の検証が行われます。次のコードは、上図のPRペルソナ切り替えシミュレーションに対応しています。

module pr_core_wrapper ( input wire a, input wire b, output wire o ); localparam ENABLE_PERSONA_1 = 1; localparam ENABLE_PERSONA_2 = 1; localparam ENABLE_PERSONA_3 = 1; localparam NUM_PERSONA = 3; logic pr_activate; int persona_select; altera_pr_persona_if persona_bfm(); assign pr_activate = persona_bfm.pr_activate; assign persona_select = persona_bfm.persona_select; wire a_mux [NUM_PERSONA-1:0]; wire b_mux [NUM_PERSONA-1:0]; wire o_mux [NUM_PERSONA-1:0]; generate if (ENABLE_PERSONA_1) begin localparam persona_id = 0; `ifdef ALTERA_ENABLE_PR_MODEL assign u_persona_0.altera_sim_pr_activate = pr_activate; `endif pr_and u_persona_0 ( .a(a_mux[persona_id]), .b(b_mux[persona_id]), .o(o_mux[persona_id]) ); end endgenerate generate if (ENABLE_PERSONA_2) begin localparam persona_id = 1; `ifdef ALTERA_ENABLE_PR_MODEL assign u_persona_1.altera_sim_pr_activate = pr_activate; `endif pr_or u_persona_1 ( .a(a_mux[persona_id]), .b(b_mux[persona_id]), .o(o_mux[persona_id]) ); end endgenerate generate if (ENABLE_PERSONA_3) begin localparam persona_id = 2; `ifdef ALTERA ENABLE PR MODEL assign u_persona_2.altera_sim_pr_activate = pr_activate; `endif pr_empty u_persona_2 ( .a(a_mux[persona_id]), .b(b_mux[persona_id]), .o(o_mux[persona_id]) ); end endgenerate altera_pr_wrapper_mux_in #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \ u_a_mux(.sel(persona_select), .mux_in(a), .mux_out(a_mux)); altera_pr_wrapper_mux_in #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \ u_b_mux(.sel(persona_select), .mux_in(b), .mux_out(b_mux)); altera_pr_wrapper_mux_out #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \ u_o_mux(.sel(persona_select), .mux_in(o_mux), .mux_out(o), .pr_activate \ (pr_activate)); endmodule