qshinoの日記

Powershell関係と徒然なこと

verilog DPI

SystemVerilog DPI

目次

  1. DPIとは
  2. 簡単な例
  3. 試験環境
  4. それぞれのDPI
  5. 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 作成手順

  1. vcd  file .vcd
  2. vcd add <instance_path>/*
  3. run simulation
  4. quit –sim

vcd to wlf/mdelsim wave data

  1. vcd2wlf  <file.vcd>  <file.wlf>
  2. Exit the current ModelSim session
  3. File menu -> Open -> file.wlf

新旧DPIビルドフロー

参照4

旧フロー

  1. DPI ヘッダー作成 from .v
  2. exportobj作成 from .v
  3. .dll or .so作成 by gcc
  4. vsim 実行

新フロー

  1. vlog?でdpi.h 作成
  2. vlog で実行ファイル生成
  3. 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

https://verificationguide.com/systemverilog/systemverilog-tasks/#:~:text=Tasks%20and%20Functions%20provide%20a,static

Function

task()との違い

  1. タイミング遅延を持てない
  2. outputが一つだけ
  3. 内部からtask()を呼べない
  4. local.variableが無いときだけ、global変数にアクセスできる。
  5. 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

[3] https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd07062010_692.html

[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.