Matlab®インターフェースを使用したVerilogテストベンチの強化

はじめに

MATLABインターフェースは、Active-HDL 7.1のフルバージョンで導入されました。それ以前のバージョンを使用している場合は、Simulinkインターフェースのみ利用可能です。これらの2つのインターフェースの主な違いは、MATLABインターフェースではActive-HDLがコ・シミュレーションプロセスを制御し、必要に応じてMATLABを起動するのに対し、SimulinkインターフェースではMathWorksが起動する点です。Simulinkはコ・シミュレーションプロセスを制御し、必要に応じてActive-HDLを起動します。

Verilogコードレベルで利用可能なMATLABインターフェースには以下の機能が備わっています:

MATLABインターフェースによって達成可能な典型的なタスクは以下の通りです:

このインターフェースを最大限に活用するには、お使いのコンピュータにMATLABバージョン7(R14)以降をインストールし、COMサーバーとして登録する必要があります(コマンドプロンプトにMATLAB/regserverと入力して登録を実行してください)。

インターフェースへのアクセスの取得

MATLABインターフェースを使用するには、Verilogコードから特別な関数やタスクを呼び出す必要があります(最初のコマンドまたはデータ転送要求が実行されると、MATLABウィンドウが表示されます)。これらの外部ルーチンをコード内で利用可能にするには、環境設定を行う必要があります。最初のコマンドまたはデータ転送要求が実行されると、MATLABのウィンドウが表示されます。

MATLABインターフェースにアクセスする必要があるすべてのモジュールは、Active-HDLのインストール先のBINサブフォルダにあるPLIライブラリlink2ml.dllをリンクしてコンパイルする必要があります。GUIを使用してコンパイルやシミュレーションを実行する場合は、Design|Settings|Verilog PLI Applicationに移動し、aldec_MATLAB_cosim.dllファイルを指定してください。.doスクリプトからコンパイルおよびシミュレーションの初期化を行う場合は、コンパイル (alog) およびシミュレーション (asim) コマンドに以下のスイッチを追加することを忘れないでください:

	-pli "$ALDEC/BIN/aldec_matlab_cosim.dll"

MATLABからのデータインポート

テストベンチで頻繁に役立つ最も簡単なタスクは、MATLABで波形を生成し、その波形データをテストベンチにインポートすることです。以下の例では、適切なライブラリがすでにテストベンチコードに関連付けられ、テストベンチコードから利用可能になっていることを前提としています。

ここでは、以下のパラメータを持つ変調正弦波スティミュラスを生成します:

このスティミュラスを説明する数式は次のとおりです:

	AMPL*sin(2*pi*CFRQ*t) * (1-DPTH*cos(2*pi*SFRQ*t))

サンプリング周期を1nsと仮定して、MATLABで少なくとも1000個のサンプルを作成し、それらを配列に格納した後、その配列をActive-HDLに転送して、テスト回路(例:デジタルフィルター)の16ビット入力DIに供給する波形を生成したいと考えています。

MATLABでサンプルを生成するには、Active-HDLプロジェクトのSRCフォルダ内にdo_wave.mファイルを作成し、そのファイル内に次の2行を記述する必要があります:

	t = 0:.001:1.024 ;
	sw = fix(AMPL*sin(2*pi*CFRQ*t).*(1-DPTH*cos(2*pi*SFRQ*t))) ;

注記:

MATLAB関数の詳細については、MATLABのドキュメントを参照してください。

行と列の構造を区別するため、MATLABの1次元配列は内部的に2次元配列として格納されます(行ベクトルは1×n、列ベクトルはn×1)。この区別は、tおよびsw配列の内部構造にも反映されています。つまり、これらは2次元配列であり第1次元のサイズは1、第2次元のサイズは1025となります。この構造は、Active-HDL環境へのインポート後も維持されます。

Verilogテストベンチには、以下の変数宣言を追加する必要があります:

	integer inp_arr_id;
	reg signed [15:0] stim_arr [1:1025];

注記:

スティミュラス生成パラメータの値をMATLABに渡すには、aldec_MATLAB_cosim.dll PLIライブラリから$put_variableタスクを有効にする必要があります:

	$put_variable("AMPL", amplitude);
	$put_variable("CFRQ", carrier_frq);
	$put_variable("SFRQ", signal_frq);
	$put_variable("DPTH", mod_depth);

タスクの最初の引数は、MATLAB変数名を表す文字列です。2つ目の引数は、その変数に割り当てられるべき値です(ここでは、2番目の引数としてVHDL定数を使用しています)。

ヒント:シミュレーション中にMATLAB関連のプロシージャを初めて使用すると、MATLABのアプリケーションを起動します。Microsoft Windowsの一部のkン協では、MATLABの初回起動にかなりの時間がかかります。シミュレーション中にこの一見無反応に見える期間を避けるため、Active-HDLによるシミュレーションを実行する前に、MATLABを起動してすぐに終了することを検討してください。それ以降のMATLA の起動は速くなるはずです。

前述のmファイルを実行し、MATLABで作成したsw配列をインポートするには、タスクを有効にし、aldec_MATLAB_cosim.dll PLIライブラリから関数を呼び出す必要があります:

	$eval_string( "do_wave" );
	inp_arr_id = $ml2hdl( "sw" );

注記:

以前にも述べたように、sw配列はインポート後も元の1×1025というサイズを維持します。そのため、インポートされた配列の要素を通常のVerilog配列変数であるstim_arrに転送するには、$get_itemタスクの以下の構文を使用する必要があります:

	for ( i=1; i<1026; i=i+1) begin : m2v
		$get_item( stim_arr[i], 0, inp_arr_id, 1, i );
	end

注記:

作業を完了するには、stim_arrメモリに格納されているサンプルをテスト対象回路の入力へ転送する必要があります:

	for ( i=1; i<1026; i=i+1) begin : v2p
	   DI = stim_arr[i];
	   #1;
	end
	$destroy_array( inp_arr_id );

注記:

MATLABへのデータエクスポート

HDLシミュレーターの波形ビューアは強力ですが、時間領域グラフ(波形)に制限されています。その他のグラフを表示したい場合(例えば、テスト対象の回路が生成したデータの高速フーリエ変換など)を表示したい場合は、MATLABが最適なソリューションとなります。

このノートのセクションでは、以下のタスクを行います:

エクスポートされたデータの処理方法をMATLABに指示するには、デザイン内にdo_fft.mという名前のmファイルを作成し、FFTの計算やグラフ作成を行うMATLABコマンドを記述する必要があります。MATLABコマンドの一覧は以下の通りです:

	Y=fft(smpl,512) ;
	My = sqrt(Y.* conj(Y)) ;
	f = 1000*(0:256)/512 ;
	[MM, MI] = max( My(1:50) );
	MF = f(MI);
	plot(f,My(1:257))
	title('Frequency content of filter output')
	xlabel('frequency (Hz)')
	grid on

注記:

テスト対象の回路の出力のサンプルを格納するには、配列が必要になります。以下に、変数の宣言例を示します:

	reg [15:0] samples [1:512];

テスト対象の回路の特性や検証手順に合わせて、適切なサンプリングコードを記述してください。ここでの唯一の前提条件は、サンプリング周期が1 nsであることです。サンプル配列にデータが格納されたら、MATLABへのエクスポートに進むことができます:

	out_arr_id = $create_array( "smpl", 1, 512); // create temp. array
	// transfer samples to temp. array:
	for ( i=1; i<513; i=i+1)
        $put_item( samples[i], 0, out_arr_id, 1, i );
	$hdl2ml( out_arr_id );                 // send temp. array to Matlab

注記:

$hdl2mlタスクは、out_arr_idで表される一時配列をMATLAB環境にエクスポートします:

	$eval_string( "do_fft" );          // request processing
	$get_variable( "MF", fmax );       // read variable from Matlab
	$destroy_array( out_arr_id );      // clean up!

注記:

まとめ

このドキュメントで説明したMATLABインターフェースは、MATLABの豊富な数学的機能やグラフ描画機能を活用して、VerilogやVHDLコードの機能を簡単に拡張する方法です。



Printed version of site: support.aldec.com/jp/support/resources/documentation/articles/1044