芯片验证 | 理解SystemVerilog DPI并不难

本文详细介绍了SystemVerilogDirectProgrammingInterface(DPI)的概念,包括如何从C语言导入函数和任务到SystemVerilog,以及如何在两者间进行数据交换。还讨论了不同类型的C函数(纯函数、context函数和通用C函数)及其使用规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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代码的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值