微信公眾號:西電通院專用集成電路課程學習
用工具建工程對Verilog進行仿真、綜合或者其它操作時,在寫腳本的時候常常需要工程中Veriog文件的列表,若工程中.v文件過多,則常常需要手動編寫文件列表。本文教給大家用C語言簡單寫的一個自動生成某個文件夾下所有.v文件列表的方法。
如果你覺得本文對你有幫助,歡迎轉發分享或讚賞
使用說明
環境:Windows 7操作系統或其它常用Windows操作系統
編譯器:DEV C++或其它
使用方法:隨便找個C語言的編譯器,靜態編譯生成exe文件後,可隨意拷貝至某文件夾下,雙擊運行,等待輸出rtl.f文件即可。
使用舉例:將生成的exe文件拷貝至C:\modeltech64_10.4目錄下,雙擊運行,如下動圖。
![如何快速生成Verilog代碼文件列表?(內附開源C代碼)](http://p2.ttnews.xyz/loading.gif)
生成的rtl.f打開後如下圖所示。
![如何快速生成Verilog代碼文件列表?(內附開源C代碼)](http://p2.ttnews.xyz/loading.gif)
另外,該代碼提供了一種操作Windows系統路徑的操作方法,可以簡單修改一下,用作它用。如找到某種類型的文件或某個文件進行拷貝、轉移、修改、刪除等操作。
源代碼
#include
#include
#include
#include
#include
#include
#define FILE_NUM 50000
#define N 50000
static int count_file=0;
typedef struct
{
int num;
char name[800];
int vtype;
}filetype;
filetype files[FILE_NUM];
BOOL IsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}
void FindInAll(LPCTSTR lpszPath)
{
WIN32_FIND_DATA wfd;
TCHAR szFind[MAX_PATH];
HANDLE hFind;
TCHAR szFile[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind))
lstrcat(szFind, "\");
lstrcat(szFind, "*.*"); // 找所有.v文件
hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果沒有找到或查找失敗
return;
do
{
if (wfd.cFileName[0] == '.')
continue; // 過濾這兩個目錄
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
FindInAll(szFile); // 如果找到的是目錄,則進入此目錄進行遞歸
}
else
{
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
printf("%s\n",szFile);
files[count_file].num=count_file;
strcpy(files[count_file].name,szFile);
count_file = count_file + 1;
//printf("count_file=%d,num=%s\n",count_file, files[count_file-1].name);
// 對文件進行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 關閉查找句柄
}
int main(int argc, char* argv[])
{
FILE *fp1;
int i,j,k;
char buf[800]=" ";
char buf1[800]=" ";
int type=0;
if ((fp1=fopen("rtl.f","w+"))==NULL)
return;
memset(buf,0,800);
memset(buf1,0,800);
memset(files,0,FILE_NUM*sizeof(filetype));
getcwd(buf, sizeof(buf));
printf("current working directory : %s\n", buf);
FindInAll(buf);
for(i=0;i { memset(buf1,0,800); strcpy(buf1,files[i].name); type=0; k=strlen(buf1); //printf("\n k=%d;",k); for(j=0;j<=k;j++) { if((buf1[j]=='.') && ((buf1[j+1]=='v') || (buf1[j+1]=='V')) && (j==k-2)) //if((buf1[j]=='.') && (j==k-2)) { //printf("\n j=%d\n",j); type=1; files[i].vtype=1; fprintf(fp1,"%s\n",files[i].name); } } } getch(); fclose(fp1); return 0; } 版本更新記錄 版本號:V1.1.2 更新日期:2013-07-17 14:46:46 修改代碼,擴展name的長度為800,可以處理長路徑的情況 版本號:V1.1.1 更新日期:2013-05-18 10:55:38 修改代碼,添加判斷語句&& (j==k-2),避免.vhd等文件也被列出來
版本號:V1.1.0
更新日期:2013-02-10
14:49:55 已添加對文件名進行判斷,能夠自動的將當前路徑下的所有文件及子文件夾下的.v文件列舉出來。
全文完。
閱讀更多 網絡交換FPGA 的文章