論理シミュレーションを行う癖を付けよう:触って学ぼう FPGA開発入門(2)(3/3 ページ)
回路が大規模になればなるほど実機動作から不具合を特定することは難い。必ず論理シミュレーションを行うようにしよう
論理シミュレータを使ってみよう(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
以下に、テストベンチの内容を解説します。
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」の値を変えています。
このテストベンチでは、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]ボタンで閉じます。
起動したらメニューの[File]−[Change Directory...]を選択して、「Choose folder」ダイアログを表示します。ここで、RTLとテストベンチのファイルがあるフォルダを設定して[OK]ボタンをクリックします。
続いて、メニューから[File]−[New]−[Library...]を選択します。「Create a New Library」ダイアログが表示されるので、そのまま[OK]ボタンをクリックします。
画面左の「Workspace」ツリーに「work」ライブラリが追加されます。
メニューから[Compile]−[Compile...]を選択します。「Compile Source Files」のダイアログが表示されるので、RTLとテストベンチのファイルを選択して[Compile]ボタンをクリックします。
次に、メニューの[Simulate]−[Start Simulation...]をクリックします。「Start Simulation」ダイアログが表示されるので、[Design]タブのツリーから「work」を探して「+」をクリックして展開します。最上位階層、ここでは「TEST_DECODER7」を選択して[OK]ボタンをクリックします。
画面中央に「Objects」が表示されるので、波形表示したい信号を選択します(ここでは「A」「B」「C」「CYCLE」「LED」「SA」のすべてを選択します)。
メニューから[Add]−[Wave]−[Selected Signals]を選択します。選択された信号が画面右の「wave - default」に表示されます。続けて、メニューの[Simulate]−[Run]−[Run -All]を選択します。
テストベンチに「$finish;」が記述されている(リスト3の20行目)ので、シミュレーションを終了するかどうか尋ねてきます(画面7)。ここでは、波形で動作を確認したいので[いいえ]ボタンをクリックします。ちなみに「$finish;」の代わりに「$stop;」を記述すれば、終了するかどうかを確認するダイアログは表示されません。
画面右「wave - default」の右上にある「+」(Zoom/Unzoom window)をクリックすると、波形表示によるシミュレーション結果が拡大表示されます。「A」「B」「C」の入力に対して、LEDの出力が変化していることが確認できます。
回路が大規模化すればするほど、実機動作から不具合を特定することは難しくなります。そのため、論理シミュレータで回路になる部分、つまりRTLの記述が正しいかどうかを確認してから実機に転送するようにしましょう。論理シミュレーションで正しく動作しないデータをいくらボード上に転送しても、ボード上では絶対に正常に動作しません。
いかがでしたでしょうか? 今回は、7セグメントLEDの表示と論理シミュレーションに挑戦しました。このくらいの回路規模であれば「論理シミュレーションなんて……」と感じているのではないでしょうか? しかし、実機で動作させる前にシミュレーションを行うことはとても大切です。面倒くさいからと敬遠せずに、シミュレータの実行をぜひ心掛けてください。
次回は、「順序回路(カウンタ)」をボード上で動作させる予定です。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.