FC2カウンター FPGAの部屋 PS/2キーボードインターフェース用テストベンチ(procedure使用)のアサーションのようなもの
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

PS/2キーボードインターフェース用テストベンチ(procedure使用)のアサーションのようなもの

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 シミュレーションしてみた。
assertion_test_wave1_071004.png

これだと、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 シミュレーションを行ったら、途中でシミュレーションが終了した。
assertion_test_wave2_071004.png

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

このように、テストベンチにアサーション?を組み込んで行こうと思った。

ちなみに、シミュレーションがブレークするレベルは選択できる。それはModelSimの Simulate -> Runtime Options... を選択する。
assertion_test_ModelSim1_071004.png

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

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


ここは違うんじゃないか、とかのご指摘待っています。なにしろ、アサーションやったことないもんで。。。

2007/10/12 : PS/2インターフェースのパリティは奇数パリティだったため、ModelSimのwave波形を修正しました。
  1. 2007年10月04日 20:49 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:4

コメント

assert 文 ?

> ここは違うんじゃないか、とかのご指摘待っています。
もうだいぶ vhdl 使っとらんのですが、
そもそも assert 文てのがあったような。。。
  1. 2007/10/05(金) 09:21:10 |
  2. URL |
  3. hyotan #VWFaYlLU
  4. [ 編集 ]

こんにちは。

assert(testcode /= scancode) report "scancode Error!"severity FAILURE;
でも同じですね? まだテストしていないですが。。。

私は、waveファイルでしか見てなくて、テストベンチでチェックしたことがないので、初心者です。
皆さん、こんな風に書いているのかな?それともPSLとか使っているのかな?という疑問です。
  1. 2007/10/05(金) 10:10:36 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

どうもすんませんです。
なんせ "report" の無い時代に使ってたもので、
まず report の severity って何 ? という感触っす。

お客さんが "vhdl 93 は禁止" とかのたまってた時分に、
こっそり report 単独で、verilog hdl の $display まがいに
使ったことはありますが。。。
  1. 2007/10/05(金) 11:03:38 |
  2. URL |
  3. hyotan #VWFaYlLU
  4. [ 編集 ]

いえいえ、コメントありがとうございます。

report文単体で書けるのはVHDL93からのようですね。
if で書いたほうがぴんとくるような気がします。

休み中にはVerilogのテストベンチを勉強する予定ないので、よろしければまた、いろいろ教えてください。
  1. 2007/10/05(金) 12:57:49 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/614-28872dd6
この記事にトラックバックする(FC2ブログユーザー)