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然后选择你的安装包(不需要解压),一直 ...
随机推荐
- Python求解数组重新组合求最小值(优酷)
题目描述:题目:含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如(321,3,32,) 最小数为321323 题目分析: 将数组中所有元素填充到个数相等,填充的数字为最后一位的数字,如 ...
- HTML复习
- mfc---单文档工程添加消息响应
写消息映射:.h中些函数头文件afx_mag … .cpp中写函数体 .cpp中写消息映射 给toolbar添加消息: .h中添加头文件afx_msg …. .cpp中添加函数体,消息映射ON_COM ...
- node环境安装(mac版和windows版)
WINDOWS版本安装 nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-wind ...
- hdoj 1257 DP||贪心
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Java Web(十四) 编写MyBookStore项目的总结
这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了. --WH 一.项目介绍 从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前 ...
- Struts中数据处理
对数据操作的3种方法(把数据保存到域中): 方式1:直接获取servletApi 核心类:ServletActionContext提供的静态方法 /** * 方式1:拿到servletApi,执行操作 ...
- 2020: [Usaco2010 Jan]Buying Feed, II
2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 220 Solved: 162[ ...
- SEO-外部链接类型以及标准
外部链接 外链的作用:宣传你的网站 相信大家都听过"内链为王,外链为皇"这句话,不管这句话对不对,从这句话上面,我们都能体会到外链的重要性. 外链类型: 1.博客 2.论坛 3.分 ...
- SQL一次查出相关类容避免长时间占用表(下)
/* server: db: EDI */ -- 以下案例多次查询同一张表,仅有Name条件不同 --可以使用一次查出相关类容避免长时间占用表 USE EDI GO DECLARE @FileType ...