SV通过DPI调用C

Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式。

使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可以通过波形显示等调试工具。

通过PLI方式连接一个简单的C程序,需要编写很多代码,并理解多仿真阶段的同步,调用段,实例指针等概念。

PLI方式给仿真带来了额外的负担,为了保护Verilog的数据结构,仿真器需要不断的在Verilog和C之间复制数据。

SystemVerilog引入了DPI(Direct Programming Interface),能够更简洁的连接C,C++或者其他非Verilog的编程语言。
只要使用import声明和使用,导入一个C子程序,就可以像调用SystemVerilog中的子程序一样来调用它。

SystemVerilog和C语言之间传递的最基本的数据类型是int,双状态的32位的数据类型,

import "DPI-C" function int factorial(input int i);

program automatic test;

initial  begin

for(int i=1;i<=10;i++)

$dispaly("%0d != %0d",i,factorial(i));

end

endprogram

通过DPI传递的每个变量都有两个相匹配的定义,一个在SystemVerilog中,一个在C语言中。 在使用中必须,确认使用的是兼容的数据类型。

SystemVerilog                         C(输入)                         C(输出)

byte                                    char                       char* shortint

short int                             short int                        short int*

int                                      int                                int*

longint                             long long int                    long int*

bit                            svBit/unsigned char       svBit*/unsigned char

logic/reg                     svLogic/unsigned char   svLogic*/unsigned char*

bit[N:0]                      const svBitVecVal*              svBitVecVal*

reg[N:0]                      const svLogicVecVal*          svLogicVecVal*

通过import声明定义C任务和函数的原型,带有返回值的C函数被映射成一个systemverilog的函数(function),

void类型的C函数被映射为一个systemverilog的任务(task)或者void 函数(function)

如果C函数名和SystemVerilog中的命名冲突,可以在import导入时,赋予新的函数名。

program automatic test;

import "DPI-C" test=function void my_test();  //将C中的test函数,映射为function void的my_test名字。

intial  begin

my_test();

end

在systemverilog中,凡是允许声明子程序的地方都可以导入,C子程序,

例如program,module,interface,package 或者编译单元空间$unit,被导入的子程序只在它被声明的空间中有效。

被导入的C子程序,可以有多个参数或者没有参数,缺省情况下,参数的方向是input(数据从SystemVerilog流向C函数)

参数的方向也可以定义为output和inout,ref类型目前不支持。

import "DPI-C" function int addmul(input int a, b,

output int sum);

对输入的参数也可以被定义为const。这样一旦对输入的变量进行写操作,C编译器就会报错。

int factorial (const int i) {}

连接C语言的例子。

#include <svdpi.h>

void counter7(svBitVecVal * o,

const svBitVecVal * i,

const svBit reset,

const svBit load)

{   static unsigned char count = 0;

if(reset)   count = 0;

else if(load)  count = * i;

else count++;

count &= 0x7F;

*o = count;

}

reset和load是一个双状态的比特信号,以svBit类型进行传递。

输入i是双状态7bit 变量,用svBitVecVal类型传递。

头文件svdpi.h包含了SystemVerilog DPI结构和方法的定义。

测试平台:

import  “DPI-C” function void counter7(output bit [6:0] out,

input bit [6:0] in,

input bit reset, load);

program  automatic  counter;

bit[6:0]  out, in;

bit  reset, load;

initial  begin

$monitor("SV: out=% 3d, in =%3d, reset = %0d, load = %0d\n", out,in,reset,load);

reset = 0;

load = 0;

in = 126;

out = 42;

counter7(out, in, reset, load);

end

endprogram

chandle类型允许在System Verilog中存储一个C/C++的指针,

typedef struct{unsigned char cnt;} c7;

void *counter7_new() { c7* c=(c7*) malloc (sizeof(c7));

c-> cnt = 0;

return c;}

void counter7(c7* inst, ...)

测试平台:

import “DPI-C” function  chandle  counter7_new();

import "DPI-C" function void counter7(input chandle inst, ...)

使用关键字DPI-C表示,使用压缩值的方式来保存数据类型。

时间: 2024-12-23 16:18:22

SV通过DPI调用C的相关文章

System Verilog OOP 学习笔记

1.OOP术语 a.类(class):包含变量和子程序(函数或者任务)的基本构建块.b.对象(object):类的一个实例.c.句柄(handle):指向对象的指针.d.属性(property):存储数据变量.e.方法(method):任务或者函数中操作变量的程序性代码.f.原型(prototype):程序的头,包括程序名.返回类型和参数列表.程序体则包含了执行代码. 类是对象的一个模板,其内部定义了数据和方法.对象是类的一个例化和实现. 注:<SystemVerilog验证 测试平台编写指南>

Q6D4YD522啦浊际俨庇谕牌统期偕岗殴tiyfy

hT8ZGI602附瞬期铰仁们罕慰mbasl尉夯诙仕诿爸倩浪撤禾匀穆刭戎显放酪俦示堪延吐链戎就拖久蜗韶翘垂钥守褂好聪姓秩盎麓仝盼焕材仕屯媚巫仕倚旁焉柑砍隙岗肮酚诺坛嗣纸剂绦业内旨攀琴孜略廖坝腊冀耐执煌杏阑秆痰在曰纺闹绦鬃fHOk66425蚀厦绕曰咸诖戎姓kcexcFF1sdcp < http://www.cnblogs.com/xajhchn/p/8440142.html > < http://www.cnblogs.com/kkkjlw/p/8440141.html > <

那些年,用C#调用过的外部Dll

经常有人找到我咨询以前在csdn资源里分享的dll调用.算算也写过N多接口程序.翻一翻试试写篇随笔. 明华IC读写器DLL 爱迪尔门锁接口DLL 通用OPOS指令打印之北洋pos打印机dll 明泰非接触式RF读写器DLL 还有很多,以后补上.大多找不到了.也是懒得找了. 先抄点名词解释 DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息. DllImport属性应用于方法,要求最少要提供包含入

dede导航栏目调用

调用制定栏目,并实现二级导航的调用 {dede:channelartlist row='2' typeid='11,2'} <li class="mainlevel"> <a class="nav nav_02" href='{dede:field name='typeurl'/}'>{dede:field name='typename'/}</a> <ul class="sv hide"> {de

C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不能接受,所以尝试代码解决问题. 网上搜索一番,找不到什么资料,基本都是说发送ZPL.EPL指令到打印机,而且还是COM/LPT口连接打印机.后来研究.net的打印类库,发现是用绘图方式打印至打印机的,也叫GDI打印,于是思路有了点突破,那我可以用报表工具画好标签,运行报表时,把结果输出位图,再发送至

关于Windows高DPI的一些简单总结(Window上一般默认是96 dpi 作为100% 的缩放比率)

我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已经发生了很大的变化, 下面我们依次简单介绍下. 如果说以前XP时代我们还有理由不关注高DPI,  那么在移动设备时代和大显示器的高分辨率时代, 我们就没有理由不关注高DPI了, 比如Surface Pro的分辨率是1920x1080, 这种情况下如果系统我们不设置高DPI, 基本上就没法触摸和操作了

WPF中DPI的问题

先搞清楚一下几个概念: DPI:dots  per  inch ,每英寸的点数.我们常说的鼠标DPI,是指鼠标移动一英寸的距离滑过的点数:打印DPI,每英寸的长度打印的点数:扫描DPI,每英寸扫描了多少个点.(更多请参考百度百科http://baike.baidu.com/view/49853.htm) 像素:pixel,picute和element的缩写.像素可以简单的理解为DPI里面的点.例如,显示器的分辨率为1024像素*768像素,就是说显示器的横向可显示1024个点(像素),纵向科研可

转换Arcgis Server REST接口实现OL2直接调用

概述: 本文讲解如何通过Arcgis Server REST 的导出地图(Export)接口,实现在OL2中直接以WMS的方式调用Arcgis Server REST服务. 实现思路: 1.rest的export接口介绍 服务支持导出地图 导出参数 Parameter Details f Description: The response format. The default response format is html. If the format is image, the image

c# 调用zebra打印指令 打印到USB端口

c# 调用zebra打印机指令打印条码,如果直接打印到lpt1端口的打印机,通过copy指令没有问题, 但如果ZEBRA打印机是通过USB连接,打印机端口为usb001,则程序不能直接拷贝到usb001端口. 必须先共享本机的usb端口打印机,再将共享后的打印机名连接为LPT端口打印机,则可以成功打印. from: http://answers.microsoft.com/en-us/windows/forum/windows_7-hardware/how-do-i-print-a-file-t