前回の『DE0メモ』で、

その他、シミュレータなどでいろいろ検証したりもあるようですが、僕はまだその段階にありません。

と、書いたのですが、

「普通はシミュレータの方が先だよ」との意見を戴きました。

また、DE0を使って実験をしていると、なんだかよくわからない挙動をするときがあるんですね。そういう時に中をひょいと覗けないのは、思いのほか辛いものです。

さらに、DE0を持ち歩いているわけではないので、ちょっと試したいときにはシミュレーターが使えれば、ある程度の実験は出来るでしょう。

そんなわけで、使ってみました。シミュレーター。

使用したのは、「ModelSim ALTERA STARTER EDITION 10.1b」です。Quatus IIとは別にインストールする必要がありますが、無償で配布されているのでダウンロードしてくるだけです。

Quartus II

シミュレーターを使う前にまず、Quartus IIでVerilog HDLの簡単なモジュールを書いて、実際にDE0で動かしてみます。

module ToggleLed(btn, led);

 input btn;
 output led;
 reg state = 1'b0;

 assign led = state;

 always @(negedge btn) begin
  state = !state;
 end

endmodule

ピンアサインは、

btn: F1 (BUTTON2)
led: J1 (LED0)

これをDE0に書き込むと、タクトスイッチ(BUTTON2)を1回押すと、LED0が点灯、もう一度押すと消灯します。今回、チャタリング防止は組み込んでいません。

Photo-22-01-13-08-20-47-0

ModelSim

実機での確認が終わったら、いよいよModelSimを起動して、新しいテスト・プロジェクトを作成します。

Quartus IIで記述したVerilog HDLファイルをインポートします。
(インポートしたファイルの編集は、ModelSimでも出来ます。)
Parallels Picture

テスト・ベンチの記述

テスト・ベンチは、ToggleLedモジュールを記述したファイルにそのまま記述できます。どのモジュールをテストするのかをあとから指定するので、名前は関係ないようです。

module ToggleLedTest();

  reg btn = 1'b0;
  wire led;

  reg [3:0] i;

  ToggleLed toggleLed(btn, led);

  initial begin
    $monitor("button:%b, led:%b", btn, led);
    for(i=0; i < 15; i=i+1) begin
      #1
      btn = !btn;
    end
  end
endmodule

シミュレーションの実行

テスト・ベンチを追記したVerilog HDLをコンパイルして、”Start Simulation”を実行すると、どのモジュールをテストするのか指定する画面になるので、ここでテスト・ベンチのモジュール名(ToggleLedTest)を選択します。

最後に、”Run” -> “Run -all”を実行すれば、シミュレーターは、テストベンチを実行して、monitorで指定している内容をコンソール(transcript)に出力します。

# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0

 

しかし、これは期待している結果ではありません。

この結果では、テストを開始した最初の時点で、ledが1(HIGH)になっています。ボタンを最初に押すまでは0であることを想定しています(実際、DE0の動作もそうなっています)。

よくよく見てみると、テスト・ベンチに記述しているbtnの初期値が1’b0になっています(DE0のタクトスイッチは押していない状態が1で、押した状態が0)。

btnの初期値を1’b1に修正して、再度シミュレーションを実行すると、

# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0
# button:1, led:0
# button:0, led:1
# button:1, led:1
# button:0, led:0

 

期待したとおりの動作となりました。

波形の観察

あらかじめ指定した各レジスタや入出力の波形を表示する機能もあります。

これで、挙動がおかしいときにも、内部の状態を視覚的に確認することが出来そうです。

Screen Shot 2013-01-23 at 1.12.31 AM