【DPI-C】ModelSim AEでDPI-Cの実行テスト

DPI-CとはSystemVerilogのシミュレーションで使用可能な機能で、C言語の関数をSystemVerilogのfunctionやtaskとして扱うことができる方法です。逆にSystemVerilogのfunctionやtaskをC言語側で使用可能でもあるそうです。

前々から興味はあったのですが、今回少しずつ使い方を調べていくことにしました。

DPI-Cについて

以下ページの紹介が分かりやすいです。

無償ツールで実践する「ハード・ソフト協調検証」(1) ―― SystemVerilogのDPI-C機能

実行環境

  • Windows 10 64bit
  • ModelSim Altera Starter Edition 10.4b
  • 今回確認すること

  • DPI-Cコンパイル方法
  • SystemVerilogからC言語関数を呼び出す
  • C言語関数からSystemVerilogのtaskを呼び出す
  • ソースコード

    svファイル

    `timescale 1ns / 1ps
        
    module sv_test_top;
        
        // SystemVerilogでの標準出力task
        task sv_task();
            $display("Hello World from sv_task!\n");
        endtask
    
        // CからSystemVerilogのtask呼び出し用export
        export "DPI-C" task sv_task;
    
        // SystemVerilogからCの関数呼び出し用import
        import "DPI-C" context task c_from_sv_task();
        import "DPI-C" context task c_function();
    
        // C で書かれた関数を呼び出す
        initial begin
            c_function();
            c_from_sv_task();   // C言語経由でsv_taskを呼び出す
        end
    
    endmodule

    cファイル

    #include "svdpi.h"      // DPI-C用ヘッダ
    #include "dpiheader.h"  // SystemVerilogで定義されたタスクが定義される
    #include 
    
    // SystemVerilogへimportされるC関数を実装する
    int c_function()
    {
        printf("Hello World from C Function!\n");
    
        return 0;
    }
    
    int c_from_sv_task()
    {
        sv_task(); // SystemVerilogからexportされたタスクを実行
    
        return 0;
    }

    doファイル(ファイル名:sim.do)

    vlib work
    vlog -dpiheader dpiheader.h test.sv
    vlog test.sv test.c
    vsim -batch work.sv_test_top -do "run -all"

    シミュレーション実行

    ModelSimのプロジェクト作成や使用方法の説明は割愛します。

    シミュレーションの実行方法は、ModelsimのTranscript Viewで”do sim.do”を入力してEnter。
    各ファイルがコンパイルされるほか、DPI-C用のライブラリも自動で生成してくれます。

    以下が実行結果です。SystemVerilogのシミュレーション上にて、C言語関数によるprintfと、C言語関数を経由したSystemVerilog taskの$displayのそれぞれが出力されていることが分かります。

    dpi-c printf display

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする