無償ツールで実践する「ハード・ソフト協調検証」(5) ―― テスト・プログラムの作成とBFMのコードの生成
無償のSystemVerilog対応シミュレータと無償のFPGA用オンチップ・バス・モデルを用いて,ハードウェア・ソフトウェア協調検証の一手法について解説する連載の第5回である.今回は,まずC言語側のテスト・プログラムを作成する.続いて,SOPC Builderを使ってバス・マスタのモデル(Avalon-MM Master BFM)とオンチップ・メモリのモデルを接続し,それらのVerilog HDLコードを生成する.(編集部)
技術解説シリーズ「無償ツールで実践する『ハード・ソフト協調検証』」 第1回 SystemVerilogのDPI-C機能 第2回 テスト・プログラムはC言語で書く 第3回 Avalonインターフェースと検証用モデル 第4回 SystemVerilog側のDPI-Cの記述を作成する |
10.テスト・プログラムを書いてみる
前節では,SystemVerilog側のDPI-Cの記述を作成しました.次にC言語側のテスト・プログラムを作成します.dpi_func.h,dpi_main.cという二つのファイルについて説明します.
●dpi_func.h
dpi_func.hファイルをリスト7に示します.また,dpi_func.hのファイルはこちらからダウンロードできます.
void bfm_read32 ( unsigned int addr, unsigned int *data ); void bfm_write32( unsigned int addr, unsigned int data ); void bfm_nop( int no ); |
dpi_func.hでは,SystemVerilog側のタスクを呼び出すための七つの関数のプロトタイプ宣言を行っています.
●dpi_main.c
dpi_main.cファイルをリスト8に示します.また,dpi_main.cのファイルはこちらからダウンロードできます.
#include "dpi_func.h" int test_32( void ){ unsigned int addr, data, exp; addr = 0x00000000; int test_16( void ){ unsigned int addr; addr = 0x00000100; int test_8( void ){ unsigned int addr; addr = 0x00000053; int dpi_main( void ){ test_32(); |
dpi_main.cでは,SystemVerilog側から呼び出されるdpi_main関数を次のように定義しています.
int dpi_main( void ){ test_32(); return 0; |
dpi_main関数内で三つの関数test_32,test_16,test_8を呼び出します.test_32,test_16,test_8はそれぞれ,SystemVerilog側に対して4バイト単位,2バイト単位,1バイト単位でアクセスするテストを行っています.
test_32関数は,以下の記述により4バイト単位のアクセス・テストを行います.
int test_32( void ){ unsigned int addr, data, exp; addr = 0x00000000; bfm_nop(10); bfm_read32 ( addr, &exp ); if( data != exp ){ |
bfm_write32関数でライト・サイクルを実行したあと,bfm_nop関数で10クロック分ウェイトし,bfm_read32関数でリード・サイクルを実行し,ライトしたデータとリードしたデータを比較しています.
test_32関数と同じように,test_16関数ではbfm_write16関数とbfm_read16関数で2バイト単位のアクセス・テストを行い,test_8関数ではbfm_write8関数とbfm_read8関数で1バイト単位のアクセス・テストを行っています.