首页
学习
活动
专区
圈层
工具
发布
36 篇文章
1
形式验证与formality基本流程
2
安全地启动sequence
3
【UVM COOKBOOK】Testbench Architecture【二】
4
【UVM COOKBOOK】Testbench Architecture【一】
5
svlib文档翻译(第一至四章)
6
svlib文档翻译(第五章)
7
浅谈便携式激励(PSS)和UVM
8
便携式激励vs形式化vsUVM验证方法在IP块的整个生命周期中的比较分析
9
通过字符串访问generate模块内部的变量
10
Verilog:笔试面试常考易错点整理
11
【源码】手把手教你用Python实现Vivado和ModelSim仿真自动化
12
如何快速生成Verilog代码文件列表?(内附开源C代码)
13
IC工程师的通用技能:文本处理
14
NCVerilog+SimVision+Vivado仿真环境搭建
15
串扰
16
论STA | 数字电路中的串扰
17
STA | 串扰,理论分析
18
低功耗 | UPF + CLP
19
combinational clock gating Vs sequential clock gating
20
Clock Domain Crossing, 跨时钟域检查
21
低功耗 | Glitch Power 分析
22
P&R | 如何在实现全流程中考虑IR-Drop
23
点论 | 组合逻辑环 Combinational loop 知多少
24
UVM的一个简单验证demo
25
systemverilog之Automatic
26
【手把手系列】:芯片设计中的Makefile简明教程
27
“ 一网打尽 ” 二进制、格雷码、独热码编码方式
28
分而治之(Hierarchical Sequences),处理复杂事物的绝对准则
29
断言(assertion),把黑盒变成白盒
30
针对assertion based验证的一些“建议”和“不建议”
31
python脚本练习(5):读写文件步骤
32
python脚本练习(4):正则表达式实例
33
python脚本练习(3):正则表达式实例
34
python脚本练习(2):使用正则表达式的三部曲
35
python脚本练习(1):表格打印
36
VCS门级仿真系列文章之sdf文件和$sdf_annotate

如何快速生成Verilog代码文件列表?(内附开源C代码)

微信公众号:西电通院专用集成电路课程学习 用工具建工程对Verilog进行仿真、综合或者其它操作时,在写脚本的时候常常需要工程中Veriog文件的列表,若工程中.v文件过多,则常常需要手动编写文件列表。本文教给大家用C语言简单写的一个自动生成某个文件夹下所有.v文件列表的方法。 如果你觉得本文对你有帮助,欢迎转发分享或赞赏

使用说明

环境:Windows 7操作系统或其它常用Windows操作系统 编译器:DEV C++或其它 使用方法:随便找个C语言的编译器,静态编译生成exe文件后,可随意拷贝至某文件夹下,双击运行,等待输出rtl.f文件即可。

使用举例:将生成的exe文件拷贝至C:\modeltech64_10.4目录下,双击运行,如下动图。

生成的rtl.f打开后如下图所示。

另外,该代码提供了一种操作Windows系统路径的操作方法,可以简单修改一下,用作它用。如找到某种类型的文件或某个文件进行拷贝、转移、修改、删除等操作。

源代码

代码语言:javascript
复制
#include <stdio.h>
#include <windows.h>
#include <unistd.h>
#include <math.h>        
#include <time.h>             
#include <string.h> 

#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<count_file;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文件列举出来。

下一篇
举报
领券