はじめに
ここではXilinx社製ISimによるブレイクポイントを用いたデバッグの方法について説明しています.複雑な回路になると実機ではとてもデバッグができなくなってきます.ここで説明するブレイクポイントを用いることで,Verilogモジュールで構築した回路がどのタイミングで動作しているか確認できるとともに,テストベンチに記述した入力データと回路との関係がはっきりとわかるようになります.
題材
今回は16セグメントLEDの制御回路を題材にします.こちらにプロジェクトがありますのでダウンロードしてください.下に動作している回路の様子を示します.はじめに,左上側にある16セグLED(DIS1)に文字を表示するため,左下側6個のスイッチで表示する文字を指定し,右下にあるスイッチ1つでその文字を確定して行きます.1つの文字が確定したら,次にDIS2にも文字を表示するため,スイッチを同様に操作します.これをDIS3,DIS4にも行うことで,4つの文字がすべて表示されます.下の例ではCPLDと表示しています.制御しているCPLDの端子を減らすため,ダイナミック点灯方式を使っています.
ブレイクポイントの設置と動作確認
プロジェクトを開くと下の図のように4種類のモジュールから成り立っていることがわかります.最上位に位置するのがSixteenSegment,その下にAntiChattering,DividerForDisplay,SixteenSegmentControllerがあります.
次にテストベンチについてもみましょう.各モジュールに1つずつテストベンチがあります.ここでは,t_SixteenSegmentテストベンチについてみてみましょう.
下の図のようにt_SixteenSegmentを選択したのち,下側にあるSimulate Behavioral Modelをダブルクリックしてください.iSimが立ち上がるはずです.
iSimが立ち上がりましたら,iSim上でテストベンチとモジュールを開きます.まず,下の図のようにt_SixteenSegmentをダブルクリックしてください.そうすると,テストベンチがiSim上に表示されるはずです.
下の図はt_SixteenSegmentの一部です.94行目から95行目にて,CLKをトグルさせてクロックを生成しています.98行目から115行目では各ディスプレイに表示するパターンを指定しています.100行目から102行目では,DIS1に対し,0のパターンを表示させています.iSwが6個のスイッチを表しており,ここでは0x1bが0の文字コードになっています.そして,101行目と102行目にてNANDを使ったチャタリングの発生しないスイッチを再現しています.詳しい話は省きますが,とにかく101行目と102行目で1の文字コードをおくっている,と捉えてください.同様に,DIS2には2,DIS3には3,DIS4には4を表示しようとしています.
では,ブレイクポイントを入れて動作させてみましょう.ここでは104行目にブレイクポイントを入れ,そこまで動作させてみます.下の図のように,104行目をクリックすると,赤い丸が現れます.これがブレイクポイントを表しています.その後,画像左上にある,オレンジの資格で囲ったアイコンを押してリスタートをし,その後,緑色の四角で囲ったアイコンを押すことで,ブレイクポイントのところまで実行されます.
ブレイクすると,下の図のように,黄色い三角が104行目に現れるはずです.これで104行目の実行する直前でシミュレータが止まっている状態です.
次にタイミングチャートを見てください.下の図がそれです.Default.wcfgを見ると,オレンジで囲ったところのように,oDis1がLowの区間でoBとoCが立ち上がっているところがいくつかあります.これは,oDis1がアクティブ(つまり表示する)とき,セグメントoBとoCがHigh(つまり点灯)していることを表しています.
16セグメントLEDを構成するLEDには下図のように名称があります.今回,oBとoC端子が1になっているため点灯しますので,「1」のパターンが現れます.
次に112行目にブレイクポイントを入れてみます.その後,Run Allします.
Run All 後の波形を下に示します.オレンジで囲ったところでは,先ほどと同様に「1」が表示されています.水色で囲った箇所はoDis2がLowになっている区間であり,この時にはoCとoFがLow,つまり消えているため,「2」が表示されています.黄色で囲った箇所はoDis3はoEとoFがLow,つまり消えているため,「3」が表示されています.最後にピンク色で囲った箇所はoA1からすべてLowになっているため,表示されていません.これは,112行目以降では「4」が表示されるようになるのですが,まだその直前であるため,全消灯となっています.
このようなブレイクポイントはVerilogのコードにも入れることができます.条件分岐に当てはまっているかなども確かめられますので大変有用です.ぜひシミュレーションを使って効率よく開発を行ってください.