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

関連記事

書籍

SystemVerilog設計スタートアップ

第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追加)

A SystemVerilog DPI Framework for Reusable Transaction Level Testing, Debug and Analysis of SoC Designs

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ファイル)