このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
MATLAB Test ベンチで HDL モジュールを検証する
このチュートリアルでは、MATLAB® を使用して単純な HDL 設計を検証する HDL Verifier™ アプリケーションをセットアップするための基本的な手順について説明します。このチュートリアルでは、フィボナッチ数列に基づいた疑似乱数ジェネレーターのモデルを開発、シミュレート、検証します。モデルは VHDL® でコーディングされています。
このチュートリアルでは、QuestaSim® を使用してテストベンチを作成および実行するので、QuestaSim がシステム パス上に存在している必要があります。サポートされているその他のツールと要件については、コシミュレーションの要件 を参照してください。
MATLAB サーバーを起動する
このセクションでは、MATLAB サーバー コンポーネントを起動し、共有メモリまたは TCP/IP ソケット モードを使用してクライアント接続を確認する方法について説明します。これらの手順は、MATLAB ユーザー インターフェイスに精通していることを前提としています。
1. MATLAB を開始します。
2. MATLABコマンドウィンドウ.
でhdldaemon('status')
を呼び出して、MATLABサーバーが実行中であることを確認します。
サーバーが実行されていない場合、メッセージは「
HDLDaemon is NOT running
」と表示されます。サーバーが TCP/IP ソケット モードで実行されている場合、メッセージは「
HDLDaemon socket server is running on Port
portnum
with 0 connections
」となります。サーバーが共有メモリ モードで実行されている場合、メッセージは
HDLDaemon shared memory server is running with 0 connections
と表示されます。サーバーが現在実行されていない場合は、手順
5
に進みます。
3. hdldaemon('kill')
と入力してサーバーをシャットダウンします。サーバーがシャットダウンされたことを確認するメッセージ HDLDaemon server was shutdown
が表示されます。
4. hdldaemon('socket', 0)
を呼び出して、TCP/IP ソケット モードでサーバーを起動します。プロパティ名/プロパティ値のペア ('socket' 0)
の値 0 は、オペレーティング システムがシステムで使用可能な TCP/IP ソケット ポートをサーバーに割り当てることを指定します。
5. サーバーは、次のメッセージを表示して起動したことを通知します。
HDLDaemon socket server is running on Port
portnum
with 0 connections
.
portnum
をメモします。ロードシミュレーションで matlabtb
コマンドを発行するときに必要になります。portnum
はシステムに固有のものであることに注意してください。
TCP/IP ソケット通信の代わりに共有メモリ通信を使用するように MATLAB サーバーを指定することもできます。このチュートリアルではソケット通信を使用します。さまざまなオプションを指定する方法の詳細については、hdldaemon
を参照してください。
QuestaSim Simulator を起動し、コシミュレーションをセットアップする
このセクションでは、QuestaSim ソフトウェアを起動し、QuestaSim 設計ライブラリをセットアップするための基本的な手順について説明します。これらの手順では、QuestaSim ユーザー インターフェイスに精通していることを前提としています。
1. QuestaSim を起動するには、MATLAB コマンド ウィンドウに「vsim
」と入力します。この機能は、QuestaSim を起動し、HDL Verifier ソフトウェアで使用するように構成します。QuestaSim の最初のフォルダーは、MATLAB の現在のフォルダーと一致する必要があります。
2. 現在のQuestaSimフォルダを確認します。QuestaSim コマンド ウィンドウに ls
コマンドを入力すると、現在の QuestaSim フォルダーが現在の MATLAB フォルダーと一致していることを確認できます。
このコマンドは、ファイル modsimrand.m
、modsimrand.vhd
、modsimrand_plot.m
、draw_modsimrand_fig.m
、transcript
、および compile_and_launch.tcl
をリストします。
そうでない場合は、QuestaSim フォルダーを現在の MATLAB フォルダーに変更します。現在の MATLAB フォルダは、現在のフォルダ ブラウザで確認するか、現在のフォルダ ナビゲーション バーを表示することで見つけることができます。QuestaSimでは、次のコマンドを発行して作業フォルダを変更できます: cd directory
ここで、directory
は作業元のフォルダーです。または、ファイル > ディレクトリの変更... を選択してディレクトリを変更することもできます。
3. コンパイル結果を保持するためのデザイン ライブラリを作成します。ライブラリと必要な _info
ファイルを作成するには、vlib
コマンドを入力します。
クエスタシム> vlib work
メモ: 必要な _info
ファイルが作成されるように、QuestaSim の ファイル メニューまたは vlib
コマンドを使用してライブラリ フォルダーを作成する必要があります。オペレーティング システムのコマンドを使用してライブラリを作成しないでください。
VHDL コードの開発
設計ライブラリを設定したら、QuestaSim エディタを使用して VHDL コードを作成および変更する必要があります。このチュートリアルでは、VHDL コードを自分で作成する必要はありません。代わりに、既存のファイル modsimrand.vhd
を開いて調べてください。このセクションでは、QuestaSim および MATLAB テスト ベンチにとって重要な modsimrand.vhd
のコード領域について説明します。
この時点で VHDL コードを調べない場合は、VHDL コードのコンパイル に進みます。
edit
コマンドを使用して、編集ウィンドウで modsimrand.vhd
を開くことができます。
QuestaSim> edit modsimrand.vhd
QuestaSim は 編集 ウィンドウを開き、modsimrand.vhd
の VHDL コードを表示します。
ファイルを表示している間:
1. 行 ENTITY modsimrand
には、VHDL エンティティ modsimrand
の定義が含まれています。
ENTITY modsimrand IS
PORT (
clk : IN std_logic ;
clk_en : IN std_logic ;
reset : IN std_logic ;
dout : OUT std_logic_vector (31 DOWNTO 0);
END modsimrand;
これは、MATLAB 環境で検証されるエンティティです。次の点に注意してください。
デフォルトでは、MATLAB サーバーは、MATLAB 環境内のエンティティを検証する MATLAB 関数の名前がエンティティ名と同じであると想定します。MATLAB 関数に明示的に名前を付けることができます。ただし、名前を指定しない場合、サーバーは関数名がエンティティ名と一致するものと想定します。この例では、MATLAB 関数名は
modsimrand_plot
であり、エンティティ名と一致しません。少なくとも 1 つのポート定義を含む
PORT
句を使用してエンティティを定義する必要があります。各ポート定義では、ポート モード (IN
、OUT
、またはINOUT
) と、HDL Verifier ソフトウェアでサポートされている VHDL データ型を指定する必要があります。この例のエンティティmodsimrand
は、タイプSTD_LOGIC
の 3 つの入力ポートclk
、clk_en
、およびreset
と、タイプSTD_LOGIC_VECTOR
の出力ポートdout
で定義されています。出力ポートは、検証のためにシミュレーション出力データを MATLAB 関数に渡します。オプションの入力ポートは、関数からクロック信号とリセット信号を受信します。あるいは、入力ポートはQuestaSimforce
コマンドからの信号を受信できます。MATLAB で使用するポート エンティティのコーディングの詳細については、MATLAB による検証用 HDL モジュールのコーディング を参照してください。
2. modsimrand.vhd
の残りのコードは、クロックが立ち上がりエッジを経験すると、ランダムに生成されたフィボナッチ数列を出力レジスタに書き込む modsimrand
の動作アーキテクチャを定義します。
ファイルの調査が完了したら、QuestaSim の 編集 ウィンドウを閉じます。
VHDL Code をコンパイルする
VHDL ソース ファイルを作成または編集した後、コンパイルする必要があります。このチュートリアルでは、modsimrand.vhd
をコンパイルする必要があります。プロジェクト ワークスペースでファイル名をクリックし、コンパイル > すべてコンパイル を選択すると、ファイルをコンパイルできます。別の方法としては、vcom
コマンドで modsimrand.vhd
を指定します。
クエスタシム> vcom modsimrand.vhd
コンパイルが成功すると、コマンド ウィンドウにメッセージが表示され、コンパイラはコンパイル結果を作業ライブラリに読み込みます。
MATLAB Function を開発する
HDL Verifier ソフトウェアは、MALAB テストベンチ関数を使用して MATLAB の HDL ハードウェアを検証します。HDL Verifier 要件を満たす MATLAB テストベンチ関数を作成または編集する必要があります。このチュートリアルでは、MATLAB テストベンチ関数を自分で開発する必要はありません。代わりに、既存のファイル modsimrand_plot.m
を開いて調べてください。
現時点で MATLAB 関数を調べない場合は、ロード シミュレーション に進みます。
注: modsimrand_plot.m
は、MATLAB 乱数ジェネレーターの例の下位レベルのコンポーネントです。modsimrand_plot.m
内のプロット コードについては、次のセクションでは説明しません。このチュートリアルでは、MATLAB が VHDL モデルを検証するために必要な modsimrand_plot.m
の部分のみに焦点を当てています。
MATLAB コマンド ウィンドウに edit modsimrand_plot.m
と入力すると、MATLAB エディターで modsimrand_plot.m
を開くことができます。
ファイルを表示している間:
1. 1行目には、MATLAB関数名とその必須パラメータが指定されています: function [iport,tnext] = modsimrand_plot(oport,tnow,portinfo)
この関数定義は、MATLAB と QuestaSim 間の通信チャネルを表すため重要です。関数をコーディングする場合:
2 つの出力パラメータ
iport
とtnext
、および 3 つの入力パラメータoport
、tnow
、およびportinfo
を使用して関数を定義する必要があります。MATLAB 関数の構文と関数の引数の定義を参照してください。QuestaSim
force
コマンドなどの他の信号ソースを使用する代わりに、またはそれに加えて、iport
パラメータを使用して入力信号を駆動できます。アプリケーションに応じて、入力ソースを任意に組み合わせて使用できます。ただし、複数のソースが単一のiport
に信号を送信する場合は、信号の競合を処理するための解決機能が必要になります。
2. 21 行目と 22 行目には、パラメータの初期化があります。
tnext = [];
iport = struct();
この場合、関数出力 iport
と tnext
は空の値に初期化されます。
3. MATLAB テストベンチ関数が QuestaSim から受信して QuestaSim に返すデータのタイプと、HDL Verifier がこのデータを処理する方法を知っておく必要があります。サポートされているデータ型 を参照してください。この関数には、次のポート データ型の定義と変換が含まれます。
このチュートリアル用に定義されたエンティティは、タイプ
STD_LOGIC
の 3 つの入力ポートとタイプSTD_LOGIC_VECTOR
の出力ポートで構成されます。STD_LOGIC_VECTOR
型のデータは、文字ごとに 1 ビットの文字の列ベクトルで構成されます。インターフェイスは、
STD_LOGIC
型のスカラー データを、対応する列挙型の文字リテラルに一致する文字に変換します。
61 行目の oport.dout
を含むコード行は、MATLAB 関数が QuestaSim から受信したデータが MATLAB 環境で使用できるように変換される方法を示しています。
ud.buffer(cyc) = mvl2dec(oport.dout)
この場合、関数は oport
で STD_LOGIC_VECTOR
データを受け取ります。関数 mvl2dec
は、ビット ベクトルを算術計算で使用できる 10 進数値に変換します。サポートされているデータ型 は、独自の MATLAB 関数をコーディングするときに考慮すべきデータ変換の種類の概要を示します。
4. modsimrand_plot.m
の残りを閲覧してください。完了したら、ロードシミュレーションに進みます。
負荷シミュレーション
VHDL ソース ファイルをコンパイルしたら、シミュレーション用にモデルをロードする準備が整います。このセクションでは、シミュレーション用にエンティティ modsimrand
のインスタンスをロードする方法について説明します。
1. 検証のためにmodsimrand
のインスタンスをロードします。インスタンスをロードするには、vsimmatlab
コマンドを指定します。
クエスタシム> vsimmatlab modsimrand
vsimmatlab
コマンドは、特に MATLAB で使用するために QuestaSim シミュレーター vsim
を起動します。QuestaSim は、エンティティのパッケージとアーキテクチャをロードするときに、コマンド ウィンドウに一連のメッセージを表示します。
2. シミュレータを初期化して、modsimrand
を MATLAB で検証します。matlabtb
コマンドを使用して QuestaSim を初期化します。このコマンドは、通信リンクと、QuestaSim に代わって MATLAB で実行される MATLAB 関数へのコールバックを定義します。さらに、matlabtb
コマンドでは、MATLAB 関数の実行タイミングを制御するパラメータを指定できます。
このチュートリアルでは、QuestaSim で次の matlabtb
コマンドを入力します。
> matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk -socket
portnum
コマンドラインの引数は次の条件を指定します。
modsimrand
— 協調シミュレーションする VHDL モジュールを指定します。-mfunc modsimrand_plot
— エンティティmodsimrand
のインスタンスを MATLAB 関数modsimrand_plot.m
にリンクします。エンティティ名がテストベンチ関数名と同じではないため、引数が必要です。-rising /modsimrand/clk
— 信号/modsimrand/clk
が立ち上がりエッジを経験するたびにテストベンチ関数が呼び出されるように指定します。-socket
portnum
— MATLAB サーバーの起動 でhdldaemon
の呼び出しによって返されるポート番号portnum
を指定します。
3. クロックを初期化し、入力信号をリセットします。QuestaSim force
コマンドや iport
パラメータ (テストベンチ関数の構文 を参照) などのいくつかのメカニズムを使用して、シミュレーション入力信号を駆動できます。とりあえず、次の force
コマンドを入力します。
> force /modsimrand/clk 0 0 ns, 1 5 ns -repeat 10 ns
> force /modsimrand/clk_en 1
> force /modsimrand/reset 1 0, 0 50 ns
最初のコマンドは、clk
信号の値を 0 ナノ秒で 0 に、5 ナノ秒で 1 に強制します。10 ナノ秒後、サイクルは 10 ナノ秒ごとに繰り返され始めます。2 番目と 3 番目の force
コマンドは、0 ナノ秒で clk_en
を 1 に設定し、50 ナノ秒で reset
を 0 に設定します。
QuestaSim 環境でシミュレーションを実行する準備が整いました。ここで、MATLAB 関数を設定する必要があります。
シミュレーションを実行する
このセクションでは、シミュレーションを開始、監視、再実行する方法について説明します。
シミュレーションを初めて実行する
シミュレーションを初めて実行する前に、クライアント接続を確認する必要があります。デバッグのためにブレークポイントを設定することもできます。
次の手順を実行します。
1. QuestaSim と MATLAB ウィンドウを開きます。
2. MATLAB では、'status'
オプションを指定して hdldaemon
を呼び出してクライアント接続を確認します: hdldaemon('status')
。この関数は、接続が存在することを示すメッセージを返します。
HDLDaemon socket server is running on port 4795 with 1 connection
または
HDLDaemon shared memory server is running with 1 connection
メモ: MATLAB で hdldaemon
を開始する前にシミュレーションを実行しようとすると、次の警告が表示されます:
#ML Warn - MATLAB server not available (yet),
The entity 'modsimrand' will not be active
3. MATLAB エディタで modsimrand_plot.m
を開きます。
4. oport.dout
を検索し、行番号の横をクリックしてその行にブレークポイントを設定します。赤いブレークポイント マーカーが表示されます。
5. QuestaSim に戻り、次のコマンドを入力します。
> run 80000
このコマンドは、QuestaSim にシミュレーションを 80,000 タイム ステップ (デフォルトのタイム ステップ期間を使用した場合 80,000 ナノ秒) 進めるよう指示します。以前に modsimrand_plot.m
にブレークポイントを設定していたため、ブレークポイントに到達するまでシミュレーションは MATLAB で実行されます。
QuestaSim は現在ブロックされており、明示的にブロックを解除するまでブロックされたままになります。シミュレーションがブロックされている間、MATLAB は QuestaSim が MATLAB 関数に渡したデータを ワークスペース ウィンドウに表示することに注意してください。
MATLAB では、空の図ウィンドウが開きます。このウィンドウを使用して、シミュレーションによって生成されたデータをプロットできます。
6. MATLAB ワークスペース ウィンドウ内でこれらの引数にマウス カーソルを合わせて、oport
、portinfo
、tnow
を調べます。現在のシミュレーション時間である tnow
が 0
に設定されていることを確認します。また、シミュレーションが modsimrand_plot
への最初の呼び出し中にブレークポイントに到達したため、MATLAB ワークスペースに portinfo
引数が表示されることに注意してください。
7. MATLAB エディターで 続行 をクリックします。次にブレークポイントに到達したときに、portinfo
が MATLAB ワークスペースに表示されなくなることに注意してください。portinfo
関数は最初の関数呼び出しでのみ渡されるため、表示されません。また、tnow
の値は 0 から 5e-09 まで進むことにも注意してください。
8.赤いブレークポイント マーカーをクリックしてブレークポイントをクリアします。
9. QuestaSim のブロックを解除し、MATLAB エディターで 続行 をクリックしてシミュレーションを続行します。シミュレーションは完了まで実行されます。シミュレーションが進むにつれて、生成されたデータが図ウィンドウにプロットされます。シミュレーションが完了すると、下図のような図ウィンドウが表示されます。
シミュレーションを再実行する
シミュレーションを再度実行する場合は、QuestaSim でシミュレーションを再起動し、クロックを再初期化し、入力信号をリセットする必要があります。そうするために:
1. 図ウィンドウを閉じます。
2. 次のコマンドを使用して、QuestaSim でシミュレーションを再起動します。
> restart
再起動 ダイアログ ボックスが表示されます。すべてのオプションを有効のままにして、再起動 をクリックします。
メモ: 再起動 ボタンは、matlabtb
コマンドによって確立されたシミュレーション コンテキストをクリアします。したがって、QuestaSim を再起動した後、以前のコマンドを再発行するか、新しいコマンドを発行する必要があります。
3. QuestaSim で matlabtb
コマンドを再発行します。
> matlabtb modsimrand -mfunc modsimrand_plot -rising /modsimrand/clk -socket
portnum
4. MATLAB エディタで modsimrand_plot.m
を開きます。
5. 前回の実行と同じ行にブレークポイントを設定します。
6. QuestaSim に戻り、次のコマンドを再入力して、クロックと入力信号を再初期化します。
> force /modsimrand/clk 0 0,1 5 ns -repeat 10 ns
> force /modsimrand/clk_en 1
> force /modsimrand/reset 1 0, 0 50 ns
7. シミュレーションを開始するには、次のようにコマンドを入力します。
> run 80000
シミュレーションをシャットダウン
シミュレーションを規則的にシャットダウンするには:
QuestaSimの場合:
シミュレート > シミュレーションの終了 を選択するか、
quit
コマンドを入力して、クライアント側でシミュレーションを停止します。QuestaSim を終了します。
MATLAB では、アプリケーションを終了するだけでシミュレーションがシャットダウンし、MATLAB も閉じます。
MATLAB を閉じずにサーバーをシャットダウンするには、'kill'
オプションを指定して hdldaemon
を呼び出します。
hdldaemon('kill')
サーバーがシャットダウンされたことを確認する次のメッセージが表示されます。
HDLDaemon server was shutdown