華文網

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的編譯的。

理論上講,這個時候應該就能用了,但是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的位址,有問題沒解決的話可以去看一下

剛剛又重建了一個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中模擬,一切順利。

經驗

有問題及時記錄,解決了也及時寫下解決方法,不要等所有問題解決再做這件事,一方面,所有問題解決時精力耗費很多,已經不想做了,另一方面,這時距離一些問題出現已經有時間了,可能已經忘了出現過哪些問題以及解決辦法了。所以要在問題出現的和解決的時候及時記錄,盡可能還原整個大問題的出現和解決的過程,為以後出現類似問題留下足夠可參考的經驗。

希望會對後面遇到問題的朋友起到幫助。

嗯,酒醬。

盡可能還原整個大問題的出現和解決的過程,為以後出現類似問題留下足夠可參考的經驗。

希望會對後面遇到問題的朋友起到幫助。

嗯,酒醬。