Tech と Culture

テクノロジーとカルチャー

YCbCr-RGB変換モジュールRTL 単体検証

YCbCr-RGB変換モジュールの検証(HDLシミュレーション)を行います。
Grlib内にある、ambatest packageを用いて検証します。
ambatest packageは正式にリリースされているものではなく、少しバグが残っているとメーリングリストでgaislerさんが発言しています。しかし、簡単な検証には充分使えるレベルにあると思われます。

ambatest package の使い方は、AMBA Master emulatorを含むシステムを作り、そのemulatorへの信号に対して準備されている関数をコールすることで、目的の信号を発生して動作をシミュレーションするというものです。

今回の検証には以下の図のような構造のものを作りました。
AMBA-test.png

YCbCr-RGB変換モジュールは、AHB master, AHB slave, APBの3つのバス接続が存在します。
これらを動かすために図のようにAHB controller, AHB-APB bridge, AHBRAMを用いました。
まず、AHB-APB bridge越しにモジュールのレジスタ設定を行う命令を発行します。
この時にFrameBufferのアドレスをAHBRAMのアドレスに設定しておきます。
そして、AHB slaveのアドレスに対して、データのWriteを行います。この時に32個書き込む毎に一旦バスを開放します。このようにすることによって、YCbCr-RGB変換モジュールがバスのアクセス権を獲得することができ、順番にAHBRAMに書き込みます。
最後にAHBRAMの内容をまとめて読み出し、正しく値が書き込まれているか検証します。

AMBA-test2.png

Grlibはジェネリックな記述が行われているため、このように単純にインスタンスをするだけでバス接続ができます。その際にそれぞれのAHB番号をきちんとわりふり、アドレスの指定を行う必要があります。すべてVHDLのgeneric文で指定することになっていますので、ここを注意して指定すれば検証用のシステムは完成です。
このシステムをインスタンスしたテストベンチのVHDLを作ります。

AMBA-test3.png

イニシャライズした後にAPBアドレスに書き込んでレジスタ設定を行います。
その後、ループ処理でファイルから読み込んだ値をどんどん書き込んでいきます。この時に以前C言語で小さな画像で生成した入力ベクトルファイルを使います。また、時々IDLE状態を作ってバスを開放して、YCbCr-RGB変換モジュールがバスを獲得できるようにしておきます。

AMBA-test4.png

その後、AHBRAMのアドレスを順にReadしていきます。この時に期待値比較ができるようになっていますので、期待値をファイルから順に読み込んで比較します。期待値ファイルも以前C言語で生成したものです。
期待値があっていれば以下のように読み出した値が順に出力されます。


# Time: 330790ns Read[0xa00042f8]: 0xd9c6d9c6
# Time: 330810ns Read[0xa00042fc]: 0xd9e5d184
# Time: 330830ns Read[0xa0004300]: 0xd1a4d1a4
# Time: 330850ns Read[0xa0004304]: 0xd1a4d1a4
# Time: 330870ns Read[0xa0004308]: 0xd1a4d1a4
# Time: 330890ns Read[0xa000430c]: 0xd185d185
# Time: 330910ns Read[0xa0004310]: 0xc984d185
# Time: 330930ns Read[0xa0004314]: 0xc1c5c9a4
# Time: 330950ns Read[0xa0004318]: 0xc1e5c1e5
# Time: 330970ns Read[0xa000431c]: 0xb9a4b9c4
# Time: 330990ns Read[0xa0004320]: 0xc164c1c5
# Time: 331010ns Read[0xa0004324]: 0xe247e288
# Time: 331030ns Read[0xa0004328]: 0xc9c5c164
# Time: 331050ns Read[0xa000432c]: 0xb984c1c5
# Time: 331070ns Read[0xa0004330]: 0x00000000
# Time: 331090ns Read[0xa0004334]: 0x00000000
# Time: 331110ns Read[0xa0004338]: 0x00000000
# Time: 331130ns Read[0xa000433c]: 0x00000000
# Time: 331150ns Read[0xa0004340]: 0x00000000

ちなみに期待値と異なる場合は次のように表示されます。

# Time: 340510ns Read[0xa0004a90]: 0x00000000 != 0xb1e5b9e5
# Time: 340530ns Read[0xa0004a94]: 0x00000000 != 0xa183a9a4
# Time: 340550ns Read[0xa0004a98]: 0x00000000 != 0xb9a4a963
# Time: 340570ns Read[0xa0004a9c]: 0x00000000 != 0xc9a5c1c5

ログをチェックすることで小さな画像のデータがきちんと所定の値に変換されて正しいアドレスに書き込まれていることが確認できました。
次はこのモジュールをLeon SYSTEMに統合して検証します。modelsimが行数制限で動かないためGHDLを使わねばなりません。。。。
どうなることやら。