基于Questasim的SystemVerilog DPI使用流程

news2025/1/15 17:28:12

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.coloradmin.cn/o/1016556.html

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

相关文章

SpaceX预计到2022年Starlink用户将达到2000万,但最终达到了100万

SpaceX的Starlink部门还没有接近实现客户和收入的预测&#xff0c;该公司在建立卫星网络之前与投资者分享了这一点华尔街日报报道今天出版。 据报道&#xff0c;2015年的一份题为“SpaceX用来从投资者那里筹集资金”的报告预计&#xff0c;到2022年&#xff0c;Starlink的订户…

Linux安装RocketMQ

又又又....Linux裝RocketMQ。 vim命令找不到 rootlocalhost ~]# sudo vim sudo: vim&#xff1a;找不到命令 [rootlocalhost ~]# sudo yum install vim 已加载插件&#xff1a;fastestmirrorFile contains no section headers. file: file:///etc/yum.repos.d/mysql-communit…

Linux网络配置:最佳指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CSS核心使用

CSS核心使用 box-sizingbox-shdowtext-shadowpositionwriting-mode box-sizing 定义计算一个元素的总高度和总宽度. 属性值 content-box 默认值,width 内容宽度,height内容的高度border-box 宽度和高度包含内容,内边距和边框 widthborderpadding内容宽度, heightborderpaddi…

嵌入式:驱动开发 Day4

作业&#xff1a;通过字符设备驱动分步注册方式编写LED驱动&#xff0c;完成设备文件和设备的绑定 驱动程序&#xff1a;myled.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <l…

软件设计模式系列之七——原型模式

1 模式的定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新对象&#xff0c;而不是使用构造函数。原型模式将对象的创建委托给原型对象&#xff0c;通过克隆&#xff08;复制&#xff09;来生成新…

大数据Flink(八十二):SQL语法的DDL:Create 子句

文章目录 SQL语法的DDL:Create 子句 一、建表语句

蓝桥杯打卡Day10

文章目录 最长ZigZag子序列最小面积子矩阵 一、最长ZigZag子序列IO链接 本题思路&#xff1a;本题是一道dp问题&#xff0c; 集合划分:只有一个a[i]或者倒数第二个元素是第j个数字并且需要是下降得到a[j]:g[j]1,状态计算f[i]max(f[i],g[j]1),这是第一种情况&#xff0c;还有一…

许可分析 license分析 第十四章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的软件定义&#xff1a;采用软件定…

Kotlin File FileTreeWalk walkTopDown onEnter onLeave

Kotlin File FileTreeWalk walkTopDown onEnter onLeave Python遍历文件目录os.walk_for subfolder in subfolders: print(foldername/_zhangphil的博客-CSDN博客import osfor folderName, subfolders, filenames in os.walk(rD:\code\vs_code): print(当前文件夹: folderName…

【Java 基础篇】深入理解Java递归:从小白到专家

在编程世界中&#xff0c;递归是一个经常被提及的概念。但对于初学者来说&#xff0c;它可能会感到有点神秘和复杂。本文将深入探讨Java中的递归&#xff0c;从基础概念开始&#xff0c;逐步深入&#xff0c;帮助你理解这个强大的编程工具。 什么是递归&#xff1f; 递归是一…

进程,线程,并发相关入门

进程与线程的简单理解 进程是一个独立的执行单元&#xff0c;它拥有自己的内存空间、文件句柄和系统资源.进程是操作系统层面的,每个应用运行就是一个进程.进程之间通常是隔离的&#xff0c;它们不能直接访问对方的内存空间&#xff0c;必须通过进程间通信&#xff08;IPC&…

java微服务项目整合skywalking链路追踪框架

skywalking官网网址&#xff1a;Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking&#xff0c;本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…

Java中代理的实现方式

Java中代理的实现方式 1. 静态代理2. JDK动态代理3. CGLIB动态代理扩展 在Java中&#xff0c;有多种方式可以实现代理&#xff0c;包括&#xff1a; 静态代理&#xff1a; 创建一个代理类&#xff0c;实现与目标类相同的接口或继承与目标类相同的父类。在代理类中持有一个目标类…

6.2、Flink数据写入到Kafka

目录 1、添加POM依赖 2、API使用说明 3、序列化器 3.1 使用预定义的序列化器 3.2 使用自定义的序列化器 4、容错保证级别 4.1 至少一次 的配置 4.2 精确一次 的配置 5、这是一个完整的入门案例 1、添加POM依赖 Apache Flink 集成了通用的 Kafka 连接器&#xff0c;使…

Python:函数调用的实参

相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html 调用就是附带可能为空的一系列参数来执行一个可调用对象 &#xff08;例如函数&#xff09;&#xff0c;它的语法的BNF范式如下所示&#xff0c;有关BNF范式的规则&#xff0c;可以参考之前…

无涯教程-JavaScript - CEILING.MATH函数

描述 CEILING.MATH函数将数字四舍五入到最接近的整数或最接近的有效倍数。 Excel CEILING.MATH函数是Excel中的十五个舍入函数之一。 语法 CEILING.MATH (number, [significance], [mode])争论 Argument描述Required/OptionalNumberNumber must be less than 9.99E307 and …

运维自动化:提高效率的秘诀

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

从一到无穷大 #16 ByteSeries,思考内存时序数据库的必要性

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 在[3]中我基于Gorilla讨论了时序数据库设置cache的可行性&#xff0c;最后得出结论&…

许可分析 license分析 第十章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证供应商管理&#xff1a;评估和管理…