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

 

 

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

10/15(金),秋葉原UDXにて「組込みシステム開発者フォーラム2010――Advantech Embedded Design-In Forum Japan」を開催,全セッション受講無料

《読者の広場》 「ひと口コメント」 Part 10 ―― 『はやぶさ』の偉業にひと言! 熱いメッセージが65通も!

PICK UP用語

USB

関連記事

volatile

関連記事

Verilog HDL

関連記事

ニュース 一覧を見る

RS ComponentsがPCB設計ツールを無償配布,設計技術者向けのコミュニティ・サイトも開設

東京エレクトロン デバイス,学生向け組み込みアプリ開発コンテスト「Device2Cloud」を開催

ヒューマンデータ,Xilinx Virtex-5を搭載したFPGAボードを発売

MECHATROLINK協会がMECHATROLINK-III対応のスレーブLSIを600円で発売

Analog Devices,JESD204Aシリアル・インターフェース規格に対応した14ビットA-Dコンバータを発売

Tech Villageブログ

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

【ETロボコン】 3rd ET-West Cup

2010年6月20日

Hamana Project

ママチャリ12時間耐久レース(1)

2010年8月25日

組込マーに仲間入り! ~SSEST実行委員会

いよいよ競技会!

2010年9月 1日