Main Content

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

MATLAB 関数の HDL コードをインポートする

コシミュレーションタイプ—MATLAB関数

まだ行っていない場合は、Cosimulation Wizard を呼び出します。

cosimWizard

  1. Cosimulation Type ペインで、フィールド HDL cosimulation withMATLAB を選択して、MATLAB® 関数テンプレート (テスト ベンチまたはコンポーネント) を作成します。

  2. HDL Simulator には ModelSim または Xcelium を選択します。このワークフローは Vivado® シミュレータではサポートされていません。

  3. ファイルがUse HDL simulator executables on the system pathにある場合は、それを選択します。コシミュレーション ウィザードは、デフォルトでそれらがシステム パス上にあると想定します。

    HDL シミュレータ実行ファイルがシステム パス上に 存在しない 場合は、Use the following HDL simulator executables at the following location を選択し、下のテキスト ボックスでフォルダーの場所を指定します。

    Next をクリックしても Cosimulation Wizard が実行可能ファイルを見つけられない場合は、次のようになります。

    • このダイアログに戻り、Cosimulation Wizard のステータス ペインにエラーが表示されます。

    • コシミュレーション ウィザードはオプションを Use the following HDL simulator executables at the following location に切り替えます。

    • コシミュレーション ウィザードにより、HDL シミュレーション パス フィールドを編集できるようになります。

    続行する前に、HDL シミュレータ実行可能ファイルへの有効なパスを入力する必要があります。

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

HDL ファイル - MATLAB 関数

HDL Files ペインで、関数またはブロックの作成に使用するファイルを指定します。

  • コシミュレーション ウィザードは、各ファイルのファイル タイプを判別し、ファイル名の横の File List にそのタイプを表示しようとします。コシミュレーション ウィザードがタイプを判別できない場合、または間違ったタイプが表示される場合は、File Type 列でタイプを直接変更できます。

  • 可能であれば、コシミュレーション ウィザードは HDL シミュレータが提供する機能を使用してコンパイル順序を自動的に決定します。つまり、ファイルを任意の順序で追加できます。

  • ModelSim® を使用している場合は、コンパイル スクリプトが .do ファイル (ModelSim マクロ ファイル) としてリストされます。Xcelium™ を使用している場合は、コンパイル スクリプトがシステム スクリプトとしてリストされます。

  1. Add をクリックして、1 つ以上のファイル名を選択します。

  2. ファイルを削除するには、まず File List でファイル名を強調表示し、次に Remove Selected File をクリックします。

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

HDL コンパイル - MATLAB 関数

HDL Compilation ペインでは、生成された HDL コンパイル コマンドを確認できます。必要に応じて、これらのコマンドを上書きしたりカスタマイズしたりすることができます。HDL ファイルの代わりにコンパイル スクリプトを含めた場合、このペインにはそれらのスクリプトを実行するコマンドが表示されます。

  1. コマンドの変更を Compilation Commands ボックスに入力します。

    メモ

    システム シェル コマンドを含めないでください。例:

    set file = a.vhd vcom $file

    コマンドの実行から制御が Cosimulation Wizard に戻ると、変数には設定された値が保持されなくなります。このタイプのコマンドを含めようとすると、Status パネルにエラーが表示されます。

  2. 生成された HDL コンパイル コマンドに戻るには、Restore default commands をクリックします。変更を破棄するかどうかを確認するメッセージが表示されます。

  3. 続行するにはNextをクリックしてください。

HDL モジュール - MATLAB 関数

HDL Module ペインで、コシミュレーションで使用する HDL モジュールの名前を指定します。

  1. Name of HDL module to cosimulate with にモジュールの名前を入力します。

  2. Simulation options で追加のシミュレーション オプションを指定します。たとえば、前の画像では、次のオプションが表示されています。

    • HDLシミュレータの解像度

    • シミュレーションビューから信号を削除する最適化をオフにする

    オプションをデフォルトに戻すには、Restore Defaults をクリックします。

  3. Connection method の場合、ファイアウォール ポリシーで TCP/IP ソケット通信が許可されていない場合は、Shared Memory を選択します。

  4. 次のステップに進むには、Next をクリックしてください。プロセスのこの時点で、アプリケーションはコマンド ウィンドウで次のアクションを実行します。

    • HDL シミュレータを起動します。

    • HDL シミュレータに HDL モジュールをロードします。

    • HDL サーバーを起動し、サーバーが起動したという通知を受信するまで待機します。

    • HDL サーバーに接続してポート情報を取得します。

    • HDL サーバーを切断してシャットダウンします。

コールバックスケジュール - MATLAB 関数

  1. Callback Schedule ペインで、HDL シミュレーターからの複数のコンポーネントまたはテストベンチ関数のコールバックを入力します。各コールバック関数に次の情報を入力します。

    • Callback type: コンポーネント関数を作成するには matlabcp を選択し、テストベンチ関数を作成するには matlabtb を選択します。

    • Callback function name (オプション):HDL コンポーネントと同じでない場合は、コンポーネントまたはテストベンチ関数の名前を指定します。デフォルトでは、関数名は HDL コンポーネント名と同じであると想定されます。

    • HDL component:コンポーネント名を手動で入力するか、Browse をクリックして参照します。

    • Trigger mode:コールバック関数をトリガーするには、次のいずれかを指定します。

      • Repeat

      • Rising Edge

      • Falling Edge

      • Sensitivity

    • Sample time (ns) or Trigger Signal:

      • トリガー Repeat を選択した場合は、サンプル時間をナノ秒単位で入力します。

      • Rising EdgeFalling Edge、または Sensitivity を選択した場合、Sample time (ns)Trigger Signal に変わります。コールバックをトリガーするために使用するシグナル名を入力します。

      Browse をクリックすると、指定した HDL コンポーネント内の既存の信号を参照できます。

  2. Add をクリックして、コマンドを MATLAB コールバック関数リストに追加します。

    スケジュールするコールバック関数がさらにある場合は、上記の手順を繰り返します。コールバック関数を削除する場合は、削除する行を強調表示して、Remove をクリックします。

    メモ

    MATLAB コールバック関数リスト内の既存のコールバック関数と同じ HDL モジュールのコールバック関数を追加しようとすると、新しいコールバック関数によって既存のコールバック関数が上書きされます (コールバック タイプを変更した場合でも同様です)。Status ウィンドウに警告が表示されます:

    Warning: This HDL component already has a scheduled callback function, which is
    replaced by this new one.
  3. [Next] をクリックします。

スクリプト生成 - MATLAB 関数

  1. 設定を確認または変更するには、Back をクリックします。

  2. スクリプトを生成するには、Finish をクリックします。

生成されたファイル - MATLAB 関数

コシミュレーション ウィザードは次のファイルを作成し、それぞれを個別の MATLAB エディター ウィンドウで開きます。

  • launchHDLsimulator — MATLAB との協調シミュレーション用に HDL シミュレータを起動するスクリプト。

  • compileHDLDesign — この特定のコンポーネントの後続のコンパイルに再利用できるコンパイル スクリプト。

  • 関数ファイル (*.m) — コンポーネントおよびテストベンチのカスタマイズされた関数テンプレート。コシミュレーション ウィザードで指定されたコンポーネントごとに 1 つ。

コンポーネントまたはテストベンチ機能を完了する

ウィザードが生成するテンプレートには、以下の例に示すように、いくつかの単純なポート I/O 命令と、独自のコードを追加できる空のルーチンが含まれています。MATLAB 関数の作成と使用の完全な例については、コシミュレーション ウィザードを使用して MATLAB コンポーネント関数で HDL モジュールを検証する を参照してください。

function osc_top_u_osc_filter1x(obj)
% Automatically generated MATLAB(R) callback function.

% Copyright 2010 The MathWorks, Inc.
% $Revision $

% Initialize state of callback function.
if (strcmp(obj.simstatus,'Init'))
    disp('Initializing states ...');

    % Store port information in userdata
    % The name strings of ports that sends data from HDL simulator to
    % MATLAB callback function
    obj.userdata.FromHdlPortNames = fields(obj.portinfo.out);
    obj.userdata.FromHdlPortNum   = length(fields(obj.portinfo.out));

    % The name strings of ports that sends data from MATLAB callback
    % function to HDL simulator
    obj.userdata.ToHdlPortNames   = fields(obj.portinfo.in);
    obj.userdata.ToHdlPortNum     = length(fields(obj.portinfo.in));

    % Initialize state
    obj.userdata.State = 0;
end

% Obj.tnow is the current HDL simulation time specified in seconds
disp(['Callback function is executed at time ' num2str(obj.tnow)]);

if(obj.userdata.FromHdlPortNum > 0)
    % The name of the first input port
    portName  = obj.userdata.FromHdlPortNames{1};
    disp(['Reading input port ' portName]);
    % Convert the multi-valued logic value of the first port to decimal
    portValueDec  = mvl2dec( ...
        obj.portvalues.(portName), ...      % Multi-valued logic of the first port
        obj.portinfo.out.(portName).size);  %#ok<NASGU> % Bit width
    % Then perform any necessary operations on this value passed by HDL simulator.
    % ...
    % Optionally, you can translate the port value into fixed point object,
    % e.g.
    % myfiobj = fi(portValueDec,1, 16, 4);
end

% Update your state(s). In the following example, we use this internal
% state to implement a one-bit counter
obj.userdata.State = ~obj.userdata.State;

if(obj.userdata.ToHdlPortNum > 0)
    % The name of the first output port in HDL
    portName = obj.userdata.ToHdlPortNames{1};
    disp(['Writing output port ' portName]);

    % Assign the first port value to internal state obj.userdata.State.
    % Before assignment, convert decimal value to multi-valued logic.
    % You can change obj.userdata.State to another other valid decimal values.
    obj.portvalues.(portName) = dec2mvl(...
        obj.userdata.State, ...
        obj.portinfo.in.(portName).size);

    % Operate on other out ports, if there are any.
    % ...
end

参考

関連するトピック