Verilog代码自动缩进和对齐Perl脚本

实验室做FPGA开发时经常用到Verilog,代码规范成为一个问题,于是乎写了一个Perl脚本对代码进行规范化,主要是进行自动缩进和对齐。

代码原理很简单,主要是使用了正则表达式进行匹配和替换。

代码如下,初学Perl,请读者赐教:

#####################################################
# 代码缩进对齐脚本
# 功能:对Verilog代码进行自动缩进和对齐处理,
#		该版本目前还没有对case语句进行处理
# 更改:增加了对assign的缩进
# 运行环境:perl
# 运行方式:perl code_indent.pl
# 作者:段聪
# 日期:2014/9/16 22:16
#####################################################

my $filename = ‘C:\Users\CvCv\Desktop\Perl_tmp\code.v‘;#输入文件名
my $outfilename = ‘C:\Users\CvCv\Desktop\Perl_tmp\out.v‘;#输出文件名
#----------------------------------------------------------
#测试文件存在
die "文件$filename不存在!\n" unless -e $filename;
#打开文件
open(VFILE,"<",$filename) || die "打开文件失败!\n";
open(OFILE,">",$outfilename) || die "打开文件失败!\n";
#----------------------------------------------------------
#变量定义
$begin_cnt = 0;
$if_cnt = 0;
$autoindent_space = " "x4;#自动缩进的空格数(Tab宽度)
$last_line = "";
$assign_start = 0;
#----------------------------------------------------------
#读取并处理文件
while(<VFILE>){
	$line = $_;
	if(/\s*\b(input|output|reg|wire)\b/i){
		$line =~ s/^\s+//;
		my @result = ($line =~ /\s*(input|output|reg|wire|(?:output\s+reg))\s*(\[\d+\:\d+\])?\s*((?!reg|wire)\w+)([,;]?)/ig);
		#print length($result[0]),"[email protected]\n";
		if($#result>0){
			$line  = $result[0]." "x(20-length($result[0]));
			$line .= $result[1]." "x(20-length($result[1]));
			$line .= $result[2]." "x(20-length($result[2]));
			$line .= $result[3]."\n";
		}
		$last_line = $_;
	}
	elsif(/(parameter)?\s*(\w+)\s*\=\s*(\d+\‘[hbHB][0-9a-fA-F_]+)\s*([,;]?)/i){
		$line =~ s/^\s+//;
		my @result = ($line =~ /(parameter)?\s*(\w+)\s*\=\s*(\d+\‘[hbHB][0-9a-fA-F_]+)\s*([,;]?)/ig);
		#print $#result."[email protected]\n";
		if($#result>0){
			$line  = $result[0]." "x(20-length($result[0]));
			$line .= $result[1]." "x(35-length($result[1]));
			$line .= "= ".$result[2]." "x(18-length($result[2]));
			$line .= $result[3]."\n";
		}
		$last_line = $_;
	}
	elsif(/\s*\b(module|endmodule|always|assign)\b/i){#匹配到module|always|assign
		$line =~ s/^\s+//;
		if(/\s*\bassign\b\s+\w/i){#匹配到assign
			$line =~ s/\s*\bassign\b\s+(\w)/assign  $1/i;
			$assign_start = 1;
			#print;
		}
		$last_line = $_;
	}
	elsif(/\bbegin\b/i){#匹配到begin
		$begin_cnt++;
		my $tmp_space = $autoindent_space x $begin_cnt;
		$line =~ s/^\s*/$tmp_space/;
		$last_line = $_;
	}
	elsif(/\bend\b/i){#匹配到end
		if($if_cnt>0){
			$if_cnt--;
		}
		my $tmp_space = $autoindent_space x $begin_cnt;
		$begin_cnt--;
		$line =~ s/^\s*/$tmp_space/;
		$last_line = $_;
	}
	elsif(/\bif\s*\(/i){#匹配到if
		$if_cnt++;
		my $tmp_space = $autoindent_space x ($begin_cnt>0?($begin_cnt+1):$begin_cnt);
		$line =~ s/^\s*/$tmp_space/;
		$last_line = $_;
	}
	elsif(/\belse\s*/i){#匹配到else
		my $tmp_space = $autoindent_space x ($begin_cnt>0?($begin_cnt+1):$begin_cnt);
		$line =~ s/^\s*/$tmp_space/;
		$last_line = $_;
	}
	elsif(/^\s*$/){#匹配到空行
		$line = "\n";
	}
	else{
		#print $if_cnt,"--",$_;
		if($assign_start){
			my $tmp_space = $autoindent_space x2;
			$line =~ s/^\s*/$tmp_space/;
			if(/".*;\s*$"/){
				$assign_start = 0;
			}
		}
		elsif($last_line =~ /(\bif\s*\()|(\belse\s*)/){
			$if_cnt--;
			my $tmp_space = $begin_cnt>0 ?  ($begin_cnt+2):$autoindent_space;
			$line =~ s/^\s*/$tmp_space/;
		}
		else{
			my $tmp_space = $begin_cnt>0 ? $autoindent_space x ($begin_cnt+1):"";
			$line =~ s/^\s*/$tmp_space/;
		}
		$last_line = $_;
	}
	$text.=$line;
}

#关闭文件
close VFILE;
select OFILE;
print $text;
close OFILE;
select STDOUT;
print "处理完毕,文件输出到$outfilename\n";
时间: 2024-08-06 07:58:31

Verilog代码自动缩进和对齐Perl脚本的相关文章

vi/vim粘贴代码自动缩进导致全乱了

用vim打开一个空白文档,然后把已经复制的代码给粘贴进来,发现它有自动缩进功能,最终导致粘贴的文本一行比一行靠右,看起来乱成一团.比较快的解决办法是,在粘贴文档前,在命令行模式下,输入 :set noai nosi 然后按'i' 进入编辑模式,再粘贴已经复制的代码内容,这样就不会自动缩进了. 有时候,这样的方法不好用,可以尝试这种: :set paste

最全Pycharm教程(15)——Pycharm编辑器功能之代码自动生成机制

最全Pycharm教程(1)——定制外观 最全Pycharm教程(2)——代码风格 最全Pycharm教程(3)——代码的调试.运行 最全Pycharm教程(4)——有关Python解释器的相关配置 最全Pycharm教程(5)——Python快捷键相关设置 最全Pycharm教程(6)——将Pycharm作为Vim编辑器使用 最全Pycharm教程(7)——虚拟机VM的配置 最全Pycharm教程(8)——Django工程的创建和管理 最全Pycharm教程(9)——创建并运行一个基本的Pyt

vim自动缩进设置

需要软件 vim 下载地址 http://www.vim.org code_complete.vim 插件 http://www.vim.org/scripts/script.php?script_id=1764 ctags 一般安装完vim后都会有,ubuntu中好像是不支持,需要下载. 一 vim 配置 转载Eric的文章,原文出处 http://blog.chinaunix.net/u/22968/showart_432269.html 1.配置文件的位置     在目录 /etc/ 下面

Dev c++中{ }不能自动缩进怎么解决?

问题: Dev c++中{ }不能自动缩进 比如:在 vc 编译器中输入 for() { ......//代码 } //此处会自动缩进 而 Dev 中 for() { .......//代码 } //此括号在这个位置. 最后一个大括号和倒数第2个大括号不对齐(这里显示是齐的),实际情况如下图: 解决办法 打开 Dev-c++ 工具-编译器选项-基本-自动缩进 和 使用tab字符 打上钩 (alt+T+E) 其他选项再改改就好了 原文地址:https://www.cnblogs.com/Geek-

MyBatis代码自动生成

MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件.这样可以省去很多的功夫,将生成的代码copy到项目工程中即可. 使用自动生成有很多方式,可以在eclipse中安装插件,但是以下将要介绍的这种方式我认为很轻松,最简单,不需要装插件,只需要下几个jar包即可,把它们放在一个目录下面. 生成代码需要的文件和ja

简易SDRAM控制器的verilog代码实现

SDRAM是每隔15us进行刷新一次,但是如果当SDRAM需要进行刷新时,而SDRAM正在写数据,这两个操作之间怎么进行协调呢? 需要保证写的数据不能丢失,所以,如果刷新的时间到了,先让写操作把正在写的4个数据(突发长度为4)写完,然后再去进行刷新操作: 而如果在执行读操作也遇到需要刷新的情况,也可以先让数据读完,再去执行刷新操作. 思路:SDRAM控制器包括初始化.读操作.写操作及自动刷新这些操作,给每一个操作写上一个模块独立开来,也便于我们每个模块的调试,显然这种思路是正确的: 虽然都是独立

写的一个perl脚本,用于发送远程MySQL命令

想写一些简化管理操作的脚本,下面是基础脚本之一. 对于一个从来没使用过perl脚本的我来说还是有些难度的,直接上代码. 此脚本用于发送远程MySQL命令并且接收结果,功能比较简单,后面会渐渐完善. #!/usr/bin/perl use Getopt::Long; use DBI; Getopt::Long::GetOptions( 'host|h=s' => \$host, 'user|u=s' => \$user, 'password|pw=s' => \$password, 'po

vim配置文件 高亮+自动缩进+行号+折叠+优化

配置文件是网上找的,我把出错的几个地方改了下 将一下代码copy到 用户目录下 新建文件为  .vimrc保存即可生效: 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份) "========================================================================= " DesCRiption: 适合自己使用的vimrc文件,for Linux/Windows, GUI/Console " "

vim显示行号、语法高亮、自动缩进的设置

在UBUNTU中vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc 在Fedora中vim的配置文件存放在/etc目录中,配置文件名为vimrc 在Red Hat Linux 中vim的配置文件存放在/etc目录中,配置文件名为vimrc set nocompatible                 "去掉有关vi一致性模式,避免以前版本的bug和局限     set nu!                                    "显示行号 set