PS/2キーボードインターフェース用テストベンチ(procedure使用)でPS/2キーボード用のプロコルにしたがってクロックとデータを出力する procedure を作成した。とてもうまく行って満足している。(本当は未熟なのかもしれないが、何かおかしいところがあったらご指摘ください)
アサーションに関する本を読んでいて、PSLやOVLはまだ良く感じがつかめない。本を読んで、読んで勉強中だが、進み方は亀のようである。(私の歩みはのろいが、亀は決して遅くない、うちでは亀と散歩中に、ちょっと目を放した隙に逃げられている。しかも2匹もだ。。。)
というわけでアサーション専用言語はまだまだだが、PCI-Xの規格に合わないところをリポートするのに使えそうだと思っている。例えば、FRAME#が'0'になってからリトライや、スプリット応答を返すには8クロック以内、データを返すならば16クロック以内という規格があるが、それを検出するVHDLコードをテストベンチに入れておけば、PCI-Xモジュールを修正後に、規格から外れてしまう危険を防止できそうだ。
”PS/2キーボードインターフェース用テストベンチ(procedure使用)”に簡単なアサーション(と言えるかどうかわからないが。。。)を追加してみた。
以前は、
PS2_SigGen(x"1C", ps2clk, ps2data);
PS2_SigGen(x"32", ps2clk, ps2data);
だったところを、上に
signal testcode : std_logic_vector(7 downto 0);
を宣言して、下のように修正した。
testcode <= x"1C";
PS2_SigGen(testcode, ps2clk, ps2data);
if testcode /= scancode then
report "scancode Error!"severity FAILURE;
end if;
testcode <= x"32";
PS2_SigGen(testcode, ps2clk, ps2data);
if testcode /= scancode then
report "scancode Error!"severity FAILURE;
end if;
これで、PS/2プロトコルで送ったデータと、PS/2インターフェースでパラレルにしたデータがあっているかどうかを比べられるはずだ。
とりあえずこれで、2ms シミュレーションしてみた。

これだと、
PS/2キーボードインターフェース用テストベンチ(procedure使用)と同じなので、最初の procedure を以下のように変更してわざとエラーが出るように変更した。
testcode <= x"1C";
PS2_SigGen(testcode, ps2clk, ps2data);
if testcode+1 /= scancode then
report "scancode Error!"severity FAILURE;
end if;
変更しコンパイル、リスタート、2ms シミュレーションを行ったら、途中でシミュレーションが終了した。

Transcriptペインに出力されたログを見ると、エラーメッセージが出ていた。これでミスっていたらシミュレーションがとまり、エラーが出ることがわかった。

このように、テストベンチにアサーション?を組み込んで行こうと思った。
ちなみに、シミュレーションがブレークするレベルは選択できる。それはModelSimの Simulate -> Runtime Options... を選択する。

Runtime Options ダイアログが開くので、Assertions タブをクリック。

Failureにボタンが選択されていると思う。今は severity FAILURE; なので、シミュレーションがストップしているが、矢印のFatalにするとシミュレーションが停止せずに、前のシミュレーションのように、2ms まで行われる。

ここは違うんじゃないか、とかのご指摘待っています。なにしろ、アサーションやったことないもんで。。。
2007/10/12 : PS/2インターフェースのパリティは奇数パリティだったため、ModelSimのwave波形を修正しました。
- 2007年10月04日 20:49 |
- アサーション事始め
-
| トラックバック:0
-
| コメント:4
assert 文 ?
> ここは違うんじゃないか、とかのご指摘待っています。
もうだいぶ vhdl 使っとらんのですが、
そもそも assert 文てのがあったような。。。
- 2007/10/05(金) 09:21:10 |
- URL |
- hyotan #VWFaYlLU
- [ 編集 ]
こんにちは。
assert(testcode /= scancode) report "scancode Error!"severity FAILURE;
でも同じですね? まだテストしていないですが。。。
私は、waveファイルでしか見てなくて、テストベンチでチェックしたことがないので、初心者です。
皆さん、こんな風に書いているのかな?それともPSLとか使っているのかな?という疑問です。
- 2007/10/05(金) 10:10:36 |
- URL |
- marsee #-
- [ 編集 ]
どうもすんませんです。
なんせ "report" の無い時代に使ってたもので、
まず report の severity って何 ? という感触っす。
お客さんが "vhdl 93 は禁止" とかのたまってた時分に、
こっそり report 単独で、verilog hdl の $display まがいに
使ったことはありますが。。。
- 2007/10/05(金) 11:03:38 |
- URL |
- hyotan #VWFaYlLU
- [ 編集 ]
いえいえ、コメントありがとうございます。
report文単体で書けるのはVHDL93からのようですね。
if で書いたほうがぴんとくるような気がします。
休み中にはVerilogのテストベンチを勉強する予定ないので、よろしければまた、いろいろ教えてください。
- 2007/10/05(金) 12:57:49 |
- URL |
- marsee #-
- [ 編集 ]