無償ツールで実践する「ハード・ソフト協調検証」(3) ―― Avalonインターフェースと検証用モデル

Verification Enginnerの戯言

tag: 半導体

技術解説 2009年12月21日

無償のSystemVerilog対応シミュレータと無償のFPGA用オンチップ・バス・モデルを用いて,ハードウェア・ソフトウェア協調検証の一手法について解説する連載の第3回である.今回はC言語によるテスト・プログラムの例(PCIバス)と,本連載の中で使用するAltera社の開発ツール,およびAvalonインターフェースの概要を説明する.本連載では,Avalonインターフェースの検証用バス・ファンクショナル・モデル(Avalon BFM)を利用して,Avalonインターフェース対応のIPコアを検証できる環境を構築する.(編集部)

技術解説シリーズ「無償ツールで実践する『ハード・ソフト協調検証』」
第1回 SystemVerilogのDPI-C機能
第2回 テスト・プログラムはC言語で書く 

 

5.バス・レベル検証における活用事例

 ここまでで,DPI-Cを利用したC言語によるテスト・プログラムの作成の基本について説明しました.ここからは,バス・レベルの検証環境におけるC言語によるテスト・プログラムを,図4のようなPCI バス・レベルの検証環境を例に説明します.



図4 PCIバス・レベルの検証環境

 

 リスト3にPCIバス・レベルのテスト・プログラムの例を示します.テスト・プログラムは,moduleではなくprogramを使って記述しています.programを使うことにより,DUT(実装コード)とのレース状態を回避することができます(なお,本連載で使用するModelSim Altera Edition Starterはprogram記述をサポートしていない).

 

リスト3 PCIバス・レベルのテスト・プログラムの例

program pci_cpu( pci_interface bus, input logic CLK, input logic RST );

    bit [31:0] addr, data, exp;
    int size;

    initial begin

        addr = 32'h0000_1000;
        size = 4;
        exp = 32'h0011_2233;

        bus.write_mem( addr, size, exp );
        bus.read_mem( addr, size, data );

        if( data != exp )
            $display("compare error (exp:0x%08h) != data(0x%08h)", exp, data);
    end

endprogram : pci_cpu
 

 

 programでは,moduleとは違ってalways文を使用することはできないので,initial文内にテスト・プログラムを記述します.program内では複数個のinitial文を記述できますが,動作を理解しやすくするために一つのinitial文のみを使用することをお勧めします.

 リスト3では,アドレス(32'h0000_1000)に4バイトでデータ(32'h0011_2233)をライトし,同じアドレスから4バイトのデータをリードし,比較しています.この例をDPI-Cを使って書き直すと,リスト4(a)のようになります.連載第2回のリスト1(a)で示したように,import宣言でC言語コードの関数の宣言を行っています.C言語コード内でSystemVerilogコードのtaskを呼ぶので,import宣言はtaskになります.export宣言ではC言語コード内で使用するtask(write_mem_bus,read_mem_bus)を宣言しています.

 initial文では,C言語コードの関数(c_main)を呼び出すだけです.export宣言したwrite_mem_bus,およびread_mem_busはリスト4(a)と同じように,バス・インターフェース(bus)へのアクセス関数を呼び出すだけです.ただし,引き数のaddrとdataは32 ビットのbit 型からint 型に変更しました.リスト4(b)にC 言語コードを示します.

 

リスト4 リスト3の内容をDPI-Cを使って書き直したもの

(a) SystemVerilogコード

program pci_cpu( pci_interface bus, input logic CLK, input logic RST );

    import "DPI-C" task c_main();

    export "DPI-C" task write_mem_bus;
    export "DPI-C" task read_mem_bus;

    initial begin

        c_main;

    end

    task write_mem_bus( input int addr, input int size, input int data );
        bus.write_mem( addr, size, data );
    endtask : write_mem_bus

    task read_mem_bus( input int addr, input int size, output int data );
        bus.read_mem( addr, size, data );
    endtask : read_mem_bus

endprogram : pci_cpu

 

(b)  C 言語コード

#include <stdio.h>
#include "sv_export.h"

int c_main()
{
    int addr, data, exp;
    int size;

    addr = 0x00001000;
    size = 4;
    exp = 0x00112233;

    write_mem_bus( addr, size, exp );
    read_mem_bus( addr, size, &data );

    if( data != exp )
        printf("compare error (exp:0x%08x) != data(0x%08x)", exp, data);

    return 0;
}

 

 c_main関数内では,リスト4(a)のSystemVerilogコードと同じようにアドレス(0x00001000)に4バイトでデータ(0x00112233)をライトし,同じアドレスから4バイトのデータをリードし,比較しています.DPI-Cを使うと,このようにSystemVerilogコードとC言語コード,すなわち2種類のコードが必要になります.

 しかし,テスト・プログラムの内容を変更しても,SystemVerilogコードを変更する必要はありません.変更するのはC言語コードのみです.C言語コードはシミュレーション実行時にロードするので,シミュレーションごとにSystemVerilogコードのコンパイル,およびエラボレーションを実行する必要はありません.C言語コードにラッパ関数を使った場合のコードをリスト5(a)~リスト5(c)に示します.

 

リスト5 C言語コードにラッパ関数を使った場合のコード

(a) ラッパ関数の定義ファイル(sv_wrapper.h)

#include "sv_export.h"
    void write_mem( int addr, int size, int data )
    {
        write_mem_bus( addr, size, data );
    }
    int read_mem( int addr, int size )
    {
        int data

        read_mem_bus( addr, size, &data );
        return data;
    }


(b) ラッパ関数のヘッダ・ファイル(sv_wrapper.c)
void write_mem( int addr, int size, int data );
int read_mem( int addr, int size, int &data );

(c) ラッパ関数を用いたC言語コード

#include <stdio.h>
#include "sv_wrapper.h" // ラッパ関数のヘッダ・ファイル

int c_main()
{
    int addr, data, exp;
    int size;

    addr = 0x00001000;
    size = 4;
    exp = 0x00112233;

    write_mem( addr, size, exp );
    data = read_mem( addr, size );

    if( data != exp )
        printf("compare error (exp:0x%08x) != data(0x%08x)", exp, data);
    return 0;
}

 

 次節以降では,Altera社が提供している開発ツール「SOPC Builder」の中で利用できるAvalonインターフェースのBFM(検証用のバス・ファンクショナル・モデル)について,DPI-Cを使ってC言語からテスト・プログラムを利用する方法を紹介します.まずは,SOPC Builder,Avalonインターフェース,Avalon BFMについて説明します.

組み込みキャッチアップ

お知らせ 一覧を見る

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