我是靠谱客的博主 彩色冬天,最近开发中收集的这篇文章主要介绍Verilog自动例化模块端口的C++程序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

因为要频繁例化模块,而手写很麻烦,所以用C++写了个简单的程序,自动生成例化模块端口。

只需要按照下面的格式将模块端口复制到文件里,双击exe可生成自动例化后的端口,方便快捷!

2019.7.23版本1.0
2019.8.27版本2.0 升级内容:重构程序算法,对输入格式更宽容
1.加入带有parameter的,输出忽略parameter
2.任意一行允许有空格,包括位宽与端口名、端口名之后及逗号之后有无空格都可以
3.加入自动定义输相同的出端口名,并填充输出端口的括号
4.允许有reg定义。

1.0版本被我删掉了,现在看到的是2.0版本的。

 

目录

1.输入

2.输出

3.程序源码


1.输入

需要先把定义的模块端口号copy到一个txt文件auto_ins.txt,输入格式示例,如图1
注意格式。

图1 输入格式示例

2.输出

用dev-c++运行程序,或者直接双击工程目录的exe,会有有个窗口一闪而过,然后就可以打开生成的文件auto_ins_output.txt查看生成的例化文件了。

图2输出结果示例


运行结果:

3.程序源码及可运行exe文件

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;



bool jdg_val(char a)		//判断字符合法性:是否是端口名或者模块名
{
	if((a>='0'&&a<='9')||(a>='A'&&a<='Z')||(a>='a'&&a<='z')||(a=='_'))
		return true;
	else
		return false;
}

int main() 
{
	string curr_line;
	char str_arr[200];				
	int i,k;
	int	position;
	
	ifstream fin;
    fin.open("auto_ins.txt");
    ofstream fout("auto_ins_output.txt");
    while(getline(fin,curr_line))
    {
    	if(curr_line.find("output ")!=curr_line.npos)//找到 
		{
			str_arr[0]='w';str_arr[1]='i';str_arr[2]='r';str_arr[3]='e';str_arr[4]=' ';
			i=5;
			//允许output与端口名之间有多空格
			if(curr_line.find("[")!=curr_line.npos)	//如果有位宽定义,且位宽与端口名之间有无空格都可 
			{
				position= curr_line.find("[");
				while(curr_line[position]!=']')str_arr[i++] = curr_line[position++];
				str_arr[i++]=']';str_arr[i++]=' ';
				position++; 
			}
			else if(curr_line.find(" reg ")!=curr_line.npos)
				position=curr_line.find(" reg ")+5;//有reg定义 
			else
				position=curr_line.find("output ")+7;//没有有位宽定义	
			while(jdg_val(curr_line[position])==false)position++; 
			while(jdg_val(curr_line[position])==true)str_arr[i++] = curr_line[position++];
			str_arr[i]=';';str_arr[i+1]='';
			fout<<str_arr<<endl;
			//cout<<str_arr<<endl;	
			
		}	
    	
	} 
	fin.close();
	
	fin.open("auto_ins.txt");	
	//逐行读取并输出
    while(getline(fin,curr_line))
	{
		if(curr_line.find("module ")!=curr_line.npos)//找到 
		{
			position=curr_line.find("module ")+7;
			//允许module与模块名之间有多空格
			while(jdg_val(curr_line[position])==false)position++; 
			i=0;
			//允许模块名之后有空格
			while(jdg_val(curr_line[position])==true)str_arr[i++] = curr_line[position++];
			str_arr[i]='';
			fout<<str_arr<<' ';
			//cout<<str_arr<<' ';
			str_arr[i]='_';str_arr[i+1]='u';str_arr[i+2]=' ';str_arr[i+3]='(';str_arr[i+4]='';
			fout<<str_arr<<endl;
			//cout<<str_arr<<endl;
		}
		
		if(curr_line.find("input ")!=curr_line.npos)//找到 
		{
			//允许input与端口名之间有多空格
			if(curr_line.find("]")!=curr_line.npos)	//如果有位宽定义,且位宽与端口名之间有无空格都可 
				position= curr_line.find("]")+1;
			else
				position=curr_line.find("input ")+6;//没有有位宽定义
			while(jdg_val(curr_line[position])==false)position++; 
			str_arr[0]='.';
			i=1;
			while(jdg_val(curr_line[position])==true)str_arr[i++] = curr_line[position++];
			str_arr[i]='(';str_arr[i+1]=' ';str_arr[i+2]=')';str_arr[i+3]=',';str_arr[i+4]='';
			fout<<str_arr<<endl;
			//cout<<str_arr<<endl;
		}
		if(curr_line.find("output ")!=curr_line.npos)//找到 
		{
			//允许output与端口名之间有多空格
			if(curr_line.find("]")!=curr_line.npos)	//如果有位宽定义,且位宽与端口名之间有无空格都可 
				position= curr_line.find("]")+1;
			else if(curr_line.find(" reg ")!=curr_line.npos)
				position=curr_line.find(" reg ")+5;//有reg定义 
			else
				position=curr_line.find("output ")+7;//没有位宽定义
			while(jdg_val(curr_line[position])==false)position++; 
			str_arr[0]='.';
			i=1;
			while(jdg_val(curr_line[position])==true)str_arr[i++] = curr_line[position++];
			
			k=i-1;
			str_arr[i++]='(';
			for(int j=1;j<=k;j++)
				str_arr[i++]=str_arr[j];
				
			str_arr[i++]=')';
			if(curr_line.find(",")!=curr_line.npos)//最后一行没有逗号 
				str_arr[i++]=',';
			str_arr[i++]='';
			fout<<str_arr<<endl;
			//cout<<str_arr<<endl;
		}
		
	}
	
	fout<<" );";
	//cout<<" );";	
	fin.close();
	fout.close();
	return 0;
}

链接:https://pan.baidu.com/s/1dYEsu9r6Wld4zVgnUthVmg 
提取码:rdx5 

有什么不对的,或者需要改进的地方请直接留言!

觉得有用的点个赞哈哈~

 

最后

以上就是彩色冬天为你收集整理的Verilog自动例化模块端口的C++程序的全部内容,希望文章能够帮你解决Verilog自动例化模块端口的C++程序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部