検索
連載

論理シミュレーションを行う癖を付けよう触って学ぼう FPGA開発入門(2)(3/3 ページ)

回路が大規模になればなるほど実機動作から不具合を特定することは難い。必ず論理シミュレーションを行うようにしよう

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

論理シミュレータを使ってみよう(2)

テストベンチの記述

 まず、リスト1のRTLの動作を確認するためにテストベンチを記述します(リスト3)。


1  module TEST_DECODER7;
2  reg A,B,C;
3  wire [7:0] LED;
4  wire [3:0] SA;
5  
6  parameter CYCLE = 100;
7  
8  DECODER7 i0(.A(A), .B(B), .C(C), .LED(LED), .SA(SA));
9  
10 initial
11 begin
12    {A,B,C}=3'b000;
13    #CYCLE {A,B,C}=3'b001;
14    #CYCLE {A,B,C}=3'b010;
15    #CYCLE {A,B,C}=3'b011;
16    #CYCLE {A,B,C}=3'b100;
17    #CYCLE {A,B,C}=3'b101;
18    #CYCLE {A,B,C}=3'b110;
19    #CYCLE {A,B,C}=3'b111;
20    #CYCLE $finish;
21 end
22 
23 endmodule
リスト3 7セグメントLEDデコーダのテストベンチ(TEST_DECODER7.v

 以下に、テストベンチの内容を解説します。

1行目

 テストベンチには入出力がないので、ポートリストは記述しません。モジュール名だけ記述します。

2〜4行目

 7セグメントLEDのデコーダの入力端子につなぐ信号(変数)「A」「B」「C」は、手続的代入文(always文、initial文)の中で左辺で使われているのでreg宣言を行います。それ以外の信号(変数)「LED」「SA」は、wire宣言を行います。

6行目

 parameter文で1サイクルの長さを指定します。

8行目

 7セグメントLEDのデコーダをインスタンスします。

10〜21行目

 「A」「B」「C」の入力ポートへの連接子「{ ]」を使用した信号代入を記述します(「0」「1」で考えられるすべての組み合わせを入力)。parameter文で指定した時間だけずらして「A」「B」「C」の値を変えています。

※注:
厳密には、RTL中に記述されているcase文の「default」に処理が飛ぶかどうかを確認するために、8つの組み合わせ以外の「z」「x」などを入力として与える必要があります。


 このテストベンチでは、7セグメントのLEDデコーダの入力ポート「A」「B」「C」に「3'b000〜3'b111」の8通りの組み合わせの信号を100ステップごとに変化させて代入し、出力ポート(「LED」「SA」)の変化をチェックします。

シミュレーションの実行

 テストベンチの準備ができたら、シミュレーションを実行してみましょう。

 [スタート]−[プログラム]−[ModelSim XE III 6.2c]−[ModelSim]で論理シミュレータを起動します。最初に「Welcome to Version 6.2c」ダイアログが表示されるので右下の[Close]ボタンで閉じます。

Welcome to Version 6.2cダイアログ
画面2 Welcome to Version 6.2cダイアログ

 起動したらメニューの[File]−[Change Directory...]を選択して、「Choose folder」ダイアログを表示します。ここで、RTLとテストベンチのファイルがあるフォルダを設定して[OK]ボタンをクリックします。

 続いて、メニューから[File]−[New]−[Library...]を選択します。「Create a New Library」ダイアログが表示されるので、そのまま[OK]ボタンをクリックします。

 画面左の「Workspace」ツリーに「work」ライブラリが追加されます。

workライブラリが追加された様子
画面3 workライブラリが追加された様子
※注:
ModelSimでは、コンパイル結果はすべてworkと呼ばれるライブラリフォルダに格納されます。画面3のようにworkライブラリがすでに表示されていれば、設定の必要はありません。


 メニューから[Compile]−[Compile...]を選択します。「Compile Source Files」のダイアログが表示されるので、RTLとテストベンチのファイルを選択して[Compile]ボタンをクリックします。

Compile Source Filesダイアログ
画面4 Compile Source Filesダイアログ
※注:
コンパイル結果は、画面下のログウィンドウに表示されます。エラーの場合は、赤い文字でエラーメッセージが出力されるので、それを基にファイルを修正してください(以下同)。


 次に、メニューの[Simulate]−[Start Simulation...]をクリックします。「Start Simulation」ダイアログが表示されるので、[Design]タブのツリーから「work」を探して「+」をクリックして展開します。最上位階層、ここでは「TEST_DECODER7」を選択して[OK]ボタンをクリックします。

Start Simulationダイアログ
画面5 Start Simulationダイアログ

 画面中央に「Objects」が表示されるので、波形表示したい信号を選択します(ここでは「A」「B」「C」「CYCLE」「LED」「SA」のすべてを選択します)。

波形表示したい信号を選択する
画面6 波形表示したい信号を選択する

 メニューから[Add]−[Wave]−[Selected Signals]を選択します。選択された信号が画面右の「wave - default」に表示されます。続けて、メニューの[Simulate]−[Run]−[Run -All]を選択します。

 テストベンチに「$finish;」が記述されている(リスト3の20行目)ので、シミュレーションを終了するかどうか尋ねてきます(画面7)。ここでは、波形で動作を確認したいので[いいえ]ボタンをクリックします。ちなみに「$finish;」の代わりに「$stop;」を記述すれば、終了するかどうかを確認するダイアログは表示されません。

Finish Vsimダイアログ
画面7 Finish Vsimダイアログ。ここでは[いいえ]を選択する

 画面右「wave - default」の右上にある「+」(Zoom/Unzoom window)をクリックすると、波形表示によるシミュレーション結果が拡大表示されます。「A」「B」「C」の入力に対して、LEDの出力が変化していることが確認できます。

波形表示によるシミュレーション結果の確認
画面8 波形表示によるシミュレーション結果の確認

 回路が大規模化すればするほど、実機動作から不具合を特定することは難しくなります。そのため、論理シミュレータで回路になる部分、つまりRTLの記述が正しいかどうかを確認してから実機に転送するようにしましょう。論理シミュレーションで正しく動作しないデータをいくらボード上に転送しても、ボード上では絶対に正常に動作しません。



 いかがでしたでしょうか? 今回は、7セグメントLEDの表示と論理シミュレーションに挑戦しました。このくらいの回路規模であれば「論理シミュレーションなんて……」と感じているのではないでしょうか? しかし、実機で動作させる前にシミュレーションを行うことはとても大切です。面倒くさいからと敬遠せずに、シミュレータの実行をぜひ心掛けてください。

 次回は、「順序回路(カウンタ)」をボード上で動作させる予定です。(次回に続く)


関連キーワード

FPGA | 回路 | 配線 | 設計 | 組み込み


前のページへ |       

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る