無償ツールで実践する「ハード・ソフト協調検証」(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バイト単位のアクセス・テストを行っています.

 

 

組み込みキャッチアップ
お知らせ 一覧を見る

《半導体ネット もうすぐ1周年記念》,「HDL文法ガイド」を抽選で100名様にプレゼント!

4/24(土),東京・秋葉原にて電子&工作系イベント「エレキジャック・フォーラム」開催.受講・入場登録受付中!

《読者の広場》皆さまから寄せられた「ひと口コメント」 Part6 ―― あなたがお薦めのiPhoneアプリの名前は?

PICK UP用語

USB

関連記事

volatile

関連記事

Verilog HDL

関連記事

ニュース

Rohde & Schwarz,測定周波数が3GHzながら80.9万円と安いスペクトラム・アナライザを発売

Agilent,CANやLIN,I2Cなどのシリアル通信の解析を得意とするオシロスコープを発売

Actel,Cortex-M3プロセッサをハード・マクロで搭載するFPGAを発売

ヒューマンデータ,Virtex-5を搭載するFPGAボードを発売

グレープシステム,組み込み用の暗号エンジンを発売

組み込みブログ

組み込み場外乱闘

移転のお知らせ

2009年5月29日

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

【ETロボコン】 北関東説明会を実施。ついに新潟に上陸!!

2010年3月15日

Hamana Project

実行委員会ペイロード

2009年9月27日