インテル® Quartus® Prime プロ・エディションのユーザーガイド: デザインの推奨事項

ID 683082
日付 8/03/2023
Public
ドキュメント目次

1.8. HDLコードにおけるクロスモジュール参照 (XMR)

クロスモジュール参照 (XMR) は階層参照とも呼ばれ、デフォルトで有効になります。
これは、Verilog、SystemVerilog、およびVHDLに組み込まれているメカニズムで、モジュール間で任意の階層にあるネットをグローバルに参照するものです。つまり、特定のモジュールのネットを別のモジュール (階層に関係なく) でポートを経由せずに直接参照することができます。したがって、XMRは下方参照または上方参照にすることができます。
注: XMRは混合言語のデザインでも機能します。

XMRを使用すると、異なる階層のネットに対する読み出しまたは書き込みが可能になります。XMRは、デバッグと検証に役立ちます。例えば、次のように使用します。

  • 信号のオーバーライドまたは強制。詳細は、HDLコードでの force ステートメントの使用 を参照してください。
  • 機能のカバレッジのカバーポイントの記述。
  • デザイン全体の任意の位置から任意の信号へのタップ。

モジュール a のインスタンス top 内の次の階層で説明します。

module a  
  net x  
  instance p of module b   
    net x  
    instance m of module d  
      net x  
  instance q of module c  
    net x  
    instance n of module e   
      net x  
  instance r of module b  
     net x  
     instance m of module d  
       net x 

上のシナリオでは、すべてのモジュールは x という名前のネットで構成されています。フルパスベースのXMRを使用することで、次のように各ネット x を階層内の任意の位置でグローバルに参照することができます。

  • top.x
  • top.p.x
  • top.p.m.x
  • top.q.x
  • top.q.n.x
  • top.r.x
  • top.r.m

XMRは、現在のモジュール内の検索から始めます。次に、子インスタンスを階層的に下方向に検索します。XMRが未解決の場合は、階層の1つ上 (親モジュール) を階層的に下方向に検索します。これは、解決するまで階層内を進み続けます。予期しない動作を避けるため、 インテル® では、可能な場合は常に階層パスを使用することを推奨しています。

XMRの使用例

下位モジュールからの上位モジュールの信号のXMR

次の例では、sub モジュールの信号 dtop モジュールの値 a に割り当てられています。

module top (input a, input b, output c, output d); 
  sub inst1 (.a(a), .b(b), .c(c), .d(d));
endmodule

module sub (input a, input b, output c, output d); 
  assign c = a & b;
  assign d = top.a;
endmodule

上位モジュールからの下位モジュールの信号のXMR

次の例では、top モジュールの完全なパスが指定されると、sub モジュールの値 a によって出力値の d を割り当てます。

module top (input a, input b, output c, output d);
  sub inst1 (.a(a), .b(b), .c(c));
  assign d = inst1.a;
endmodule
module sub (input a, input b, output c);
  assign c = a & b;
endmodule

generate ブロックの信号のXMR

generate ブロックを含む次の例では、最上位モジュールの temp に値を書き込み、top モジュールから out2 の値を読み出します。

module top (input [3:0] in1, in2, input clk, output [3:0] out1, out2); 
  generate
    begin:blk1 sub inst (in1, clk, out1, temp); 
  end:blk1
  endgenerate 

//XMR read
assign out2 = top.blk1.inst.temp;
endmodule

always ブロック内からのXMR

次の例は、always_comb コンストラクト内の信号のXMRを表しています。top モジュールの出力値 d は、sub モジュールの値 a から割り当てられます。

module top (input logic a, input logic b, output logic c, output logic d);
  sub inst1 (.a(a), .b(b), .c(c));
  always_comb d = inst1.a; 

endmodule

module sub (input logic a, input logic b, output logic c);
  assign c = b & a;
endmodule

XMRの制限

次に、 インテル® Quartus® Prime開発ソフトウェアにおけるXMRの制限を示します。

  • XMRは同じデザイン・パーティション内にする必要があります。例えば、パーティションAとBがある場合は、パーティションBにパーティションAの内部に対するXMRを含めることはできません。その逆の場合も同様です。
    注: パッケージで指定され、任意のモジュールで使用することができるグローバル信号にも同じパーティション要件が適用されます。
  • 複数でのネット駆動はサポートされていません。したがって、すでに別の信号によって駆動されているネットをXMRを使用して駆動することはできません。
  • XMRの使用は、Verilog、SystemVerilog、およびVHDLのみに限られます。テキスト・デザイン・ファイル (TDF) またはブロック・デザイン・ファイル (BDF) では機能しません。
    注: インテル® では、SystemVerilogインターフェイスでのXMRの使用を推奨していません。エラーが発生しやすくなります。
  • XMRを使用してインテルFPGA IPコアまたはSignal Tapパーティション内の信号を参照することはできません。これらは、合成時に自動的に作成されます。