verilog DPI
SystemVerilog DPI
目次
- DPIとは
- 簡単な例
- 試験環境
- それぞれのDPI
- modelsim data to vcd dile
http://www.kumikomi.net/archives/2009/12/_1systemverilogdpi-c.php?page=2
DPIとは
DPIはDirect Program Interface. SystemVerilog IEEE 1800-2005で "DPI-C" として定義された。VerilogからC Function、CからVerilog Funcrion, Taskを呼び出す仕組み。
簡単な例
modelsim新版での方法、ここではフリー版を使用。
参照 5,6
使用ファイル
- hello.sv
- test.c
手順
- vlog -dpiheader dpi.h hello.sv # .h作成
- vlog hello.sv test.c # 実行ファイル作成
- vsim -c hello -do "run -all;quit" # 実行
内容
// hello.sv `timescale 1ns/10ps module hello; wire a, b: import "DPI-C" context task test(input int a, output int b); initial begin a = 1; b = 0; #3 test(a,b); $display("hello.sv a=%d to b=%d", a,b); $finish; end endmodule
/* test.c */ #include "dpi.h" int test(int a, int *p){ printf("test."); *p = a+1; return 0; }
modelsimの旧手順
Cからdllを作成し、vsimにdllを指定する。
参照7
使用ファイル
- test.c
- $SV_File
中間ファイル
- dpi.h : c用ヘッダーファイル
- cexports.obj : dll用stub オブジェクト
- dpi.o : c部分オブジェクト
- cimports.dll : dll
手順
- vlog $SV_File -dpiheader dpi.h # .h作成
- vsim -dpiexportobj cexports -c tb_top # stub作成
- gcc -c -g test.c -I$INC_PATH -I. -o dpi.o # C部分コンパイル
- gcc -shared -o cimports.dll dpi.o cexports.obj -L$LIB_PATH -lmtipli # リンク
- vsim -c tb_top -sv_lib cimports -do "run -all;quit" # 実行
試験環境
Modelsim フリー版、intel modlesim starter 20.1をCentos7x64 環境で実施。modelsimフリー版が32bit版と言うこともあり、下記pkgのi686版インストールが必要。
- glibc, libgcc, libXext, libXft, libstdc++
i686版導入例)
sudo yum install -y glibc.i686, libgcc.i686
modelsim free版はwindows版もあり。フリー版は3,000 execution lineまでの制限あり。単位詳細不明。
それぞれのDPI
ここではC/C++でBFMを作成し、veirilog と繋ぐ事を目標とする。夢はverilatorとmodelsimを繋ぎ、veritatorの拡張機能として使用する。modelsimしか扱えない暗号化RTLやIP coreをmodelsimで動かし、その他をVerilatorで実行する。
課題は、Verilatorが2値SIMでX,Zを扱えない。veitatorのマルチスレッド機能の有効性確認、veritatorの対応等。
品質確保向けSIMにはベンダ品を使い、機能SIMには用途に応じた使い分けを推奨する。
Data mapping
参照10
function task patameter
参照11
C to Verilog
Verilog to c
Verilog で定義されたFunction への引数にOpenArrayが使えない。OpenArrayは配列の一部で、bit型の様に配列をint 変換できる。
modelsim data to vcd
ref [3]
vcd 作成手順
- vcd file
.vcd - vcd add <instance_path>/*
- run simulation
- quit –sim
vcd to wlf/mdelsim wave data
- vcd2wlf <file.vcd> <file.wlf>
- Exit the current ModelSim session
- File menu -> Open -> file.wlf
新旧DPIビルドフロー
参照4
旧フロー
- DPI ヘッダー作成 from .v
- exportobj作成 from .v
- .dll or .so作成 by gcc
- vsim 実行
新フロー
task
taskはイン・アウトポートをもつ返り値がない、あるいは成功失敗を返す関数。C 。Pascalで言う所のProcedure.
ちなみに、verilogにもFunctionがある。outputが一つだけ、かつ、タイミングを持てないtask()。
例
module sv_task; int x; //task to add two integer numbers. task sum(input int a,b,output int c); c = a+b; endtask initial begin sum(10,5,x); $display("\tValue of x = %0d",x); end endmodule
Function
task()との違い
- タイミング遅延を持てない
- outputが一つだけ
- 内部からtask()を呼べない
- local.variableが無いときだけ、global変数にアクセスできる。
- Funcionはmodule内で定義され、呼ぶ事ができる。
// function definition module simple_function(); function myfunction; input a, b, c, d; begin myfunction = ((a+b) + (c-d)); end endfunction endmodule
module function_calling(a, b, c, d, e, f); input a, b, c, d, e ; output f; wire f; `include "myfunction.v" assign f = (myfunction (a,b,c,d)) ? e :0; endmodule
http://www.asic-world.com/verilog/task_func1.html
参考
[1] https://www.cc.gatech.edu/~hadi/teaching/cs3220/doc/modelsim/ModelSim_Users_Manual_v10.1c.pdf
[2] http://verilog.blog.shinobi.jp/verilog/-verilog-%20modelsim%E3%81%A7dpi%E3%82%92%E4%BD%BF%E3%81%86
[4] https://msyksphinz.hatenablog.com/entry/2015/10/14/000000
[5] https://msyksphinz.hatenablog.com/entry/2015/10/14/000000
[6] https://www.edaboard.com/threads/how-to-run-dpi-in-modelsim.303356/
[7] https://sites.google.com/site/playsystemverilog/testvector/dpi-c
[8] https://www.macnica.co.jp/business/semiconductor/manufacturers/intel/products/7066/ SystemVerilog
[9] https://www.doulos.com/knowhow/sysverilog/tutorial/dpi/ SystemVerilig DPI
[10] https://www.amiq.com/consulting/2019/01/30/how-to-call-c-functions-from-systemverilog-using-dpi-c/ Data mapping
[11] https://www.doulos.com/knowhow/sysverilog/tutorial/dpi/ Function/Task parameter restriction for openarray.