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

ID 683834
日付 10/23/2024
Public
ドキュメント目次

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

パーシャル・リコンフィグレーション・プロセス中に新しいペルソナがロードされると、PRパーティションの論理操作が変更されます。シミュレーション中のペルソナの入力と出力にマルチプレクサーを使用して、ペルソナの置き換えをシミュレーションします。

ペルソナの最上位を表すRTLラッパーロジックを作成します。ラッパーにより、デフォルトのペルソナがコンパイル時にインスタンス化されます。シミュレーション中、ラッパーでは、アクティブなペルソナを別のペルソナに置き換えることができます。各ペルソナを Quartus® Prime EDA Netlist Writerrによって生成されるPRシミュレーション・モデルの動作RTLとしてインスタンス化します。

Quartus® Prime開発ソフトウェアには、シミュレーション・テストベンチとインターフェイスするためのシミュレーション・モジュールが含まれています。

  • altera_pr_wrapper_mux_in
  • altera_pr_wrapper_mux_out
  • altera_pr_persona_if (SystemVerilogインターフェイスを使用すると、ラッパー・マルチプレクサをテストベンチ・ドライバーに接続できます。)
図 34. 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