SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案
本文目的在于分享一下把DPI稿能用了的过程,主要说一下平台其他部分搭建好之后,在完成DPI相关工作阶段遇到的问题,以及解决的办法。
工作环境:win10 64bit, Questasim 10.1b
首先,ref_model中导入C代码,同时将C代码放在相同与ref_model相同目录下
import "DPI-C" context function void huffman(input int datain[256], output int dataout[35][32]);
C代码中添加include
#include "svdpi.h"
之后开始,RTL代码+验证平台代码编译通过,图形界面点仿真,报错
Can't locate a C compiler for compilation of DPI export tasks/functions
Null foreign function pointer encountered when calling 'huffman#_mti_copy_op
Failed to find user specified function 'huffman' in DPI C/C++ source files.
以上几个错误,每一行是一个错误,不是在同一次出现。
因为SV绿皮书上没有提到需要额外的gcc编译器作为支持,所以开始没想到是缺少东西,以为是调用格式错误,搜索各种资料,在这个过程中发现可能是因为缺少编译器支持C的编译,想来也对,questasim应该是不可能原生支持C的编译的。
之后下载了编译器【附地址:http://vdisk.weibo.com/s/Cg59vH6N6n5EG】,解压后直接放在Questasim的安装目录即可。
理论上讲,这个时候应该就能用了,但是questasim中一仿真,还是会出错,没办法,又开始找问题。
这个过程中想到了软件自带的例子可能会有这方面的示例,于是到【D:\questasim_10.1b\examples\systemverilog\dpi】目录下找到了几个例子,之后在Questasim的命令行里do run.do运行了下给的例子,发现可以运行通过,没有报错,这说明,此时我的电脑中,使用DPI所需的东西肯定是全的,那么我的代码跑不过就一定是出在了运行的方式上。
于是尝试修改run.do文件来用命令行运行我的代码(之前都是在GUI中鼠标点击编译运行,问题可能就出在编译和仿真的时候的选项不同),在尝试的时候遇到新的问题, 因为RTL是用VHDL写的,而vlog是无法编译的,搜了一下知道,要用vcom来编译VHDL。
这之后还经历了非常诡异的问题,就是我的BaseClass.sv每次在vlog编译之后都一定会被修改,变成如下的代码,BaseClass原来的内容不翼而飞了,如下
/* MTI_DPI */
/*
* Copyright 2002-2012 Mentor Graphics Corporation.
*
* Note:
* This file is automatically generated.
* Please do not edit this file - you will lose your edits.
*
* Settings when this file was generated:
* PLATFORM = 'win32'
*/
#ifndef INCLUDED_HEAD
#define INCLUDED_HEAD
#ifdef __cplusplus
#define DPI_LINK_DECL extern "C"
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"
DPI_LINK_DECL DPI_DLLESPEC
void
huffman(
const int* datain,
int* dataout);
#endif
为什么会出现这个问题,一直没搞清楚,并且现在也不出现了,如果有人知道原因,还请告诉我哈,对这个事耿耿于怀。
就这样,几经波折之后,这个问题消失了,用图形界面也可以顺利跑通了。
附上几个有关DPI的地址,有问题没解决的话可以去看一下
https://www.doulos.com/knowhow/sysverilog/tutorial/dpi/
https://en.wikipedia.org/wiki/SystemVerilog_DPI
刚刚又重建了一个project,把整个流程捋顺了一下。
- questasim 新建project,把没有问题的testbench代码导入,包括C代码和我的VHDL代码
- GUI编译,其他正常,只有C代码报错,信息如下
D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c: In function 'huffman':
D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c:41: warning: incompatible implicit declaration of built-in function 'printf'
"D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c", line 41: error:
identifier "printf" is undefined
printf("After weight refresh\n");
^
1 error detected in the compilation of "D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c".
** Error: (sccom-6143) Creation of debug database failed.
- 使用命令行,分别输入下面命令。第一个命令编译VHDL代码,第二个编译SV和C代码
vcom -work work -2002 -explicit -vopt whole_module.vhd
vlog -work work -sv -dpiheader *.sv Huffman_func.c
- 此时Transcript的信息最多只有warning,没有error,但是,实际上vlog之后我的BaseClass.sv已经被改变了,见图

- 这时需要手动将BaseClass代码改回来,保存,无需再编译(这是我比较奇怪的地方,难道是vlog正常编译了BaseClass,之后又把内容换掉了。随后进行了实验,不改BaseClass,也即保持它还是被改过的错的代码,依然能顺利仿真。),之后在GUI中仿真,一切顺利。
经验
有问题及时记录,解决了也及时写下解决方法,不要等所有问题解决再做这件事,一方面,所有问题解决时精力耗费很多,已经不想做了,另一方面,这时距离一些问题出现已经有时间了,可能已经忘了出现过哪些问题以及解决办法了。所以要在问题出现的和解决的时候及时记录,尽可能还原整个大问题的出现和解决的过程,为以后出现类似问题留下足够可参考的经验。
希望会对后面遇到问题的朋友起到帮助。
嗯,酒酱。
SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案的更多相关文章
- SystemVerilog搭建APB_I2C IP 层次化验证平台
一.前言 近期疫情严重,身为社畜的我只能在家中继续钻研技术了.之前写过一篇关于搭建FIFO验证平台的博文,利用SV的OOP特性对FIFO进行初步验证,但有很多不足之处,比如结构不够规范.验证组件类不独 ...
- UART UVM验证平台平台搭建总结
tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...
- 基于简单DUT的UVM验证平台的搭建(一)
最近一个月在实习公司做回归测试,对公司的UVM平台用的比较熟练,就想着自己做一个DUT,然后搭建一个UVM验证平台. 首先,DUT是一个简单的32位的加法器,代码如下:alu.v module add ...
- ( 转)UVM验证方法学之一验证平台
在现代IC设计流程中,当设计人员根据设计规格说明书完成RTL代码之后,验证人员开始验证这些代码(通常称其为DUT,Design Under Test).验证工作主要保证从设计规格说明书到RTL转变的正 ...
- logstash+elasticsearch+kibana快速搭建日志平台
使用logstash+elasticsearch+kibana快速搭建日志平台 日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...
- 大数据Hadoop学习之搭建hadoop平台(2.2)
关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分布式环境,如需要,请参看:大数据Hadoop学习之搭建had ...
- run_test() 验证平台的入口
Run,just run! ——阿甘正传 一个简单的例子: module tb_top; dut u_dut (); initial begin run_test(); end config ...
- UART IP和UVM的验证平台
UART是工程师在开发调试时最常用的工具的,其通信协议简单.opencores 网站提供了兼容16550a的UART IP其基本特性如下: uart16550 is a 16550 compatibl ...
- eclispe搭建android平台
1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...
随机推荐
- ftp服务搭建
文件传输服务 主配置文件目录/etc/vsftpd/vsftpd.conf 首先安装ftp服务器 yum install vsftpd 默认存放文件的目录 /var/ftp/pub 匿名登陆 创建一 ...
- 对JavaScript中变量类型的重新理解
<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...
- windows container (docker) 容器资料笔记
背景 业务需求:简化公司私有云,公有云的部署,尝试寻找更好的,更优化的技术方案替换现有的虚拟机部署方案. 技术背景: .net Docker 学习资料 Docker中文社区: http://www.d ...
- 纯CSS3之五子棋(黑白棋)画法
无聊想用JS写个五子棋玩玩,这边先用CSS3画出了五子棋,感觉挺惊艳的.发上来看看 PS:第一次发博文T-T 此为个人原创. 不多说上图: 代码如下: <!DOCTYPE html> & ...
- ERP库位分布看板(库位管理)
客户正在使用的看板管理,根据厂家需求,做的二次开发. 一:看板效果 二:客户需求 1.客户需求:XX是一家汽车零部件(胶管,硅胶管等)的生产厂家,因此对原料,半成品的有效期有严格的要求. 多次调研得知 ...
- Visual Studio 2017离线安装包,百度云分流
Visual Studio正式版发布了,然而只能在线安装.虽然官方有提供了离线的方法,但还是蛮复杂的,所以我打包了两个版本发布至百度云分享. 离线分流 地址:http://pan.baidu.com/ ...
- Pow(x, n) leetcode
Implement pow(x, n). Subscribe to see which companies asked this question 利用依次消去二进制位上的1,来进行计算 double ...
- express 4
http://www.expressjs.com.cn/4x/api.html#app中间件 路由 模板 跨域 json cookie session
- 摆脱printf的噩梦
众所周知,printf是一个方便.直观.易写.变长参数的打印函数,但它有一个致命的缺陷,如下的语句将导致程序出现严重的运行时错误: printf("%s", 1); 然后程序中断, ...
- 关于struts2中的default-action-ref
struts2中的default-action-ref一般用于,在请求无效或错误时将请求指引到错误页面.我这次的用法是在请求首页之前先发送请求到后台,进行数据获取后再转至首页显示,但是出了一个问题,d ...