Black Box - 2022.1 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2022-05-26
Version
2022.1 日本語

Model Composer の Black Box ブロックは、ハードウェア記述言語 (HDL) モデルを Model Composer に組み込む方法を提供します。

このブロックは、Simulink でのシミュレーション動作と、Model Composer でのコード生成時に使用するインプリメンテーション ファイルの両方を指定するために使用されます。ブラック ボックスのポートは、ほかの HDL ブロックと同じ型の信号を生成および消費します。ブラック ボックスがハードウェアに変換されると、関連する HDL エンティティが自動的に組み込まれ、生成されたデザイン内のほかのブロックに配線されます。

ブラック ボックスは、VHDL または Verilog を Simulink モデルに組み込むために使用できます。ブラック ボックス HDL は、 Vivado® シミュレータへの Model Composer インターフェイスを利用して、Simulink で協調シミュレーションできます。

ブラック ボックスは、HDL を Model Composer モデルに組み込むだけでなく、外部シミュレーション モデルに関連付けられたインプリメンテーションを定義するのにも使用できます。

ブラック ボックスの HDL 要件

ブラック ボックスに関連付けられている HDL コンポーネントはすべて、次の Model Composer の要件および規則に従っている必要があります。

  • エンティティ名には、Model Composer で予約されているエンティティ名 (xlfir、xlregister など) は使用できません。
  • 双方向ポートは HDL ブラック ボックスでサポートされていますが、Model Composer ではポートとして表示されず、ネットリスト後に生成される HDL にのみ表示されます。
  • Verilog ブラック ボックスの場合、モジュールおよびポートの名前には小文字を使用し、標準的な Verilog 命名規則に従う必要があります。
  • VHDL ブラック ボックスの場合、サポートされているポートのデータ型は std_logic および std_logic_vector です。
  • 最上位ポートは、std_logic_vector(0 to 7) ではなく、std_logic_vector(7 downto 0) のように最上位ビットから最下位ビットの降順に並べる必要があります。
  • Verilog RTL では、符号付き 2 進数型を使用した最上位ポートはサポートされていません (例: 18'sb1010)。符号なしの 2 進数型のみがサポートされます。
  • クロックおよびクロック イネーブルのポートは、次の規則に従う必要があります。
  • クロックまたはクロック イネーブルのポートは、std_logic 型である必要があります。Verilog ブラック ボックスでは、これらのポートは入力 clk など非ベクター入力である必要があります。
  • ブラック ボックスのクロックおよびクロック イネーブルのポート名は、ほかのポート名と同じようには処理されません。Model Composer では、ブラック ボックスをハードウェアに変換する際、ブロックのコンフィギュレーションと Simulink でそれを駆動するサンプル レートに応じてレートを指定可能な信号を使用して、クロックとクロック イネーブルポートが駆動されます。
  • 立ち下がりエッジでトリガーされる出力データは使用できません。
重要: Model Composer のブラック ボックス フローでは、.dcp ファイルは IP としてインポートされません。

ブラック ボックスでクロックがどのように動作するのかを理解しておくと、Model Composer でどのようにタイミングとクロッキングが処理されるのかを理解するのに役立ちます。通常、ハードウェアで複数のレートを生成する場合、Model Composer では 1 つのクロックと複数のクロックイネーブル (各レートに 1 つのイネーブル) が使用されます。これらのイネーブルにより、適宜ハードウェアの異なる部分がアクティブになります。各クロック イネーブル レートは、Simulink の対応するサンプル周期と関係しています。クロックを必要とする各 HDL ブロックには、それに対応する HDL にクロック ポートとクロック イネーブル ポートが少なくとも 1 つずつ必要です。複数のレートがあるブロックには、追加のクロックとクロック イネーブルのポートがあります。

ブラック ボックスのクロックは、ほかの HDL ブロックのものと同様に機能します。ブラック ボックス HDL には、Simulink の関連付けられている各サンプル レートごとに、個別のクロックとクロック イネーブルのポートが 1 つずつ必要です。ブラック ボックス HDL のクロック ポートおよびクロック イネーブル ポートは、次のように記述する必要があります。

  • クロックおよびクロック イネーブルは、ペアで指定する必要があります。つまり、どのクロックにも対応するクロック イネーブルがあり、どのクロック イネーブルにも対応するクロックがあります。ブラック ボックスは複数のクロック ポートを持つことができますが、各クロック ポートを駆動するのに 1 つのクロック ソースが使用されます。クロック イネーブルのレートのみが異なります。
  • 各クロック名には clk、クロック イネーブル名には ce という文字列を含める必要があります。
  • クロック イネーブル名は、対応するクロック名と同じ名前にし、「clk」の部分を「ce」に置き換えます。たとえば、クロックの名前が src_clk_1 である場合、そのクロック イネーブル名は src_ce_1 にします。

クロックおよびクロック イネーブルのポート名は、ブラック ボックスのアイコン上には表示されません。最上位 HDL のクロック イネーブル ポートを Model Composer で表示するには、別のイネーブル ポートを最上位 HDL に追加し、この信号を実際のクロック イネーブル信号と AND 接続します。

Black Box Configuration ウィザード

Configuration ウィザードは、Verilog または VHDL コンポーネントをブラック ボックスに関連付けやすくするツールです。ブラック ボックスをモデルに追加するたびに、ウィザードが開きます。

重要: このウィザードを使用するには、ブラック ボックスの HDL コンポーネントを定義する .v ファイルまたは .vhd ファイルをモデルを含むディレクトリにコピーします。

新しいブラック ボックスをモデルに追加すると、Configuration ウィザードが自動的に開きます。次の図に例を示します。

図 1. Black Box Configuration ウィザードの例

このウィザードから、ブラック ボックスに関連付けられている HDL ファイルを選択し、Open ボタンをクリックします。ウィザードで、ブラック ボックスのコンフィギュレーション M 関数 (次に説明) が生成され、この関数とブロックが関連付けられます。生成されたコンフィギュレーション M 関数は、通常変更せずに使用できますが、手動調整が必要な場合もあります。コンフィギュレーション M 関数を変更する必要があるかどうかは、HDL がどれだけ複雑であるかによります。

ブラック ボックス コンフィギュレーション M 関数

ブラック ボックスは、そのインターフェイス (ポート、ジェネリック文など) と、Model Composer へのインプリメンテーションを記述する必要があります。これには、ブロックのコンフィギュレーションと呼ばれる MATLAB M 関数 (または P 関数) を定義します。この関数の名前は、[Block Parameters] ダイアログ ボックスの [Block Configuration] パラメーターの下で指定する必要があります。

コンフィギュレーション M 関数は、次を実行します。

  • ブラック ボックスに関連付ける必要のある HDL コンポーネントの最上位エンティティ名を指定します。
  • 言語 (VHDL または Verilog など) を選択します。
  • ポート (タイプ、方向、ビット幅、2 進小数点位置、名前、サンプル レート) を記述します。ポートはスタティックまたはダイナミックにできます。スタティック ポートは変化せず、ダイナミック ポートはデザインの変更に応じて変化します。たとえば、ダイナミック ポートの幅およびタイプは、それを駆動する信号によって異なります。
  • 必要なポートのタイプおよびデータ レート チェックを定義します。
  • ブラック ボックス HDL に必要なジェネリック文を定義します。
  • ブラック ボックス HDL、およびブロックに関連付けられるほかのファイル (EDIF) を指定します。
  • ブロックのクロックおよびクロック イネーブルを定義します (次のクロック規則を参照)。
  • HDL に組み合わせフィードスルー パスがあるかどうかを宣言します。

Model Composer では、ブラック ボックスのコンフィギュレーション用に、BlockDescriptors (エンティティ特性の定義に使用) および PortDescriptors (ポート特性の定義に使用) の 2 つのオブジェクトで構成されるオブジェクト ベースのインターフェイスが提供されています。このインターフェイスは、ブラック ボックスのコンフィギュレーション M 関数内で、ブロックのインターフェイス、シミュレーション モデル、インプリメンテーションに関する情報を Model Composer 提供するのに使用されます。

ブラック ボックスの HDL に少なくとも 1 つの組み合せパス (入力から出力ポートへの直接フィードスルーなど) がある場合、そのブロックは、コンフィギュレーション M 関数で tagAsCombinational メソッドを使用して組み合せとしてタグ付けする必要があります。ブラック ボックスでは、一部のパスを組み合わせでほかのパスは組み合わせでないなど、混合することが可能です。
重要: 組み合わせパスを含むブロックは、それがわかるようにタグ付けすることが重要です。そうすると、Model Composer でそのようなブロックを Simulink シミュレータに対して識別できるようになります。そうしないと、シミュレーション結果が正しくなりません。

ブラック ボックスのコンフィギュレーション M 関数は、モデルをコンパイルするときに数回呼び出されます。この関数には通常、ブロックの入力ポートに依存するコードが含まれます。たとえば、出力ポートのデータ型およびレートを、入力ポートの属性に基づいて設定する必要がある場合があります。また、入力ポートのデータ型およびレートをチェックする必要がある場合があります。この関数が呼び出されたときに、Simulink でそのようなコードの実行が認識されないことがあります。

情報がまだ不明なときに発生する問題 (特に例外) を回避するには、BlockDescriptor メンバーである inputTypesKnowninputRatesKnown を使用できます。これらはそれぞれ、Simulink が入力ポートのデータ型とレートに関する情報を提供できるかとうかを判断するために使用されます。これを次のコードに示します。


if (this_block.inputTypesKnown) 
% set dynamic output port types 
  % set generics that depend on input port types 
  % check types of input ports 
end 

すべての入力レートが既知の場合、このコードによりダイナミック出力ポートのデータ型が設定され、入力ポートのデータ型に依存するジェネリック文が設定され、入力ポートのデータ型が適切であるかどうかが確認されます。これらの組み合わせブロックに、組み合わせブロック外のコードに必要なコード (変数定義など) を含めないようにしてください。

上記のコードでは、this_block という名前のオブジェクトが使用されています。各ブラック ボックスのコンフィギュレーション M 関数は、入力引数を使用して、自動的に this_block を使用できるようにします。MATLAB では、this_block はブラック ボックスを表すオブジェクトで、コンフィギュレーション M 関数内で、ブラック ボックスのテストおよび設定に使用されます。各 this_block オブジェクトは、SysgenBlockDescriptor MATLAB クラスのインスタンスです。this_block に適用可能なメソッドは、付録 A を参照してください。コンフィギュレーション M 関数を生成するには、単純な VHDL エンティティで Configuration ウィザードを実行するのが良い方法です (次を参照)。

サンプル周期

ブラック ボックスの出力ポート、クロック、クロック イネーブルには、コンフィギュレーション M 関数でサンプル周期を割り当てる必要があります。これらの周期がダイナミックな場合、またはブラック ボックスでレートをチェックする必要がある場合は、関数で入力ポートのサンプル周期を取得する必要があります。ブラック ボックスのサンプル周期は、System Generator トークンの [Simulink System Period] で指定されているシステム レートの整数の倍数として表されます。たとえば、[Simulink System Period] が 1/8 で、ブラック ボックスの入力ポートがそのシステム レート (1/8) で動作している場合、コンフィギュレーション M 関数ではポート レートが 1 だと認識されます。同様に、[Simulink System Period] が pi と指定されていて、出力ポートがそのシステム レートの 4 倍 (4*pi) で動作している場合、コンフィギュレーション M 関数で出力ポートのレートを 4 に設定する必要があります。定数ポートの適切なレートは Inf です。

各出力ポートでの出力レート設定例として、次のコードを考えてみます。


block.outport(1).setRate(theInputRate); 
block.outport(2).setRate(theInputRate*5); 
block.outport(3).setRate(theInputRate*5);

最初の行は、1 番目の出力ポートのレートを入力ポートと同じに設定します。次の 2 行は、出力レートを入力レートの 5 倍に設定します。

ブロック パラメーター

Simulink モデルでブロックのアイコンをダブルクリックすると、[Block Parameters] ダイアログ ボックスが開きます。

[Basic] タブ
[Basic] タブには、次のパラメーターがあります。
[Block Configuration M-Function]
ブラック ボックスに関連付けられているコンフィギュレーション M 関数の名前を指定します。通常、この関数を含むファイルは、モデルを含むディレクトリに保存されますが、MATLAB パス上ならどこにでも保存できます。MATLAB では、関数名 (コンフィギュレーション M 関数の名前を含む) に使用できる字数は、63 文字以下にする必要があります。編集ボックスに、ファイル拡張子 (.m または .p) を含めないでください。
[Simulation Mode]
シミュレーションに使用するモード ([Inactive]、[Vivado Simulator]、[External co-simulator]) を指定します。[Inactive] に設定すると、ブラック ボックスはすべての入力データを無視して出力ポートに 0 を書き込みます。このモードでは通常、ブラック ボックスはコンフィギャラブル サブシステムを使用してカップリングする必要があります。

Model Composer では、2 つのパス (シミュレーション結果生成用とハードウェア生成用) を識別するためにコンフィギャラブル サブシステムを使用します。この方法では、シミュレーション速度は最高になりますが、シミュレーション モデルを構築する必要があります。[Vivado Simulator] または [External co-simulator] に設定すると、ブラック ボックスのシミュレーション結果は、ブラック ボックスに関連付けられている HDL の協調シミュレーションを使用して生成されます。[External co-simulator] に設定した場合は、デザインに Questa HDL 協調シミュレーション ブロックを追加し、[HDL Co-Simulator To Use] フィールドに Questa ブロックの名前を指定する必要があります。次に例を示します。

図 2. Configurable Subsystem の使用例

Model Composer では、HDL 協調シミュレーション用に Mentor Graphics®社の Questa Simulator がサポートされています。Verilog ブラック ボックスの協調シミュレーションには、混合言語のライセンスが必要です。これは、Model Composer が記述するデザインの部分は VHDL だからです。

注記: Questa Suimularor を使用する場合、使用されるデフォルトの基数は 2 進数です。

ブラック ボックスの協調シミュレーション ブロックは通常、ブラック ボックスを含むサブシステムに格納されますが、ブロックを別の場所に格納することも可能です。協調シミュレーション ブロックへのパスは、絶対パスか、またはブラック ボックスを含むサブシステムへの相対パス (../Questa など) で指定できます。シミュレーションを実行すると、各協調シミュレーション ブロックで 1 ライセンスが使用されます。ライセンスが足りなくなるのを避けるため、複数のブラック ボックスで同じ協調シミュレーション ブロックを共有できます。複数のブロックを 1 つの Questa シミュレーションにまとめるため、Model Composer で追加の VHDL が自動的に生成され、使用されます。

HDL 協調シミュレーション用のデータ型変換

協調シミュレーション中、Model Composer のポートは HDL シミュレータのポートを駆動し、HDL シミュレータのポートは Model Composer のポートを駆動します。これらのツールの信号のデータ型は同じではないので、変換する必要があります。変換の規則は、次のとおりです。

  • Model Composer の信号には、ブール型、符号付きまたは符号なしの固定小数点を使用できます。固定小数点の信号を不定値にすることは可能ですが、ブール型の信号を不定値にすることはできません。Model Composer で信号が不定値である場合、HDL 信号のすべてのビットは X になります。不定値でない場合は、信号の値を表す 0 および 1 になります。
  • HDL 信号を Model Composer に戻すには、ブラック ボックスのコンフィギュレーション M 関数の指示に従って、標準論理型がブール型および固定小数点値に変換されます。幅が一致しない場合、エラーがレポートされます。さまざまな不定値 (Weak High、Weak Low など) は、Model Composer の不定値に変換されます。HDL シミュレーションで部分的に不定になっている信号は (最上位ビットのみが不定のビット ベクターなど)、Model Composer では完全な不定値になります。
  • HDL から Model Composer への変換は、カスタムのシミュレーション専用最上位ラッパーを VHDL コンポーネントに追加して調整できます。そのようなラッパーは、信号を Model Composer に戻す前に、すべての Weak Low 信号を 0 に変換したり、すべての不定信号を 0 または 1 に変換したりします。

次に、HDL ブラック ボックスに関連付けることができる HDL エンティティの例を示します。


library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 
entity word_parity_block is 
  generic (width : integer := 8); 
port (din : in std_logic_vector(width-1 downto 0); 
  parity : out std_logic); 
end word_parity_block; 
architecture behavior of word_parity_block is 
begin 
  WORD_PARITY_Process : process (din) 
  variable partial_parity : std_logic := '0'; 
  begin 
  partial_parity := '0'; 
  XOR_BIT_LOOP: for N in din'range loop 
  partial_parity := partial_parity xor din(N); 
  end loop; -- N 
  parity <= partial_parity after 1 ns ; 
  end process WORD_PARITY_Process; 
end behavior; 

次に、コンフィギュレーション M 関数の例を示します。これで、HDL ブラック ボックス内で上記の VHDL が使用できるようになります。


function word_parity_block_config(this_block)
this_block.setTopLevelLanguage('VHDL'); 
  this_block.setEntityName('word_parity_block'); 
  this_block.tagAsCombinational; 
  this_block.addSimulinkInport('din'); 
  this_block.addSimulinkOutport('parity'); 
  parity = this_block.port('parity'); 
  parity.setWidth(1); 
  parity.useHDLVector(false);
  % ----------------------------- 
  if (this_block.inputTypesKnown) 
  this_block.addGeneric('width', 
  this_block.port('din').width); 
  end  % if(inputTypesKnown) 
  % ----------------------------- 
  % ----------------------------- 
  if (this_block.inputRatesKnown) 
  din = this_block.port('din'); 
  parity.setRate(din.rate); 
  end  % if(inputRatesKnown) 
  % ----------------------------- 
  this_block.addFile('word_parity_block.vhd');
  return;