本文目的在於分享一下把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中仿真,一切順利。
經驗
有問題及時記錄,解決了也及時寫下解決方法,不要等所有問題解決再做這件事,一方面,所有問題解決時精力耗費很多,已經不想做了,另一方面,這時距離一些問題出現已經有時間了,可能已經忘了出現過哪些問題以及解決辦法了。所以要在問題出現的和解決的時候及時記錄,盡可能還原整個大問題的出現和解決的過程,為以后出現類似問題留下足夠可參考的經驗。
希望會對后面遇到問題的朋友起到幫助。
嗯,酒醬。