Main Content

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

hdlverifier.HDLCosimulation

System objectHDL コシミュレーション用のMATLABを作成します

説明

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

MATLABを使用した HDL コシミュレーション用のSystem objectを作成するには、次のようにします。

  1. コシミュレーション ウィザードを使用してオブジェクトをカスタマイズします。hdlverifier.HDLCosimulation

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

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

System object の動作の詳細については、 What Are System Objects?を参照してください。

作成

hdlverifier.HDLCosimulation System objectを作成するには、コシミュレーション ウィザードを使用して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)構文と同等です。

コシミュレーション ウィザードは、既存の HDL コードと HDL 起動スクリプトを使用してhdlverifier.HDLCosimulation System objectを作成します。コシミュレーション ウィザードを使用すると、起動が簡単になります。

プロパティ

すべて展開する

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

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

プロパティ値の変更の詳細については、 「 System Design in MATLAB Using System Objects 」を参照してください。

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

例: 'data_in'

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

データ型: char | cell

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

例: 'out1'

例: {'out1','out2'}

データ型: char | cell

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

データ型を 1 つだけ指定した場合、各出力は同じデータ型になります。各出力に異なるデータ型を割り当てるには、出力の数と同じサイズの cell 配列を指定します。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 つの要素を含む cell 配列として指定します。

  • 最初の要素は HDL プレシミュレーション遅延であり、非負の整数として指定します。

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

例: {10,'fs'}

データ型: cell

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

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

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

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

例: {'SharedMemory'}

例: {'Socket',1234}

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

データ型: cell

メモ

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

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

System objectへの各呼び出し間の HDL シミュレーターでの経過時間。2 つの要素を含む cell 配列として指定します。

  • 最初の要素は、 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)input1 を指定します。 in1およびinput2からin2まで。

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

出力引数

すべて展開する

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

例: 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 で実装されたビタビ デコーダーを協調シミュレーションする方法を示します。

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

  • 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 をインスタンス化します。これらのオブジェクトは、ビタビ デコーダ周辺のシステムを構成し、ビタビ 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);

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

≪ModelSimまたはXceliumの場合≫

1. ModelSim または Xcelium の HDL コシミュレーションSystem object は、コシミュレーション ウィザード ツールまたはhdlcosim関数を使用して作成できます。この例では、関数hdlcosimを使用して HDL コシミュレーション System Object を生成します。System object は、このシミュレーション システムにおけるビタビ デコーダーの 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. Cosimulation Wizard を使用して HDL コシミュレーションSystem objectを生成するには、 MATLAB System Object の協調シミュレーション ウィザードに記載されている手順 6 までに従います。

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

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

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

「c.」 In1In2 のポート名をInputに設定します。

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

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

「f.」 「次へ」をクリックします。

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

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

「b.」 SignUnsignedに設定します。

「c.」小数部の長さを0に設定します。

「d.」 「次へ」をクリックします。

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

「あ。」クロック周期を10に設定します。

「b.」 reset Initial Value1に、Duration8に設定します。

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

「d.」 「次へ」をクリックします。

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

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

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

「c.」 「次へ」をクリックします。

「システムオブジェクト」について「生成」ページで「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を介してビタビ復号器 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))

Cosimulation System オブジェクトを破棄して HDL シミュレーターを解放する

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

clear hDec;

参考

バージョン履歴

R2012b で導入