無償ツールで実践する「ハード・ソフト協調検証」(2) ―― テスト・プログラムはC言語で書く

Verification Enginnerの戯言

tag: 半導体

技術解説 2009年12月11日

4.C言語でテスト・プログラムを書いてみる

 C言語によるテスト・プログラムの例を実際のコードを示しながら説明していきます.この例では,SystemVerilogコード内のメモリにC言語コードからアクセスするという非常に簡単なものです.

 リスト1(a)にSystemVerilogコードを,リスト1(b)にC言語コードを示します.リスト1(a)のSystemVerilogコードでは,一つの連想メモリを定義しています.このメモリは符号なしのbyte型を持ち,サイズはint型です.この連想メモリへのアクセスは,SystemVerilogコード内の二つのタスク(read_mem_bus,write_mem_bus)によって行います.

 

リスト1 SystemVerilogコード内のメモリにC言語コードからアクセスする
(a) SystemVerilogコード

module test;

    import "DPI-C" task c_main();

    initial begin
        c_main();  

        $finish(2);
    end  

//------------------------------------------------
// export 関数の宣言
//------------------------------------------------
 
    export "DPI-C" task read_byte_bus = task read_byte;
    export "DPI-C" task write_byte_bus = task write_byte;  

//------------------------------------------------
// メモリ
//------------------------------------------------

    byte unsigned memory[int];  

//------------------------------------------------
// export 関数の定義
//------------------------------------------------

    task read_byte( input int unsigned addr, inout byte unsigned data );
        data = memory[addr];  

        $display("read_byte : addr = 0x%08h, data = 0x%02h", addr, data );
    endtask : read_byte  

    task write_byte( input int unsigned addr, input byte unsigned data );
        $display("write_word : addr = 0x%08h, data = 0x%02h", addr, data );
        memory[addr] = data;  

    endtask : write_byte

endmodule : test

 

(b) C言語コード

#include <stdio.h>

void write_byte_bus( unsigned int addr, unsigned char data );

void read_byte_bus( unsigned int addr, unsigned char *data );

int c_main( void )
{
    unsigned int addr;
    unsigned char b_data, b_exp;

    addr = 0x2000;
    b_data = 0xde;

    write_byte_bus( addr, b_data );
    read_byte_bus( addr, &b_exp );
    if( b_data != b_exp )
        printf("compare error, BYTE : addr = 0x%08x, data = 0x%02x/0x%02x\n",
                                               addr, b_data, b_exp );
    return 0;
}


 

 図3にSystemVerilogコードとC言語コードの関係を示します.図3の左側がSystemVerilogコードで,右側がC言語コードになります.シミュレーションを開始すると,SystemVerilogコードのtestモジュール内のinitial文でC言語コードのc_main関数を呼び出します.そして,呼び出されたC言語コードのc_main関数の中でwrite_byte_bus関数およびread_byte_bus関数を呼び出すことで,SystemVerilogコードのwrire_byte_busタスクとread_byte_busタスクを呼び出します.c_main関数が終了すると,SystemVerilogコードに移行し,$finish(2)を実行してシミュレーションが終了します.

 



図3 SystemVerilogコードとC言語コードの関係

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! 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日