このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
MATLAB 関数の HDL コードをインポートする
コシミュレーションタイプ—MATLAB関数
まだ行っていない場合は、Cosimulation Wizard を呼び出します。
cosimWizard
Cosimulation Type ペインで、フィールド HDL cosimulation with の
MATLAB
を選択して、MATLAB® 関数テンプレート (テスト ベンチまたはコンポーネント) を作成します。HDL Simulator には
ModelSim
またはXcelium
を選択します。このワークフローは Vivado® シミュレータではサポートされていません。ファイルが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 シミュレータ実行可能ファイルへの有効なパスを入力する必要があります。
[Next] をクリックします。
HDL ファイル - MATLAB 関数
HDL Files ペインで、関数またはブロックの作成に使用するファイルを指定します。
コシミュレーション ウィザードは、各ファイルのファイル タイプを判別し、ファイル名の横の File List にそのタイプを表示しようとします。コシミュレーション ウィザードがタイプを判別できない場合、または間違ったタイプが表示される場合は、File Type 列でタイプを直接変更できます。
可能であれば、コシミュレーション ウィザードは HDL シミュレータが提供する機能を使用してコンパイル順序を自動的に決定します。つまり、ファイルを任意の順序で追加できます。
ModelSim® を使用している場合は、コンパイル スクリプトが .do ファイル (ModelSim マクロ ファイル) としてリストされます。Xcelium™ を使用している場合は、コンパイル スクリプトがシステム スクリプトとしてリストされます。
Add をクリックして、1 つ以上のファイル名を選択します。
ファイルを削除するには、まず File List でファイル名を強調表示し、次に Remove Selected File をクリックします。
[Next] をクリックします。
HDL コンパイル - MATLAB 関数
HDL Compilation ペインでは、生成された HDL コンパイル コマンドを確認できます。必要に応じて、これらのコマンドを上書きしたりカスタマイズしたりすることができます。HDL ファイルの代わりにコンパイル スクリプトを含めた場合、このペインにはそれらのスクリプトを実行するコマンドが表示されます。
コマンドの変更を Compilation Commands ボックスに入力します。
メモ
システム シェル コマンドを含めないでください。例:
set file = a.vhd vcom $file
コマンドの実行から制御が Cosimulation Wizard に戻ると、変数には設定された値が保持されなくなります。このタイプのコマンドを含めようとすると、Status パネルにエラーが表示されます。
生成された HDL コンパイル コマンドに戻るには、Restore default commands をクリックします。変更を破棄するかどうかを確認するメッセージが表示されます。
続行するにはNextをクリックしてください。
HDL モジュール - MATLAB 関数
HDL Module ペインで、コシミュレーションで使用する HDL モジュールの名前を指定します。
Name of HDL module to cosimulate with にモジュールの名前を入力します。
Simulation options で追加のシミュレーション オプションを指定します。たとえば、前の画像では、次のオプションが表示されています。
HDLシミュレータの解像度
シミュレーションビューから信号を削除する最適化をオフにする
オプションをデフォルトに戻すには、Restore Defaults をクリックします。
Connection method の場合、ファイアウォール ポリシーで TCP/IP ソケット通信が許可されていない場合は、
Shared Memory
を選択します。次のステップに進むには、Next をクリックしてください。プロセスのこの時点で、アプリケーションはコマンド ウィンドウで次のアクションを実行します。
HDL シミュレータを起動します。
HDL シミュレータに HDL モジュールをロードします。
HDL サーバーを起動し、サーバーが起動したという通知を受信するまで待機します。
HDL サーバーに接続してポート情報を取得します。
HDL サーバーを切断してシャットダウンします。
コールバックスケジュール - MATLAB 関数
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 Edge
、Falling Edge
、またはSensitivity
を選択した場合、Sample time (ns) は Trigger Signal に変わります。コールバックをトリガーするために使用するシグナル名を入力します。
Browse をクリックすると、指定した HDL コンポーネント内の既存の信号を参照できます。
Add をクリックして、コマンドを MATLAB コールバック関数リストに追加します。
スケジュールするコールバック関数がさらにある場合は、上記の手順を繰り返します。コールバック関数を削除する場合は、削除する行を強調表示して、Remove をクリックします。
メモ
MATLAB コールバック関数リスト内の既存のコールバック関数と同じ HDL モジュールのコールバック関数を追加しようとすると、新しいコールバック関数によって既存のコールバック関数が上書きされます (コールバック タイプを変更した場合でも同様です)。Status ウィンドウに警告が表示されます:
Warning: This HDL component already has a scheduled callback function, which is replaced by this new one.
[Next] をクリックします。
スクリプト生成 - MATLAB 関数
設定を確認または変更するには、Back をクリックします。
スクリプトを生成するには、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