本文目的在于分享一下把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中仿真,一切顺利。
经验
有问题及时记录,解决了也及时写下解决方法,不要等所有问题解决再做这件事,一方面,所有问题解决时精力耗费很多,已经不想做了,另一方面,这时距离一些问题出现已经有时间了,可能已经忘了出现过哪些问题以及解决办法了。所以要在问题出现的和解决的时候及时记录,尽可能还原整个大问题的出现和解决的过程,为以后出现类似问题留下足够可参考的经验。
希望会对后面遇到问题的朋友起到帮助。
嗯,酒酱。