文章目录
- SystemVerilog DPI概念
- DPI 数据类型映射
- 参数传递和返回值
- DPI 导入函数的分类
- 常用数据类型映射
-
- SV byte -> C char
- SV shortint -> C short int
- SV int -> C int
- SV longint -> C long int
- SV real -> C double
- SV string -> C char*
- SV chandle -> C void*
- SV bit -> C bit
- SV bit[n:0] -> C svBitVecVal
- SV logic -> C svLogic
- SV reg -> C svLogic
- SV logic[n:0] -> C svLogicVecVal
- SV reg[n:0] -> C svLogicVecVal
- SV int[] -> C svOpenArrayHandle
- SV struct -> C struct
- 参考资料
SystemVerilog DPI概念
**Verilog中使用编程语言接口 PLI( Program Language Interface)编程语言接口来和C语言程序交互,它提供了一套C语言函数,**我们可以调用这些集成函数编写软件C程序。RTL代码编译的时候,这些软件C程序也会集成到仿真环境中。
仿真运行后,使用系统任务调用的方式,就可以去访问仿真中的数据结构,也就是说PLI提供一个使得用户自带C函数能够在运行时间访问仿真数据结构的接口。
Accellera在2003年4月发布了包括DPI在内的SystemVerilog 3.1标准,随后在3.1A版本中进一步对DPI进行了加强。systemverilog中使用DPI( Direct Programming Interface),更加简单地连接C、C++或者其他的非Verilog语言。
你只需要使用import语句把C函数导入到,就可以像调用systemverilog的子程序一样来使用它。
使用DPI, 用户无需再像Verilog PLI那样, 事先编写系统任务/函数名称, 然后通过复杂的PLI库间接传递数值回C函数。但是DPI不能直接访问仿真数据结构的内部,这限制了DPI的应用。
SystemVerilog DPI,全称SystemVerilog直接编程接口 (英语:SystemVerilog Direct Programming Interface)是SystemVerilog与其他外来编程语言的接口。
能够使用的语言包括C语言、C++、SystemC等。
直接编程接口由两个层次构成:SystemVerilog层和外来语言层。
两个层次相互分离。对于SystemVerilog方面,另一边使用的编程语言是透明的,但它并不关注这一点。
SystemVerilog和外来语言的编译器各自并不需要分析另一种语言的代码。由于不触及SystemVerilog层,因此支持使用不同的语言。不过,目前SystemVerilog仅为C语言定义了外来语言层。
DPI 数据类型映射
SystemVerilog和C之间的数据交换通常使用DPI-C接口完成,该接口标准化类型对应关系和基本API(另请参见仿真器安装路径下的svdpi.h)。
大多数SystemVerilog数据类型在C语言中具有直接的对应关系,而其他(例如,4值类型,数组)需要DPI-C定义的类型和API。 查看下表完整的数据类型映射关系。
SystemVerilog | C (input ) | C (output ) |
---|---|---|
byte | char | char* |
shortint | short int | short int* |
int | int | int* |
longint | long long int | long int* |
shortreal | float | float* |
real | double | double* |
string | const char* | char** |
string [N] | const char** | char** |
bit | svBit or unsigned char | svBit* or unsigned char* |
Logic, reg | svLogic or unsigned char | svLogic* or unsigned char* |
bit[N:0] | const svBitVecVal* | svBitVecVal* |
reg[N:0], logic[N:0] | const svLogicVecVal* | svLogicVecVal* |
unsized array[] | const svOpenArrayHandle | svOpenArrayHandle |
chandle | const void* | void* |
一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include "svdpi.h"
int add() {
int a = 10, b = 20;
a = a + b;
io_printf("Addition Successful and Result = %d\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n", a);
return a;
}
module tb_dpi;
import "DPI-C" function int add();
import "DPI-C" function int sleep(input int secs);
int j;
initial
begin
$display("Entering in SystemVerilog Initial Block");
#20
j = add();
$display("Value of J = %d", j);
$display("Sleeping for 3 seconds with Unix function");
sleep(3);
$display("Exiting from SystemVerilog Initial Block");
#5 $finish;
end
endmodule
如上面的例子所示,就是这么简单,C代码是C代码,SV代码中只需要使用关键字import将C代码的