こんにちは! とぷぅ です。
前回の記事では ModelSim® を用いて無事に論理ミスを発見することができました。
またシミュレーションを行わなかったことにより、回路記述のミスの発見が遅れ、痛い目にあったことからシミュレーションの大切さを知りました。
その後テストベンチについて勉強し、今ではシミュレーションに対する苦手意識が無くなりました。
今回はテストベンチの記述に慣れてなかったころに勘違いしていたことを交えながら、テストベンチに苦手意識を持っている方に向けて、私がテストベンチを記述する際に意識している点をご紹介し、シミュレーションは簡単にできるということを知ってほしいと思います。
それではテストベンチの記述方法を述べていきたいと思いますが、その前に ModelSim シミュレーションを行う際のフローの確認をします。
ModelSim シミュレーションは
1. テストベンチ・ファイルの作成
2. テストパターンの記述
3. シミュレーションを実行して波形確認
の順番で行います。
1. テストベンチ・ファイルの作成
先輩の記事 (新人エンジニアの赤面ブログ 『シェフの気まぐれテストベンチ ~時間短縮のマル秘レシピ~』) にありますのでご確認ください。
今回は 1. の方法で生成したテストベンチ・ファイルを用いてテストパターンの記述の方法を述べます。
2. テストパターンの記述
図 1 をご覧ください。
図 1. テストベンチの記述例
上から説明をします。今回は言語が Verilog HDL の場合のテストベンチの記述方法をご紹介いたします。
ここまでは 1. テストベンチ・ファイルの作成 で自動的にツールが記述してくれています。
Quartus® II の機能と先輩の記事に感謝ですね!!
したがって今回は自分で記述する必要があるのはテストパターンの部分だけです!
ここの書き方だけ覚えておけばシミュレーションができるということです!
それではテストパターンの記述について詳しく述べていきます。
とはいっても抑えるべきポイントは少なくて、簡単です。
今回は前回の記事で実際に用いたテストパターンを例にして解説します。
図 2. テストパターンの記述例
今回与えようとしている入力波形は、
reset : 初め 200(ns) は 「Low」 で、その後は 「High」 のまま固定
sw : 6000(ns) ごとに 「High」 と 「Low」 を切り替え、最後は 「High」 で固定
CLK : 周期が 100(ns) のクロック
の 3種類です。
テストパターンの記述は大きく分けて
① 1 回だけ実行される記述 (initial 文)
② 繰り返し実行される記述 (always 文)
の 2種類で簡単に記述できます。
図 3. Initial 文と always 文の実行の違い
① 1回だけ実行される記述 (initial 文)
initial 文の中に記述します。今回の場合、reset と sw のような変化が少なく、パターンが決まってない信号の記述をする際に用います。
図 2 の 「sw の信号パターン」 のような記述をすると 図 4 のような入力波形を作ることができます。
図 4. Initial 文を用いたテストパターン
#6000 などのように記述することで、指定した時間の後に信号を変化させることができます。
指定する数値で時間を表しているのですが、これは timecale で指定している単位に依存します。
今回の例だと timescale で 1 ns と指定しているので、6000 ns の時間をおいていることになります。
さらに!波形の変化時間を記述する際に注意すべきは # の後の数字は加算されていくという点です。
はじめ私は図 4 のような入力波形を与えようとして図 5 のように #6000#12000#18000 と記述して入力波形が自分の想定と全く違うものとなっていました。
図 5. 私が間違えていた記述とその波形
② 繰り返し実行される文 (always 文)
always 文の中に記述します。例で言うと CLK (クロック) のような繰り返し変化をする信号の記述をする際に always 文を使用します。
図 6. always 文を用いたテストパターン
ここでも注意すべき点があります。
周期が 100(ns) の波形を作りたい場合は 「High」 と 「Low」 それぞれの信号変化時間を記述する必要があります。
ここでも私は周期 100(ns) の波形を作ろうとして #100 で記述して周期が 200(ns) になるという失敗をしていました。
以上がテストベンチの書き方です。
意外と簡単に感じませんか? そう、簡単なのです!! 途中までツールが記述してくれているのがありがたいですね。
苦手としていたテストベンチも今では得意になれたので、今テストベンチに苦手意識を持たれている方がいらっしゃいましたら是非参考にしていただければと思います。
まとめ
- シミュレーションをする際はテストベンチの記述が必須
- 自分で記述する部分はテストパターンのみ (Test Bench Writer を用いた場合)
- テストパターンの記述は 2 種類覚えておけば OK
- initial 文の # の後の時間は加算される
- クロックを記述する always 文の # の後の時間は周期の半分を記述する