無償ツールで実践する「ハード・ソフト協調検証」(5) ―― テスト・プログラムの作成とBFMのコードの生成

Verification Enginnerの戯言

tag: 半導体

技術解説 2010年1月 5日

無償の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のファイルはこちらからダウンロードできます.

リスト7 C言語のヘッダ・ファイル(dpi_func.h)

void bfm_read32 ( unsigned int addr, unsigned int   *data );
void bfm_read16 ( unsigned int addr, unsigned short *data );
void bfm_read8  ( unsigned int addr, unsigned char  *data );

void bfm_write32( unsigned int addr, unsigned int   data );
void bfm_write16( unsigned int addr, unsigned short data );
void bfm_write8 ( unsigned int addr, unsigned char  data );

void bfm_nop( int no );


 dpi_func.hでは,SystemVerilog側のタスクを呼び出すための七つの関数のプロトタイプ宣言を行っています.

 

●dpi_main.c

 dpi_main.cファイルをリスト8に示します.また,dpi_main.cのファイルはこちらからダウンロードできます.

リスト8 C言語のソース・ファイル(dpi_main.c)

#include "dpi_func.h"

int test_32( void ){

    unsigned int addr, data, exp;

    addr = 0x00000000;
    data = 0x12345678;   
    bfm_write32( addr, data );
   
    bfm_nop(10);
   
    bfm_read32 ( addr, &exp );
   
    if( data != exp ){
        printf("compare error : 0x%x != 0x%x\n", data, exp );
        return 1;
    }
    return 0;
}

int test_16( void ){

    unsigned int addr;
    unsigned short data, exp;

    addr = 0x00000100;
    data = 0xfedc;   
    bfm_write16( addr, data );
   
    bfm_nop(10);
   
    bfm_read16 ( addr, &exp );
   
    if( data != exp ){
        printf("compare error : 0x%x != 0x%x\n", data, exp );
        return 1;
    }
    return 0;
}

int test_8( void ){

    unsigned int addr;
    unsigned char data, exp;

    addr = 0x00000053;
    data = 0x5a;   
    bfm_write8( addr, data );
   
    bfm_nop(10);
   
    bfm_read8 ( addr, &exp );
   
    if( data != exp ){
        printf("compare error : 0x%x != 0x%x\n", data, exp );
        return 1;
    }
    return 0;
}

int dpi_main( void ){

    test_32();
    test_16();
    test_8 ();
   
    return 0;
}


 dpi_main.cでは,SystemVerilog側から呼び出されるdpi_main関数を次のように定義しています.

  int dpi_main( void ){

    test_32();
    test_16();
    test_8 ();

    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;
    data = 0x12345678;   
    bfm_write32( addr, data );

    bfm_nop(10);

    bfm_read32 ( addr, &exp );

    if( data != exp ){
      printf("compare error : 0x%x != 0x%x\n", data, exp );
      return 1;
    }
    return 0;
  }

 


 bfm_write32関数でライト・サイクルを実行したあと,bfm_nop関数で10クロック分ウェイトし,bfm_read32関数でリード・サイクルを実行し,ライトしたデータとリードしたデータを比較しています.

 test_32関数と同じように,test_16関数ではbfm_write16関数とbfm_read16関数で2バイト単位のアクセス・テストを行い,test_8関数ではbfm_write8関数とbfm_read8関数で1バイト単位のアクセス・テストを行っています.

 

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日