systemverilog中的DPI-C用例介绍

news2024/9/22 23:38:18

文章目录

  • 前言
  • 一、dpi_longint
  • 二、dpi_packed_array
  • 三、dpi_structure
  • 四、相关参考
  • 总结


前言

本文主要基于VCS内置的三个关于DPI-C的使用用例,记录一下DPI-C的使用方法。测试用例的路径为$VCS_HOME/doc/examples/testbench/sv/。测试用例包括:dpi_longint,dpi_packed_array,dpi_structure。


一、dpi_longint

这个例子主要介绍,利用DPI-C,在C代码中,修改SV中一个长整型的数据。在SV中,利用DPI-C,将长整型数据,通过指针传递到C函数中,并在C函数中进行修改打印,返回到SV时,数据已经被C修改。

如下为SV代码。

program p1;
	longint i1;
	
	import "DPI" function void mydisplay(inout longint i1);
	initial begin
		i1=64'h1234_5678_9abc_def0;
		$display("SV: i1 is %0h",i1);
		mydisplay(i1);
		$display("SV(after DPI call): i1 is %0h",i1);
	end

endprogram

如下为C代码,函数的参数为指针类型,利用指针实现C代码与SV代码共享内存空间,从而实现C代码中,修改SV代码中的变量。

#include "svdpi.h"
#include "vcsuser.h"

extern "C" {
	void mydisplay(long long *i1) {
		io_printf("C: size of long long is %0d bytes\n",sizeof(long long));
		io_printf("C: i1 is %llx\n",*i1);
		(*i1) = (*i1) * 2;	
		io_printf("C: change i1 to %llx\n",*i1);
		
	}
}

如下为仿真log,可以看到C代码中修改值后,回到SV中,该变量的值也发生了改变。

SV: i1 is 123456789abcdef0
C: size of long long is 8 bytes
C: i1 is 123456789abcdef0
C: change i1 to 2468acf13579bde0
SV(after DPI call): i1 is 2468acf13579bde0

二、dpi_packed_array

这个例子主要演示,将SV中的数组传递给C,并在C中进行使用。

下面为SV代码,对数组a进行初始化并打印,然后将a传递给C。

program p1;
	import "DPI" function void mydisplay(input bit[4:2] a[]);
	bit[4:2] a[8];

	initial begin
		for(int i=0;i<8;i++) a[i]= 15+i;
		for(int i=0;i<8;i++) $display("SV: a[%0d]=%0d",i,a[i]);
		mydisplay(a);
		
	end


endprogram

如下为C代码,利用svOpenArrayHandle接收SV传递过来的数组,通过svLow获取数组的最低索引,通过svHigh获取数组的最高索引,然后通过svGetBitArrElemVec32获取数组里边的值,并循环打印该数组。

#include "vcsuser.h"
#include "svdpi.h"

extern "C" {

	void mydisplay(const svOpenArrayHandle a) {
		
		svBitVec32 c;

		int low = svLow(a,1);
		int high = svHigh(a,1);

		for(int i=low;i<=high;i++) {
			svGetBitArrElemVec32(&c,a,i);
			io_printf("C: a[%d]=%d\n",i,c);
		}
	}
}

如下为仿真结果。

SV: a[0]=7
SV: a[1]=0
SV: a[2]=1
SV: a[3]=2
SV: a[4]=3
SV: a[5]=4
SV: a[6]=5
SV: a[7]=6
C: a[0]=7
C: a[1]=0
C: a[2]=1
C: a[3]=2
C: a[4]=3
C: a[5]=4
C: a[6]=5
C: a[7]=6

三、dpi_structure

这个例子主要演示SV中的结构体,如何通过DPI-C传递到C代码中进行修改。

以下是SV代码,对SV中的结构体初始化打印后,传递给C。

program p1;
	typedef struct {
		int a;
		int b;
	} mystruct;

	import "DPI" function void mydisplay(inout mystruct s1);
	mystruct s1;
	initial begin
		s1.a =10;
		s1.b =20;
		$display("SV: s1.a=%0d,s1.b=%0d",s1.a,s1.b);

		mydisplay(s1);
		$display("SV after DPI call: s1.a=%0d,s1.b=%0d",s1.a,s1.b);
	end 
	
endprogram

以下是C代码,参数传递是结构体指针。

#include "stdio.h"
#include "svdpi.h"

extern "C" {

	typedef struct {
		int a;
		int b;
	}  mystruct;

	void mydisplay(mystruct *s1) {
		int s2;
		printf("C: gets values from SV, s1.a=%d, s1.b=%d\n",s1->a,s1->b);
		s1->a = 100;
		s1->b = 200;
		printf("C: set values,  s1.a=%d, s1.b=%d\n",s1->a,s1->b);
	}	
}

仿真结果如下:

SV: s1.a=10,s1.b=20
C: gets values from SV, s1.a=10, s1.b=20
C: set values,  s1.a=100, s1.b=200
SV after DPI call: s1.a=100,s1.b=200

四、相关参考

SV和C之间的参数索引表
SV和C之间的参数索引表
4状态类型SV与C之间的对应关系
4状态类型SV与C之间的对应关系

C中提供的队列访问函数。
在这里插入图片描述
在这里插入图片描述


总结

本文主要通过VCS自带的三个DPI-C测试用例,记录一下SV中DPI-C的使用方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理:第四十三章 视觉RAG:变革传统深度学习模型开发流程,开创下一代多模态视觉模型的新时代

文章链接:微信公众平台 (qq.com) 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff…

Chaper 09 深入理解Promise

文章目录 前言一、异步编程二、Promise 前言 在JavaScript中&#xff0c;异步编程是一个重要的概念。随着应用程序的复杂性增加&#xff0c;处理异步操作的方式也变得更加复杂。Promise是一种用于处理异步操作的对象&#xff0c;它提供了一种更清晰和更强大的方式来管理异步代…

智能的JavaScript开发工具WebStorm v2024.2全新发布

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具&#xff0c;被广大中国JS开发者誉为"Web前端开发神器""强大的HTML5编辑器""智能的JavaSscript IDE"等。与IntelliJ IDEA同源&#xff0c;继承了IntelliJ IDEA强大的JS部分的功能。 立即获…

学生防近视台灯什么品牌好?学生护眼台灯怎么选?收下这份攻略

根据中国报告大厅的数据&#xff0c;近年来&#xff0c;随着科技的不断进步&#xff0c;台灯行业亦得到了快速发展。早期的台灯主要采用白炽灯作为光源&#xff0c;但随着LED技术的日益成熟&#xff0c;LED台灯已成为市场主流。目前&#xff0c;台灯行业正处于高速发展阶段&…

【吊打面试官系列-Redis面试题】Redis 过期键的删除策略?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 过期键的删除策略】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 过期键的删除策略&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1、定时删除:在设置键的过期时间的同时&#xff0c;创建…

19 - 路径搜索的综合

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 需求2. 一些工具3. 编译规则的依赖4. 实验 1. 需求 工程项目中不希望源码文件夹在编译时被改动&#xff08;只读文件夹&#xff09;在编译时自动创建文件夹&#xff08;build&#xff09;用于存放编译结果编译过程中能够自动搜…

java基本程序设计结构与数据类型

1.一个简单程序的编写、编译与运行 编写如下的Main.java public class Main{public static void main(String[] args){System.out.println("Hello World");} }上面的程序有几个要注意的点&#xff1a; ①public 是访问修饰符&#xff0c;用来表示其他程序对Main类的…

【C++】vector(下)--下篇

个人主页~ vector&#xff08;上&#xff09;~ vector&#xff08;下&#xff09;–上篇~ vector 二、模拟实现3、test.cpptest1test2test3test4test5test6 三、一个难题 二、模拟实现 3、test.cpp test1 这个没啥好说的&#xff0c;就是尾插和迭代器都能正常使用 //测尾…

中国各、省、市、县、乡镇基尼系数数据(2000-2023年)

基尼系数是一个国际上广泛用来综合考察居民内部收入分配差异状况的重要指标。它表示在全部居民收入中&#xff0c;用于进行不平均分配的那部分收入占总收入的百分比。基尼系数的值介于0和1之间&#xff0c;其中0代表收入分配绝对平均&#xff0c;即每个人的收入都相等&#xff…

Qt21基础图形的绘制

基础图形的绘制 paintareapaintarea.hpaintarea.cpp paintexpaintex.hpaintex.cpp main.cpp运行图 paintarea paintarea.h #ifndef PAINTAREA_H #define PAINTAREA_H#include <QWidget> #include <QBrush> #include <QPen> #include <QPainter> #inc…

DZ主题模板 Discuz迪恩淘宝客购物风格商业版模板

Discuz淘宝客网站模板&#xff0c;迪恩淘宝客购物风格商业版模板。 版本支持&#xff1a;discuzx3.0版本,discuzx3.1版本,discuzx3.2版本。 包括网站首页&#xff0c;论坛首页&#xff0c;论坛列表页&#xff0c;论坛内容页&#xff0c;论坛瀑布流,频道列表页&#xff0c;频道…

开学季好物合集有哪些?全方位必备好物推荐

随着秋风轻拂&#xff0c;书页翻新的声音在耳边悄然响起&#xff0c;我们迎来了又一个开学季。在这个特别的时刻&#xff0c;每位学子都怀揣着对未来的无限憧憬&#xff0c;踏入了校园的大门。为了帮助大家更好地适应新学期的学习节奏&#xff0c;享受更加充实而愉快的校园生活…

解决Linux安装epel源提示没有可用安装包

目录 前言 常规方法总结 1、命令直接安装 2、通过网址下载安装 手动安装 1、EPEL的资源地址 2、选择版本 3、找到rpm文件存放位置 4、下载并移动至虚拟机中 5、安装 6、成功后会生成相应的repo文件 7、更新源 前言 EPEL&#xff0c; 即Extra Packages for Enterpri…

STM32开发资料

文章目录 前言一、正点原子&#xff1f;1. 资料链接2.论坛3.参考资料盘 二、野火1. 论坛2. 资料链接 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 学习需要&#xff1a;找一个开发板的资料作为基础 提示&#xff1a;以下是本篇文章正文内容&…

Redis 键值对操作全攻略

文章目录 一 . get 和 set二 . keys *三 . exists四 . del五 . expire六 . ttl七 . Redis 的 key 的过期策略八 . 定时器的实现8.1 基于优先级队列8.2 基于时间轮实现的定时器 九 . type十 . 数据库管理相关命令 Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章…

聊聊客户端/服务器与订阅/发布两大模型

正文 大家好&#xff0c;我是bug菌&#xff5e; 在项目开发中根据不同的应用场景通常会去尝试各种各样的通信方式&#xff0c;可能试来试去可能又回到了原地&#xff0c;而对于一个相对比较大的网络系统&#xff0c;不同的场景得考量不同的通信架构模型&#xff0c;那么今天就跟…

面向对象23种设计模式通俗理解

终点即是起点,自强不息! 设计模式的理解 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 模式&#xff1a;在某些场景下&#xff0c;针对某类问题的某种通用的解决方案。 场景&#xff1a;项目所在的环境 问题&#xff1a;约束条件&#xff0c;项目目标…

慷智serdes调试记录(AIM951-958)

项目使用的是AIM951~958 951和958测试图谱输出 下面是两种1920*1080不同屏幕timing的951图谱输出&#xff08;一般我们提供屏幕timing&#xff0c;然后找慷智FAE要下寄存器配置&#xff0c;他有一个xcel文档&#xff0c;可以自己设置屏幕timing然后得到寄存器设置值&#xff…

Vue 3 Composition API 中如何正确添加表单项副本到数组

在 Vue 3 中&#xff0c;使用 Composition API 时&#xff0c;如果你尝试直接通过引用&#xff08;如 formState&#xff09;来填充 formList 数组&#xff0c;你会遇到一个问题&#xff1a;所有通过 addForm 方法添加的表单项实际上都是对 formState 的同一个引用。这意呀着&a…

K3 给K+增加日志(获取机器名和IP地址)

K3有个外挂系统是K&#xff0c;可以对数据进行修改&#xff0c;但是没有日志功能&#xff0c;谁修改了什么、什么时候修改的不知道&#xff0c;借鉴t_log做一个日志 1、先建一个日志表 CREATE TABLE [dbo].[kplus_log]([FlogID] [int] IDENTITY(1,1) NOT NULL,[FDate] [datet…