SystemVerilog DPI-C
半導体ネットで連載しました(2009.12.6-2010.1.29)
ModelSim AE v6.5b Starter Editionを利用して、SystemVerilog DPI-Cにてハード・ソフトの検証環境を構築し、
プログラム(C言語)によるハードウェア検証を行えるようにするものです。
(ModelSim AE v.6.5b Starter Editionは、Altera社のWebサイトにユーザー登録をすることで利用できる無償のSystemVerilogシミュレータです。なお、機能的 には、市販されているModelSimと同じですが、シミュレーション速度やシミュレーションできる規模には制約はあります。)
具体的には、Altera社のSOPC Builderで利用可能なAvalon Verification Modelを使い、
Avalonインターフェースのデザインを検証するというものです。
詳細は、下記の各回の記事を参照してください。
無償ツールで実践する「ハード・ソフト協調検証」(全8回)
第1回 SystemVerilogのDPI-C機能 (2009.12.6)
第2回 テスト・プログラムはC言語で書く (2009.12.11)
第3回 Avalonインターフェースと検証用モデル (2009/12/21)
第4回 SystemVerilog側のDPI-Cの記述を作成する (2009/12/28)
第5回 テスト・プログラムの作成とBFMのコードの生成 (2010/01/05)
第6回 協調シミュレーションを実行する (2010/01/15)
第7回 DMAの割り込み機能を確かめられるようにする (2010/01/20)
第8回 シミュレータやコンパイラの入手方法 (2010/01/29)
前置きとして、
このブログとAll of SystemVerilogの紹介
・無料の環境で新しい検証手法を試せる
・複数言語の併用に起因する問題を解消したSystemVerilog
に続き、次のようなDPI-Cについての説明をしています。
1.DPI-Cは,なぜ重要なのか?
2.DPI-Cとは?
3.DPI-Cのユース・ケース
1) SystemVerilog側からC言語を呼び出す
2) C言語側からSystemVerilogを呼び出す
4.C言語でテスト・プログラムを書いてみる
5.バス・レベル検証における活用事例
6.SOPC Builder
7.Avalonインターフェース
8.Avalon BFM
9.Avalon BFMをC言語のテスト・プログラムから使えるようにする
・dpi_main
・bfm_write32,bfm_write16,bfm_write8
・bfm_read32, bfm_read16, bfm_read8
・bfm_nop
10.テスト・プログラムを書いてみる
・dpi_func.h
・dpi_main.c
11.SOPC Builderを使ってVerilog HDLコードを生成する
12.シミュレーションの準備
13.SystemVerilogコードをコンパイルする
14.C言語プログラムをコンパイルする
15.シミュレーションを行う
16.Nios CPUを使ったときとの比較
17.ライブラリ化する
18.割り込みに対応する
19. 他のBFMに適用する(PCI,PCI Express,AMBAなど)
Appendix A さまざまなタイプのライセンスが用意されているModelSim
Appendix B ModelSim AEにはLinux版がある
Appendix C Windows環境におけるCプログラムのコンパイル方法
=========================================================================
SystemVerilog では、C言語とのインターフェースに DPI-C というものを持っています。
DPI は、Direct Programming Interface の略です。
DPI は、2つのレイヤ(two layer)で構成されています。
1つは SystemVerilog レイヤで、もうひとつは外部言語レイヤ(foreign language layer)です。
外部言語レイヤがC言語(Cレイヤ)のとき、DPI-C と呼びます。
IEEE 1800-2005では、外部言語レイヤとしてCレイヤのみAnnex Fで定義しています。
(他の言語、例えば、C++やJavaも外部言語レイヤとして定義することもできますが、
CレイヤからC++やJavaを呼び出せばいいので、新しい外部言語レイヤを定義する必要はないと思います)
DPIは、taskとfunctionが利用できます。
これら2つは、SystemVerilog レイヤからCレイヤを呼び出す場合とCレイヤからSystemVerilog レイヤを呼び出すことができます。
SystemVerilog レイヤからCレイヤを呼び出す場合をimportと呼びます。
一方、Cレイヤから SystemVerilog レイヤを呼び出す場合をexportと呼びます。
(IEEE 1364、つまり、Verilog HDLでは、PLI:Programming Language InterfaceやVPI:Verilog Procedure Interface)を使うことで
Verilog HDLからC言語の関数を呼び出すことができました。しかしながら、呼び出すために必要な手続きが面倒なため、
簡単には利用できませんでした。また、C言語からVerilog HDLのtaskやfunctionは呼び出すことができません。
DPI-Cを使うことでし、簡単にSystemVerilogからC言語を、そして、C言語からSystemVerilogのtaskやfunctionを呼び出せせます)
importとexportの例
importの時の例、
import "DPI-C" function int c_func( int a, int b );
import "DPI-C" function void void_func( int x, int y);
import "DPI-C" task c_task( int m );
importは、import "DPI-C"で始まります。その後は、function/taskのプロトタイプ宣言をします。
exportの時の例、
export "DPI-C" function sv_func;
export "DPI-C" task sv_func;
exportは、export "DPI-C"で始まります。その後は、function/taskのキーワードと名前だけです。
importと違って、exportでは関数の引数を明記しないのは、SystemVerilog 側にfunction/taskの定義がどこかにあるからです。
C言語の関数名を SystemVerilog で使えなかったり、SystemVerilog のfunction/task名がC言語の関数名が使えなかったりします。
この場合は、C言語の関数名と SystemVerilog のtask/function名のマッピングが可能です。
例えば、
export "DPI-C" c_plus = function \c+ ;
は、SystemVerilog の関数( \c+ )をC言語ではc_plusとする。
(でも、\c+ なんて関数名は付けませんよね!)
import "DPI-C" begin_sv = function void begin;
は、beginは SystemVerilog のキーワードであるので、begin_svに置き換えています。
importのfunctionは、SystemVerilog のfunctionと同様にシミュレーション時間が0で実行されます。
importのfunctionの引数の方向としては、input, output, inoutが指定できます。
2つのタイプ:(pureとcontext)
importのfunctionは、2つのタイプ(pureとcontext)に分類できます。
pureタイプは、functionの処理内容が引数の値にのみ影響を受け、副作用が無いモノです。
一方、contextタイプはfunctionの処理内容が副作用を発生させるものです。
pureタイプのfunctionは最適化し、シミュレーション性能を改善することができます。
一方、taskはcontextタイプのみです。
import "DPI-C" pure function int c_func( int a, int b );
import "DPI-C" context void void_func( int x, int y);
import "DPI-C" context task c_task( int m );
関数の戻り値
importおよびexportのfunctionの戻り値としては、次のような型が指定できます。
・ void, byte, shortint, int, longint, real, shortreal, chandle, string
・ bit および logicのスカラ値
chandleは、C言語のポインタに相当します。
関数の引数
importおよびexportのfunction/taskの引数の型としては、次のようなモノが指定できます。
・ void, byte, shortint, int, longint, real, shortreal, chandle, string
・ bit および logicのスカラ値
・ packed arrays, structs, bitとlogicからなるunions
・ enumeration
・ struct, union, unpacked array, typedef
関連記事
書籍
第5部 SystemVerilogモデリング 編
第11章 DPI-Cを使ってC++モデルを接続する
雑誌
DESIGN WAVE MAGAZINE 2008年11月号(No.132)
C言語テスト・プログラムによるハードウェア検証技法
DPI-Cを活用したハード・ソフト協調検証 ( Amazon.co.jp のカスタマーレビューは、こちら。)
在庫があるのでCQ出版社から購入できます : こちら
CQ出版主催で2009.9.11(金)に開催された「コデザイン&コベリフィケーション・テクノロジ・ワークショップ」の
40分で分かる『SystemVerilogによるハード・ソフト協調検証』
の内容は、上記DESIGN WAVE MAGAZINE 2008年11月号の記事にも一部、掲載しています。
Web
電気回路/HDL/ModelSim XE を使った SystemVerilog DPI-C テスト (2010.5.6追加)
Interfacing With HDL Simulator
Hardware/Software Co-Verification Using the SystemVerilog DPI
[Verilog] ModelSimでDPIを使う (ModelSim AEでDPI-Cを使うときのコンパイル方法があります)
System Verilog DPI Under Winodws using ModelSim (英語PDFファイル)