Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

hdlverifier.HDLCosimulation

MATLAB を使用した HDL 協調シミュレーション用の System object を作成する

説明

hdlverifier.HDLCosimulation System object™ は MATLAB® とハードウェア コンポーネントを共同シミュレートします。System object は、HDL シミュレータでシミュレーション中の HDL モデルに入力信号を書き込み、そこから出力信号を読み取ります。この System object を使用して、System object をそれぞれ出力ポートまたは入力ポートのみで構成することにより、ソース デバイスまたはシンク デバイスをモデル化できます。

MATLAB を使用した HDL 協調シミュレーション用の System object を作成するには:

  1. Cosimulation Wizard を使用して hdlverifier.HDLCosimulation オブジェクトをカスタマイズします。

  2. デザイン内にオブジェクトを作成し、そのプロパティを設定します。

  3. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の動作の詳細については、「システム オブジェクトとは?」を参照してください。

作成

hdlverifier.HDLCosimulation System object を作成するには、Cosimulation Wizard を使用して HDLCosimulation System object をカスタマイズします。Cosim ウィザードの出力は hdlcosim_toplevel.m というファイルです。ここで、toplevel は最上位 HDL モジュールの名前です。次に、ローカル変数に割り当てることで System object を作成できます。

説明

hdlc = hdlverifier.HDLCosimulation は、デフォルトのプロパティ値を持つ hdlverifier.HDLCosimulation System object を作成します。この System object は、MATLAB ワークスペース内の HDL シミュレーションへのインターフェースを提供します。

hdlc = hdlverifier.HDLCosimulation(Name,Value) は、1 つ以上の Name,Value ペアによってプロパティを指定します。各プロパティ名を一重引用符で囲みます。以下に例を示します。

hdlc = hdlverifier.HDLCosimulation('InputSignals','/top/in1', ... , 'OutputFractionLangths',10);

hdlc = hdlcosim は、デフォルトのプロパティ値を持つ hdlverifier.HDLCosimulation System object を作成します。この構文は hdlverifier.HDLCosimulation 構文と同等です。

hdlc = hdlcosim(Name,Value)hdlverifier.HDLCosimulation(Name,Value) 構文と同等です。

Cosimulation Wizard は、既存の HDL コードと HDL 起動スクリプトを使用して hdlverifier.HDLCosimulation System object を作成します。起動を簡単にするには、Cosimulation Wizard を使用してください。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトを呼び出した後にプロパティ値を変更することはできません。オブジェクトは呼び出し時にロックされ、関数 release でロック解除されます。

プロパティが "調整可能" な場合は、いつでも値を変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

HDL コード内の入力パス。文字ベクトルまたは文字ベクトルのセル配列として指定されます。パスは HDL 階層の最上位レベルを基準として指定されます。

例: 'data_in'

例: {'/top/in1','/top/in2'}

データ型: char | cell

HDL コード内の出力パス。文字ベクトルまたは文字ベクトルのセル配列として指定されます。パスは HDL 階層の最上位レベルを基準として指定されます。

例: 'out1'

例: {'out1','out2'}

データ型: char | cell

出力信号のデータ型。文字ベクトルのセル配列として指定されます。有効なデータ型は 'fixedpoint''double'、または 'single' です。

データ型を 1 つだけ指定した場合、各出力は同じデータ型になります。各出力に異なるデータ型を割り当てるには、出力の数と同じサイズのセル配列を指定します。OutputDataTypes セル配列の各要素は、System object 出力 (hdloutputs) 内の対応する要素のデータ型を指定します。

例: {'fixedpoint'} – すべての出力データ型は fixedpoint です。

例: {'double','single'} – 最初の出力のデータ型は double で、2 番目の出力のデータ型は single です。

メモ

OutputDataTypes{'fixedpoint'} で、ビット幅が組み込みデータ型のサイズ (8、16、32、または 64) と一致し、OutputFractionLengths0 に設定されている場合、出力信号のデータ型はその組み込みデータ型として返されます。

データ型: cell

出力の符号。false (符号なし)、true (符号付き)、または論理ベクトルとして指定されます。

true または false のみを指定した場合、各出力には対応する符号が付きます。各出力に異なる符号を適用するには、出力の数と同じサイズの論理ベクトルを指定します。OutputSigned ベクトルの各要素は、System object 出力 (hdloutputs) 内の対応する要素の符号を指定します。

例: true – すべての出力には符号付きの値があります。

例: [true,true,false] — 最初の出力は符号付き値、2 番目の出力は符号付き値、3 番目 (最終) の出力は符号なし値です。

出力小数部の長さ(ビット単位)。整数または整数のベクトルとして指定されます。

スカラーのみを指定した場合、各出力は同じ小数部の長さになります。各出力に異なる小数部の長さを適用するには、出力の数と同じサイズのベクトルを指定します。OutputFractionLengths ベクトルの各要素は、System object 出力 (hdloutputs) 内の対応する要素の小数部の長さを指定します。

例: 10 — すべての出力の小数部の長さは 10 ビットです。

例: [16,8] — 最初の出力の小数部の長さは 16 ビットで、2 番目 (および最終) の出力の小数部の長さは 8 ビットです。

文字ベクトルとして指定された、System object への最初の呼び出し中に HDL シミュレータによって実行される Tcl 事前シミュレーション コマンド。この Tcl 事前シミュレーション コマンドは、System object がリリースされた後の最初の呼び出し時にも実行されます。

例: 'force /top/rst 1 0, 0 2 ns; force /top/clk 0 0, 1 1 ns -repeat 2 ns'

データ型: char

文字ベクトルとして指定された System object を解放するための呼び出し中に HDL シミュレータによって実行される Tcl ポスト シミュレーション コマンド。

例: 'echo "done"'

データ型: char

コシミュレーションが開始する前の HDL シミュレーターの遅延。2 つの要素を持つセル配列として指定されます。

  • 最初の要素は、負でない整数として指定される HDL 事前シミュレーション遅延です。

  • 2 番目の要素は時間単位で、'fs','ps','ns','us','ms' または 's' のいずれかの文字ベクトルとして指定されます。

例: {10,'fs'}

データ型: cell

HDL シミュレータへの接続のパラメータ。1 つ、2 つ、または 3 つの要素を持つセル配列として指定されます。

  • 最初の要素は接続タイプであり、'SharedMemory' or 'Socket' として指定されます。共有メモリを指定する場合、ポート番号とホスト名 (このセル配列の 2 番目と 3 番目の要素) は適用されません。

  • 2 番目の要素はポート番号であり、正の整数である必要があります。指定されていない場合、この値は 4449 に設定されます。

  • 3 番目の要素は HDL セッションのホスト名です。指定されていない場合、この値は localhost に設定されます。

例: {'SharedMemory'}

例: {'Socket',1234}

例: {'Socket',1234,'hostname'}

データ型: cell

メモ

FrameBasedProcessing プロパティは将来のリリースで削除される予定です。

System object 実行中の入力のサイズに基づいて、サンプル モードまたはフレーム モードが自動的に検出されます。

HDL シミュレーターで System object の各呼び出し間の経過時間。2 つの要素を持つセル配列として指定されます。

  • 最初の要素は、System object への 2 回の呼び出し間の時間であり、正の整数として指定されます。

  • 2 番目の要素は時間単位で、文字ベクトルとして指定されます: 'fs','ps','ns','us','ms','s'

例: {10,'ns'}

データ型: cell

使用法

説明

hdloutputs = hdlc(hdlinputs) は HDL シミュレータに接続し、hdlinputs を HDL シミュレータに書き込み、hdloutputs を HDL シミュレータから読み取ります。System object の各呼び出し間の経過シミュレーション時間は、SampleTime プロパティによって定義されます。

入力引数

すべて展開する

HDL シミュレータへの入力。HDL 入力ポートに駆動される値のコンマ区切りリストとして指定されます。HDL 入力ポートは InputSignals プロパティによって設定されます。このコンマ区切りのペアの要素数は、HDL 入力ポートの数と等しくなければなりません。各入力引数値は、対応する HDL 入力ポートに駆動されます。

たとえば、InputSignals{'in1','in2'} として設定されている場合、out = hdlc(input1,input2) を指定して値 input1in1 に、input2in2 にします。

例: [RealFft, ImagFft] = hdlc(3,12); 値 3 と 12 は、2 つの入力ポートを持つ HDL シミュレータへの入力として駆動されます。

出力引数

すべて展開する

HDL シミュレータからの出力。スカラーまたはベクトルとして返されます。返される各要素は、対応する HDL 出力ポートからの出力です。HDL 出力ポートは OutputSignals プロパティで指定されます。返される要素の数は、指定された HDL 出力ポートの数と同じです。たとえば、OutputSignals{'out1','out2'} として設定されている場合、out1 から o1 に値を割り当て、out2 から o2 に値を割り当てるには、[o1, o2] = hdlc(i1,i2) を指定します。

例: out1 = hdlc(3,12); は、1 つの出力ポートを持つ HDL シミュレータからの出力値を割り当てます。

例: [RealFft, ImagFft] = hdlc(3,12); は、2 つの出力ポートを持つ HDL シミュレータからの出力値を割り当てます。この例では、RealFft は最初のポートからの出力であり、ImagFft は 2 番目のポートからの出力です。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、以下の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

この例では、MATLAB® System object と HDL シミュレータを使用して、VHDL で実装された Viterbi デコーダを共同シミュレーションする方法を示します。

HDL Verifier™ 製品を使用すると、MATLAB System object を使用して Verilog または VHDL で実装された設計を検証できます。この製品を使用すると、HDL コードを MATLAB と共同シミュレーションし、HDL 実装に対してモデルを検証できます。この例では、MATLAB System object と次の HDL シミュレータを使用して、Viterbi デコーダを共同シミュレーションします。

  • Xilinx® の Vivado® シミュレータ

  • Mentor Graphics® の ModelSim® または Questa®

  • Cadence® の Xcelium®

シミュレーションパラメータを設定し、通信システムオブジェクトをインスタンス化する

Xcelium を使用している場合は、シミュレータ変数を Xcelium に設定します。

Simulator = 'Xcelium';

ModelSim/QuestaSim を使用している場合は、シミュレータ変数を ModelSim に設定します。

Simulator = 'ModelSim';

Vivado シミュレータを使用している場合、Vivado シミュレータの HDL コシミュレーション System object™ は、コシミュレーション ウィザード ツールのみを使用して作成できます。Cosimulation Wizard ツールの詳細については、コシミュレーションウィザード を参照してください。

次のコードは、シミュレーション パラメータを設定し、チャネル エンコーダー、BPSK 変調器、AWGN チャネル、BPSK 復調器、およびエラー レート計算機を表す System object をインスタンス化します。これらのオブジェクトは、Viterbi デコーダーの周囲のシステムを構成し、Viterbi HDL 実装のテスト ベッドと考えることができます。

EsNo = 0;	% Energy per symbol to noise power spectrum density ratio in dB
FrameSize = 1024;  % Number of bits in each frame

畳み込みエンコーダ

hConEnc = comm.ConvolutionalEncoder;

BPSK変調器

hMod    = comm.BPSKModulator;

AWGNチャネル

hChan   = comm.AWGNChannel('NoiseMethod', ...
                         'Signal to noise ratio (Es/No)', ...
                         'SamplesPerSymbol',1, ...
                         'EsNo',EsNo);

BPSK復調器

hDemod  = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
                            'Variance',0.5*10^(-EsNo/10));

エラー率計算機

hError  = comm.ErrorRate('ComputationDelay',100,'ReceiveDelay',58);

コシミュレーション システム オブジェクトをインスタンス化し、HDL シミュレータを起動する

ModelSim または Xcelium の場合

1. ModelSim または Xcelium の HDL コシミュレーション System object は、コシミュレーション ウィザード ツールまたは hdlcosim 関数を使用して作成できます。この例では、hdlcosim 関数を使用して HDL 協調シミュレーション システム オブジェクトを生成します。System object は、このシミュレーション システムにおける Viterbi デコーダの HDL 実装を表します。オブジェクトのインターフェースはすべてのシミュレーターで共通です。一部の HDL テストベンチ コードを記述する手間を省くため、シミュレータ固有の Tcl コードを使用してクロックとリセットの波形を生成します。

hDec = hdlcosim('InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
              'OutputSignals', {'/viterbi_block/Out1'}, ...
              'OutputSigned', false, ...
              'OutputFractionLengths', 0, ...
              'TCLPostSimulationCommand', 'echo "done";', ...
              'PreRunTime', {10,'ns'}, ...
              'Connection', {'Shared'}, ...
              'SampleTime', {10,'ns'});
switch Simulator
  case 'ModelSim'
      hDec.TCLPreSimulationCommand = ...
          'force /viterbi_block/clk_enable 1 0; force /viterbi_block/clk 0 0 ns, 1 5 ns -repeat 10 ns; force /viterbi_block/reset 1 0 ns, 0 8 ns; ';
  case 'Xcelium'
      hDec.TCLPreSimulationCommand = ...
          'force :clk B"0" -after 0ns B"1" -after 5ns -repeat 10ns; force reset B"1" -after 0ns B"0" -after 8ns; force :clk_enable B"1" -after 0ns';
end

2. vsim および nclaunch コマンドは HDL シミュレータを起動します。起動された HDL シミュレータ セッションは、HDL 設計をコンパイルし、HDL シミュレーションをロードします。HDL シミュレーションがシミュレータに完全にロードされると、コシミュレーションを実行する準備が整います。

disp('Launching HDL simulator...');
switch Simulator
  case 'ModelSim'
      vsim('tclstart',viterbi_cosimulation_tclcmds('vsimmatlabsysobj'));
  case 'Xcelium'
      nclaunch('tclstart',viterbi_cosimulation_tclcmds('hdlsimmatlabsysobj'));
end
Timeout=30;
processid = pingHdlSim(Timeout);
Check if HDL simulator is ready for Cosimulation.
assert(ischar(processid),['Timeout: HDL simulator took more than ', num2str(Timeout),' seconds to setup,please increase the timeout in ''pingHdlSim''']);
disp('...Simulator is ready for cosimulation.');

Vivado シミュレータの場合

1. コシミュレーション ウィザードを使用して HDL コシミュレーション System object を生成するには、MATLAB システム オブジェクトのコシミュレーション ウィザード に記載されている手順 6 まで実行します。

入力/出力ポート ページで、次の手順を実行します。

a.clk ポート名を Clock に設定します。

b.reset および clk_enable ポート名を Reset に設定します。

c. In1 および In2 ポート名を Input に設定します。

d. ce_out ポート名を Unused に設定します。

e.Out1 ポート名を Output に設定します。

f.[Next] をクリックします。

出力ポートの詳細で、次の手順を実行します。

a.サンプル時間10に設定します。

b.SignUnsigned に設定します。

c. 分数の長さを 0 に設定します。

d. [Next] をクリックします。

クロック/リセットの詳細ページで、次の手順を実行します。

a.クロック周期を10に設定します。

b.リセット 初期値1 に設定し、期間8 に設定します。

c. clk_enable Initial Value0 に設定し、Duration1 に設定します。

d. [Next] をクリックします。

開始時間の調整ページで、次の手順を実行します。

a.HDL 時間によるコシミュレーションの開始0 に設定して、実行前時間を設定します。

b.図の更新をクリックします。

c. [Next] をクリックします。

System Obj. について生成 ページで、HDL シミュレータのサンプリング期間10 に設定し、完了 をクリックします。

2. 生成された System object スクリプトは次のようになります。

xsiData = createXsiData( ...
   'design', 'xsim.dir/design/xsimk', ...
   'lang', 'vhdl', ...
   'prec', '1ps', ...
   'types', {'Logic' 'Logic' 'Logic' }, ...
   'dims', {3 3 1 }  ...
  );
obj = hdlcosim( ...
   'HDLSimulator', 'Vivado Simulator', ...
   'InputSignals', {'/viterbi_block/In1','/viterbi_block/In2'}, ...
   'OutputSignals', {'/viterbi_block/Out1'}, ...
   'OutputSigned', [false], ...
   'OutputDataTypes', {'fixedpoint'}, ...
   'OutputFractionLengths', [0], ...
   'ClockResetSignals', {'/viterbi_block/clk' '/viterbi_block/reset' '/viterbi_block/clk_enable' }, ...
   'ClockResetTypes', {'Active Rising Edge Clock' 'Step 1 to 0' 'Step 0 to 1' }, ...
   'ClockResetTimes', {{10,'ps'} {8,'ps'} {1,'ps'} }, ...
   'PreRunTime', {0,'ps'}, ...
   'SampleTime', {10,'ps'}, ...
   'XSIData', xsiData  ...
  );

3. MATLAB でこのコマンドを使用して、System object を新しい変数 hDec に割り当てます。

hDec = hdlcosim_viterbi_block;

協調シミュレーションを実行する

この例では、コシミュレーション System object を介して Viterbi デコーダー HDL 実装を組み込んだ MATLAB の BPSK 通信システムをシミュレートします。このコードのセクションでは、処理ループを呼び出して、各データ フレームに 1024 ビットが含まれるデータをフレームごとに処理します。

for counter = 1:20480/FrameSize
  data            = randi([0 1],FrameSize,1);
  encodedData     = hConEnc(data);
  modSignal       = hMod(encodedData);
  receivedSignal  = hChan(modSignal);
  demodSignalSD   = hDemod(receivedSignal);
  quantizedValue  = fi(4-demodSignalSD,0,3,0);
  input1          = quantizedValue(1:2:2*FrameSize);
  input2          = quantizedValue(2:2:2*FrameSize);
   receivedBits    = hDec(input1, input2);
   errors          = hError(data, double(receivedBits));
 end

ビットエラー率の表示

ビタビデコーダのビットエラー率が表示されます。

sprintf('Bit Error Rate is %d\n',errors(1))

コシミュレーション システム オブジェクトを破棄して HDL シミュレータを解放する

HDL コシミュレーション System object が MATLAB で破棄されると、HDL シミュレーターのブロックが解除されます。HDL シミュレータ セッションを手動で閉じます。

clear hDec;

参考

バージョン履歴

R2012b で導入