基于Questasim的SystemVerilog DPI使用流程

1. 前言

DPI是Direct Programming Interface的缩写,它提供了SystemVerilog与其它编程语言(特别是C语言)交互的接口。它允许编程人员轻松地从SystemVerilog调用C函数,且在C函数也可以调用Systemverilog的函数。

DPI极大地方便了使用现有的C代码,可以使用import “DPI-C”声明从SystemVerilog调用C实现的函数,这样的函数称为导入任务或函数,所有导入的任务或函数都必须声明。在SystemVerilog中实现并通过export "DPI-C"导出的函数或任务可以被C调用,这些任务和函数称为导出任务或函数。其它具体的DPI语法这里不多说,本文讲述在Questasim中如何编译和使用Systemverilog的DPI流程。正确的使用流程如下:

2. 代码举例

举个简单的Questasim DPI例子来演示如何在SystemVerilog和C语言中互相对象对方的函数。

首先,我们需要创建1个C函数,将其放在一个名为"dpi_example.c"的文件中:

#include "dpi_example.h"  
void c_func(int a, int b, int* c) {  *c = a + b;  sv_func();
}

第一行include文件将使用Questasim的vlog自动从根据export/import “DPI-C”内容生成出来的,我们只需要在vlog参数-dpiheader里指定生成文件名为dpi_example.h就好了,当然也可以是其它名字,只要能和c文件里include后的文件名匹配上就行了。第四行的sv_func()在后文中介绍,它是一个SystemVerilog函数,通过export “DPI-C”提供给C函数调用。c_func函数计算了a加b的值,并调用了sv_func函数。

接下来,在SystemVerilog中使用DPI调用C函数。将以下代码放在名为"dpi_example.sv"的文件中:

module dpi_example;  import "DPI-C" context function void c_func(int a, int b, output int c);export "DPI-C" function sv_func;initial begin  int a = 600;  int b = 66;  int c;  c_func(a, b, c);  $display("c_func result: The sum of a(%0d) and b(%0d) is c(%0d)", a, b, c);  end  function void sv_func();$display("sv_func is called by c code");endfunction
endmodule

第2和3行是DPI的关键,import "DPI-C"是将C函数导入到SystemVerilog作用范围内,export "DPI-C" 是将SystemVerilog的函数或任务导出到C的作用范围内。在第8行调用了C函数c_func去计算变量a和变量b的相加,并将结果传递给变量c,第9行将c_func的结果打印出来。这里的sv_func通过export "DPI-C"导出给之前C代码使用。

3. 运行命令

确保工作站下有Questasim和C编译器的license,使用Questasim进行仿真,在terminal中运行以下命令:

步骤一:运行vlog命令生成dpi_example.h头文件

vlog -dpiheader dpi_example.h dpi_example.sv

这个文件定义了C和Questasim之间的接口,用于导出和导入任务和函数。dpi_example.h其实不是必须的文件,但在C代码中包含dpi_example.h可以更快解决由不正确定义的接口引起的问题。创建dpi_example.h的示例命令是:

vlog会自动提取dpi_example.sv中的export/import “DPI-C”内容去生成dpi_example.h头文件,大家生成后可以打开这个文件看看下。

Questasim建议任何export/import “DPI-C”的用户DPI C代码都应该包含在dpi_example.h中,方便C编译器验证C和Questasim之间的接口。

步骤二:运行vlog命令编译C代码

vlog dpi_example.c

可以在vlog命令行中指定c/c++文件,该命令根据传入的文件类型调用正确的c/c++编译器。vlog命令将所有Systemverilog文件和c/c++文件编译到work库中。vsim命令在elaboration阶段自动加载编译好的c代码。可以使用-ccflags选项将指定的C编译器选项传递给vlog,vlog不会检查您用-ccflags指定的选项的有效性。这些选项直接传递给编译器,如果它们无效,则由C编译器生成错误消息。还可以在-f文件中指定c/c++文件和选项,它们将以与-f文件中的Systemverilog文件和选项相同的方式处理。也可以使用-ldflags选项将指定的c/ c++链接器选项传递给vsim,vsim会将指定的选项传递给链接器去解析。

步骤三:开始仿真,运行vsim命令

vsim dpi_example -c -do "run -all; quit"

步骤四:总结以上步骤和运行结果

# 执行命令:
vlib work
vlog -dpiheader dpi_example.h dpi_example.sv
vlog dpi_example.c
vsim dpi_example -c -do "run -all; quit"
# 运行结果:
run -all
sv_func is called by c code
c_func: The sum of a(600) and b(66) is c(666)
quit

4. 其它

额外话题,Questasim支持将外部已经编译好的C代码直接传递给vsim去仿真,不需要vlog再重复编译了。使用以下vsim参数可以将DPI库指定给vsim命令。

参数描述
-sv_lib <name>指定要搜索和使用的库名称。不需要指定文件名扩展名。(Questasim预期的扩展名是:.dll用于Win32/Win64, .so用于所有其他平台。)
-sv_root <name>为shared object指定一个新的前缀,由-sv_lib指定
-sv_liblist <bootstrap_file>指定要使用的"bootstrap file",<bootstrap_file>的格式如下:
#!SV_LIBRARIES
<path>/<to>/<shared>/<library>
<path>/<to>/<another>

shared library上不需要任何扩展。

当仿真器发现imported的task或function时,它会在使用这些参数指定的shared objects集合中查找。例如你可以指定以下的DPI库:

vsim -sv_lib dpiapp1 -sv_lib dpiapp2 -sv_lib dpiappn top

另外在PLI/VPI shared object中指定DPI导入的函数和任务是错误。但是DPI导入函数和任务可以调用PLI/VPI代码,前提是使用vsim -gblso以全局可见方式标记PLI/VPI shared object。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习-全连接神经网络-激活函数- [北邮鲁鹏]

文章目录 基础知识为什么需要非线性操作&#xff08;激活函数&#xff09;&#xff1f;激活函数 vs 数据预处理常用的激活函数Sigmoid函数 &#xff08;Logistic函数&#xff09;双曲正切函数&#xff08;Tanh函数&#xff09;线性整流函数&#xff08;ReLU函数&#xff09;Lea…

C【数组】

1.一维数组 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 int main() { // char arr[] "abcdef";//[a][b][c][d][e][f][\0] // //printf("%c\n", arr[3]);//d // int i 0; // int len strlen(arr); // for(i0; i<len; i) // { // p…

机器学习笔记之最优化理论与方法(十)无约束优化问题——共轭梯度法背景介绍

机器学习笔记之最优化理论与方法——共轭梯度法背景介绍 引言背景&#xff1a;共轭梯度法线性共轭梯度法共轭方向共轭VS正交共轭方向法共轭方向法的几何解释 引言 本节将介绍共轭梯度法&#xff0c;并重点介绍共轭方向法的逻辑与几何意义。 背景&#xff1a;共轭梯度法 关于…

Ubuntu 22.04LTS + 深度学习环境安装全流程

一、 CUDA Toolkit 安装 1. 选择需要安装的版本(下载地址) 2. 选择自己的系统版本获取下载地址和安装指令 3. 运行安装指令进行安装 wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run sudo sh cuda_12.2.…

Docker Swarm集群部署

Docker Swarm集群部署 任务平台 3台虚拟机&#xff0c;一台作为manager 节点&#xff0c;另两台作为work节点。 文章目录 Docker Swarm集群部署安装docker配置防火墙开放端口在 manager 节点创建 Swarm 集群创建用于swarm服务的自定义的overlay网络测试跨主机容器通信 安装do…

网上办公系统设计与实现

目录 前言 1问题定义 1.1系统名称 1.2系统背景 1.3系统目标 2 可行性分析 2.1 经济可行性 2.2 技术可行性 2.3 操作可行性 2.4 法律可行性 2.5 可行性研究结论 2.6 用户组织机构图 2.7 目标系统业务流程图 2.8 接口设计 2.8.1外部接口 2.8.2 内部接口 3 需求分…

Centos7.9 一键脚本部署 LibreNMS 网络监控系统

前言&#xff1a; LibreNMS 是个以 PHP/MySQL 为基底的自动探索网络监控系统 LibreNMS 官网 版本23.8.2-52-g7bbe0a2 - Thu Sep 14 2023 22:33:23 GMT0700数据库纲要2023_09_01_084057_application_new_defaults (259)Web 服务器nginx/1.20.1PHP8.1.23Python3.6.8DatabaseMa…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

PhpStorm 2023年下载、安装教程和好用插件,保姆级教程

PhpStorm 2023年下载、安装教程和好用插件&#xff0c;保姆级教程 文章目录 PhpStorm 2023年下载、安装教程和好用插件&#xff0c;保姆级教程前言一、安装PhpStorm二、好用的插件简体中文包Chinese(Simplified)Language Pack 三、卸载插件CTRLN 查找类CTRLSHIFTN 全局搜索文件…

Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中

本文介绍在Visual Studio软件中&#xff0c;复制一个已有的、配置过多种第三方库的C项目&#xff0c;将其拷贝为一个新的项目&#xff0c;同时使得新项目可以直接使用原有项目中配置好的各类**C**配置、第三方库等的方法。 在撰写C 代码时&#xff0c;如果需要用到他人撰写的第…

Linux学习第16天:Linux设备树下的LED驱动开发:举一反三 专注专心专业

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在开题之前&#xff0c;先说一下这次的题目&#xff0c;尤其是后面的“举一反三 专注专心专业”到底想给大家传递什么信息。LED驱动开发&#xff0c;目前为止已经…

深入思考redis面经

1 redission分布式锁 1.1 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的 答&#xff1a;主要是为了抗住高并发问题&#xff0c;解决redis的缓存击穿问题&#xff0c;但是也能解决一定…

Vue系列之入门篇

前言&#xff1a; 目录 一&#xff0c;关于Vue的简介 1.什么是Vue&#xff1f; 2.使用Vue框架的好处&#xff1f; 3. 库和框架的区别&#xff1a; 4. MVVM的介绍 5.Vue的入门案例 二&#xff0c;Vue的生命周期 一&#xff0c;关于Vue的简介 1.什么是Vue&#xff1f; Vu…

YSA Toon (Anime/Toon Shader)

这是一个Toon着色器/Cel阴影着色器,用于Unity URP 此着色器的目的是使角色或物体阴影实时看起来尽可能接近真实的动画或卡通效果 可以用于游戏,渲染,插图等 着色器特性,如:面的法线平滑、轮廓修复、先进的边缘照明、镜面照明、完全平滑控制 这个文档包括所有的功能https:/…

【数据结构前置知识】初识集合框架和时间,空间复杂度

文章目录 1. 什么是集合框架2. 集合框架的重要性 3. 背后所涉及的数据结构以及算法3.1 什么是数据结构3.2 容器背后对应的数据结构3.3 相关java知识3.4 什么是算法 4.时间复杂度1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 …

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

内网IP端口提供外网连接访问?快解析动态域名与内网映射P2P穿透方案

我们在本地搭建服务器及发布互联网时&#xff0c;可以通过动态域名的方式联网。DDNS原理是用固定的域名代替变化IP&#xff0c;实现局域网发布公网&#xff0c;是适合本地动态IP环境的使用。但当本地没有公网IP时&#xff0c;如果解析绑定到内网IP&#xff0c;将内网IP端口提供…

坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

分享一个印象深刻的线上问题&#xff0c;希望能够给 xdm 带来一点思考 一个稀松平常的工作日&#xff0c;正准备下班的时候&#xff0c;不巧&#xff0c;突发线上紧急问题&#xff0c;心中一万个不情愿&#xff0c;可还是要硬着头皮去定位问题 简单的表象为微服务之间 gRPC通…

Linux:Centos9 《下载-安装》

下载 Download (centos.org)https://www.centos.org/download/ 安装 选择第一个安装centos 根据自己需要的语言环境选择即可 这里选择要安装的磁盘&#xff0c;然后点击完成 这里选择第一个就行带有图形化 然后我们去对这两个进行设置就行 这两个地方自己进行设置就行 耐心等…

Firefox火狐浏览器显示你的连接不安全,是什么意思?

当 Firefox 连接到一个安全的网站时&#xff08;网址最开始为“https://”&#xff09;&#xff0c;它必须确认该网站出具的证书有效且使用足够高的加密强度&#xff0c;以充分保护您的隐私。如果证书无法通过验证&#xff0c;或加密强度过低&#xff0c;Firefox 会中止连接到这…